window响应拖拽文件操作

window响应拖拽文件操作


1.首先调用DragAcceptFiles,让控件或者窗体支持文件拖动操作
函数功能:用来为拖放文件作初始化。
函数原型:

void DragAcceptFiles(
    HWND hWnd,      //指明目标窗体的句柄
    BOOL fAccept    //为True时 则hWnd所指向的窗体可以接受拖放的文件. 
);

2.消息事件中响应拖拽操作(WM_DROPFILES), 调用函数DragQueryFile和DragFinish
[1].DragQueryFile
函数功能:用来查下拖放文件的文件名。
函数原型:

UINT DragQueryFile(
    HOROD hDrop,
    UINT iFile,
    LPTSTR lpszFile,
    UINT cch,
);

参数说明:函数其本身的返回值是一个无符号整数;
hDrop是一个文件名缓冲区句柄(存放所拖放文件名称的数据结构),需要从windows消息WM_DROPFILES中获得;
iFile指明查询文件序号,取值0xFFFFFFFF时,函数返回值为所拖放文件数目,其他取值(0~文件拖放总数),对应文件名存放lpszFile缓冲区;
lpszFile取值为NULL时,函数返回对应文件名的长度;
cch决定缓冲区的长度;
[2].DragFinish

void DragFinish(HDROP hDrop)

使用DragFinish函数告诉windows拖放操作结束,使其释放文件名缓冲区,参数hDrop与DragQueryFiles函数中一样,也由windows消息WM_DROPFILES中获得;

3.例子:

LRESULT CALLBACK CWinEventsWin32::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    //......;    //代码省略
    switch (uMsg)
    {
        case WM_CREATE:
            //......;    //代码省略
            DragAcceptFiles(hWnd, TRUE);//接受拖放事件设置
            break;

        case WM_DROPFILES:
            {
                HDROP hdrop = (HDROP)wParam;
                char sDropFilePath[MAX_PATH+1];
                int iDropFileNums = 0;
                iDropFileNums = DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0);//获取拖放文件个数
                for (int i=0; i<iDropFileNums; i++)//分别获取拖放文件名(针对多个文件操作)
                {    
                    DragQueryFile(hdrop, i, sDropFilePath, sizeof(sDropFilePath));    
                }

                //DragQueryFile(hdrop, 0, sDropFilePath, MAX_PATH);//分别获取拖放文件名(针对单个文件操作)    
                DragFinish(hdrop);//释放文件名缓冲区    
            }
            break;
        default:
            break;    
    }
    //......;    //代码省略
}
原文地址:https://www.cnblogs.com/sz-leez/p/4216638.html