一 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();
}