Drag-and-Drop(常译为“拖放”)是GUI应用程序的常见功能,Windows下用的很普遍,现在Web页面通过挖掘Javascript也实现了拖放,Linux GTK虽然也有自己的Drag-and-Drop协议,但几乎见不到支持拖放的软件。
在Windows文件浏览器中,把一个文件图标拖到一个可执行文件的图标上,会启动这个可执行文件并把被拖动的文件名作为命令行参数传递给它,我们讨论的不是这种拖放,而是把一个或一些文件图标从文件浏览器中拖到一个前台窗口中,比如把一个视频文件拖到暴风影音主窗口就可以播放此视频,后者需要应用程序和shell做进程间通信,且应用程序必须具备处理一种特殊消息WM_DROPFILES的能力。
使用Win32 API可以轻易地在自己的GUI程序中加入拖放支持。你需要了解这样几个函数
然后,在你的WM_DROPFILES消息处理函数中,使用DragQeuryFile和DragQueryPoint获取拖放的文件名和鼠标释放点,并调用DragFinish表示已处理完拖放事件。这样,你的程序就具备了Drag-and-Drop能力了。
过程很简单,例子就省略了,不会的话再baidu一下。
参考资料:
看看MSDN,没有MSDN的话看以前的Win32 SDK帮助文档也可以。
在Windows文件浏览器中,把一个文件图标拖到一个可执行文件的图标上,会启动这个可执行文件并把被拖动的文件名作为命令行参数传递给它,我们讨论的不是这种拖放,而是把一个或一些文件图标从文件浏览器中拖到一个前台窗口中,比如把一个视频文件拖到暴风影音主窗口就可以播放此视频,后者需要应用程序和shell做进程间通信,且应用程序必须具备处理一种特殊消息WM_DROPFILES的能力。
使用Win32 API可以轻易地在自己的GUI程序中加入拖放支持。你需要了解这样几个函数
- DragAcceptFiles
函数原型:VOID DragAcceptFiles(HWND hWnd, BOOL fAccept);
此函数告诉Windows窗口hWnd是否接受从shell拖放过来的文件,fAccept=TRUE表示接受拖放。
这意味着窗口hWnd必须能够处理WM_DROPFILES消息。 - DragFinish
函数原型:VOID DragFinish(HDROP hDrop);
在Drag-and-Drop过程完成时调用,从而允许shell释放为传递文件名而开辟的内存空间。
hDrop是WM_DROPFILES消息的WParam参数。 - DragQueryFile 函数原型:UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);
此函数用来获取拖放的文件名。hDrop是WM_DROPFILES消息的WParam参数,lpszFile是用于容纳文件名的缓冲区,cch是该缓冲区的大小。设置iFile=0xFFFFFFFF的话,此函数返回拖放的文件总数,记为count。设置iFile为区间[0, count)之间的任一整数就可以在lpszFile中得到序号为iFile的文件名,这个序号和用户在shell中点选文件图标的顺序有关。 - DragQueryPoint 函数原型:BOOL DragQueryPoint(HDROP hDrop, LPPOINT lppt);
此函数用来检索拖放时鼠标释放点的坐标,lppt是用来容纳鼠标坐标的结构。
这个函数用的不多,除非你对鼠标释放点非常感兴趣。
然后,在你的WM_DROPFILES消息处理函数中,使用DragQeuryFile和DragQueryPoint获取拖放的文件名和鼠标释放点,并调用DragFinish表示已处理完拖放事件。这样,你的程序就具备了Drag-and-Drop能力了。
过程很简单,例子就省略了,不会的话再baidu一下。
参考资料:
看看MSDN,没有MSDN的话看以前的Win32 SDK帮助文档也可以。