Win32 Drag-and-Drop简介

Drag-and-Drop(常译为“拖放”)是GUI应用程序的常见功能,Windows下用的很普遍,现在Web页面通过挖掘Javascript也实现了拖放,Linux GTK虽然也有自己的Drag-and-Drop协议,但几乎见不到支持拖放的软件。

在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消息,在VCL或MFC中建立消息映射可以用BEGIN_MESSAGE_MAP宏。此外,你必须在程序的主逻辑中调用DragAcceptFiles函数,向系统注册此窗口是否接受拖放。

然后,在你的WM_DROPFILES消息处理函数中,使用DragQeuryFile和DragQueryPoint获取拖放的文件名和鼠标释放点,并调用DragFinish表示已处理完拖放事件。这样,你的程序就具备了Drag-and-Drop能力了。

过程很简单,例子就省略了,不会的话再baidu一下。

参考资料:
    看看MSDN,没有MSDN的话看以前的Win32 SDK帮助文档也可以。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值