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

}

猜你喜欢

转载自blog.csdn.net/thanklife/article/details/83743235