VC支援檔案拖拽功能函式:DragAcceptFiles,DragQueryFile和DragFinish
一 VC支援檔案拖拽功能的三個函式:DragAcceptFiles,DragQueryFile和DragFinish。
1.DragAcceptFiles 確定視窗是否接收檔案拖拽。
void DragAcceptFiles(HWND hWnd,BOOL fAccept);
hWnd:接收檔案拖拽功能的視窗控制代碼。
fAccept:為TRUE則接收檔案拖拽,為FALSE不再接收。
對話方塊,可以右擊--Properties->Extended Styles,勾選Accept files,從而加上 EXSTYLE WS_EX_ACCEPTFILES 。
2.DragQueryFile 獲得拖拽後的檔名稱列表。
UINT DragQueryFile(HDROP hDrop,UINT iFile,LPTSTR lpszFile,UINT nLen);
hDrop:HDROP識別符號,即系統響應函式WindowProc中的wParam引數
iFile:從0開始的檔案索引號。如果該引數為0xFFFFFFFF,則返回拖拽的檔案個數。
lpszFile:用於存放檔名的緩衝區地址
nLen:緩衝區長度
函式返回值:若iFile為0xFFFFFFFF返回拖拽的檔案個數,否則返回相應索引號的檔名長度。
3. DragFinish 釋放系統為拖拽功能處理檔名稱而分配的記憶體。
void DragFinish(HDROP hDrop);
二 在對話方塊中,簡單地類嚮導為其加入WindowProc即可實現
LRESULT CDragFileDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
//1 檔案拖拽 允許,可放在初始化中
DragAcceptFiles(TRUE);
return 0;
//2 檔案拖拽個數,對應的檔名
case WM_DROPFILES:
HDROP hDrop = (HDROP)wParam;
//2.1 引數0xFFFFFFFF ,將獲得拖拽檔案個數
UINT nFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
char strFileName[MAX_PATH];
for (int i = 0; i < nFileNum; i++)
{
//2.2 引數 i ,將獲得拖拽的第i個檔名
DragQueryFile(hDrop, i, strFileName, MAX_PATH);
//a 可將獲得的檔名稱,放入ListBox中
m_listbox.AddString(strFileName);
//b 也可將獲得的檔名稱,放入vector中
vetFileNames.push_back(strFileName);
}
m_listbox.UpdateWindow();//重新整理ListBox
//3 釋放拖拽的hDrop
DragFinish(hDrop);
return 0;
}
return CDialog::WindowProc(message, wParam, lParam);
}
三 對於vector 方式儲存檔名稱的還需要
1 需要的標頭檔案
#include 《vector》
#include 《cstring》
using namespace std;
vector《string》 vetFileNames;
2 在需要的地方,彈出需要的檔名稱
CString str;
vector《string》::iterator pos;
//在需要的地方,顯示拖拽的檔名
for (pos = vetFileNames.begin(); pos != vetFileNames.end(); pos++)
{
str=pos->c_str();
}