現(xiàn)在有很多軟件都支持拖拽功能,就是用鼠標拖著文件放到軟件窗口中某個位置,軟件就可以做出相應(yīng)的反應(yīng)。比如,Windows自帶的播放軟件Windows Media Player,你可以拖著一個媒體文件放到它的主窗口中,它就會開始播放這個文件。 怎么讓自己的軟件也有這個功能呢? 其實,并不是很難,只要讓你需要有拖拽功能的控件響應(yīng)WM_DROPFILES消息就行了。下面以Edit控件和ListBox控件為例子來說明。 首先,從CEdit繼承,自定義一個Edit控件。在頭文件添加如下的消息響應(yīng)函數(shù): - afx_msg void OnDropFiles(HDROP hDropInfo);
然后,在cpp文件中的消息映射中添加: - ON_WM_DROPFILES()
最后,在cpp文件中添加OnDropFiles函數(shù)的實現(xiàn),對拖拽的文件進行處理。下面是完整的代碼: -
-
- class ClxEdit : public CEdit
- {
- DECLARE_DYNAMIC(ClxEdit)
-
- public:
- ClxEdit();
- virtual ~ClxEdit();
-
- afx_msg void OnDropFiles(HDROP hDropInfo);
-
- protected:
- DECLARE_MESSAGE_MAP()
- };
-
-
-
- #include "stdafx.h"
- #include "lxEdit.h"
-
- IMPLEMENT_DYNAMIC(ClxEdit, CEdit)
- ClxEdit::ClxEdit()
- { }
-
- ClxEdit::~ClxEdit()
- { }
-
- BEGIN_MESSAGE_MAP(ClxEdit, CEdit)
- ON_WM_DROPFILES()
- END_MESSAGE_MAP()
-
- void ClxEdit::OnDropFiles(HDROP hDropInfo)
- {
-
- char szFileName[MAX_PATH + 1];
-
- DragQueryFile(hDropInfo, 0, szFileName, MAX_PATH);
-
- SetWindowText(szFileName);
-
- CEdit::OnDropFiles(hDropInfo);
- }
-
- //可以看到,在上面的代碼中,得到拖拽文件名的是函數(shù)DragQueryFile。這是Windows提供的一個API函數(shù),
- //用來得到一次成功的拖拽操作中的文件名。下面是該函數(shù)的原型:
-
-
-
-
-
-
-
-
- UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);
-
- //從上面對函數(shù)參數(shù)的說明可以看出,該函數(shù)支持一次多選多個文件。就像Windows Media Player一樣,
- //一次多選好幾個文件拖拽到它的窗口中,它就會按順序播放文件。下面我就用一個有拖拽功能的ListBox
- //為例,說明怎么處理一次拖拽多個文件。
-
-
- class ClxListBox : public CListBox
- {
- DECLARE_DYNAMIC(ClxListBox)
-
- public:
- ClxListBox();
- virtual ~ClxListBox();
-
- afx_msg void OnDropFiles(HDROP hDropInfo);
-
- protected:
- DECLARE_MESSAGE_MAP()
- };
-
-
-
- #include "stdafx.h"
- #include "lxListBox.h"
-
- IMPLEMENT_DYNAMIC(ClxListBox, CListBox)
- ClxListBox::ClxListBox()
- { }
-
- ClxListBox::~ClxListBox()
- { }
-
- BEGIN_MESSAGE_MAP(ClxListBox, CListBox)
- ON_WM_DROPFILES()
- END_MESSAGE_MAP()
-
- void ClxListBox::OnDropFiles(HDROP hDropInfo)
- {
- char szFileName[MAX_PATH];
- int iFileNumber;
-
-
- iFileNumber = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
- for (int i = 0; i < iFileNumber; i++)
- {
-
- DragQueryFile(hDropInfo, i, szFileName, MAX_PATH);
-
- if (FindString(0, szFileName) != LB_ERR)
- continue;
-
-
- AddString(szFileName);
- }
-
- CListBox::OnDropFiles(hDropInfo);
- }
補充一下,函數(shù)DragQueryFile得到的文件名,是帶完整路徑的文件名。 最后,提醒一下:要想你的控件具有拖拽功能,一定要把它的Accept Files屬性設(shè)置為True!要不,上面寫的那些代碼是不起作用的! |