0xAA55 发表于 2015-1-18 00:01:09

【Win界面】让自己的窗口可以被拖入文件

拖拽是一个不错的功能,只是好像大家都不怎么用这个功能,顶多是拷贝文件的时候,在资源管理器里面拖动文件。
然而如果自己的程序也支持拖拽那就更方便了,打开文件的时候不必在“公用文件对话框”找半天,直接从资源管理器拖进来就OK了。
这是怎么实现的呢?首先我们需要调用DragAcceptFiles使自己的程序接受拖拽文件。
DragAcceptFiles(hWnd,TRUE);
之后窗口(或者控件)就可以被拖入文件了。拖入文件的消息是WM_DROPFILES,参数是(HDROP)wParam。
我们这里需要知道三个函数:DragQueryPoint,DragQueryFile,DragFinish。
调用DragQueryPoint可以取得拖入的时候鼠标的位置。DragQueryFile用于取得拖入的文件的数量、文件路径等信息。处理完以后,要调用DragFinish将HDROP释放掉。
DragQueryPoint原型:BOOL DragQueryPoint(
        HDROP hDrop,
        LPPOINT lppt
);可以看出DragQueryPoint的用法十分简单,定义一个POINT,然后传入指针,就能从POINT结构体取得拖入的鼠标位置。POINT pt;
DragQueryPoint((HDROP)wParam,&pt);让后就是稍微复杂的DragQueryFile。它的原型:UINT DragQueryFile(
        HDROP hDrop,
        UINT iFile,
        LPTSTR lpszFile,
        UINT cch
);其实也不复杂。它有三个功能:
1、取得拖入的文件的数量。
2、取得拖入的文件的文件路径的长度。
3、取得拖入的文件的文件路径。
如果要取得拖入的文件的数量,只需要调用DragQueryFile((HDROP)wParam,0xFFFFFFFF,NULL,0);,它就会返回拖入的文件的数量。
文件的索引是从0开始的,它的第二个参数不为零的时候是取得文件路径。你可以事先分配好固定长度的缓冲区,也可以实时分配能装下任意长度文件路径的缓冲区。
你可以这么用:TCHAR szFileName;//假定文件路径长度不超过256字节
DragQueryFile((HDROP)wParam,文件索引,szFileName,sizeof(szFileName));也可以TCHAR*pszFileName;
size_t cbFileName;
cbFileName=DragQueryFile((HDROP)wParam,文件索引,NULL,0);//取得文件路径长度
pszFileName=(TCHAR*)malloc(cbFileName);//分配内存
DragQueryFile((HDROP)wParam,文件索引,pszFileName,cbFileName);其实后者更占内存。
页: [1]
查看完整版本: 【Win界面】让自己的窗口可以被拖入文件