4.VC(ui)-拖动效果的一个实现方案

    对于熟悉拖动效果制作的朋友们都应该知道,实现拖动有一个很简单的方法就是通过CImageList。CImageList提供了BeginDrag、DragEnter、DragMove、DragLeave、EndDrag系列函数,分别在OnLButtonDown、OnMouseMove和OnLButtonUp等消息中合理调用这些函数就可以轻松实现对CImageList的元素的拖动效果。那么我们要做的就是构造一个CImageList,使它的元素是我们想要拖动的图片,这样就大功告成了。那怎样获取图像呢?答案也很简单,就是到被拖动的对象的DC中将所要拖动的区域拷贝到一个内存位图中即可。具体到我的这个例子,我是这样实现的:

      在OnLButtonDown中判断鼠标是否在控件范围内,如果在就将控件范围内的DC内容拷贝到内存位图中,然后创建CImageList将包含有控件内容的位图添加进CImageList作为其元素,接着通过这个ImageList实现拖动。具体代码如下:

  这里我说明两个问题: 一是BeginDrag(0, m_ptOffset);的m_ptOffset参数,BeginDrag函数很容易理解了,就是进入拖动状态,而m_ptOffset参数是拖动时鼠标相对于拖动图标的偏移,注意是相对偏移。大家可以自己改一下这个参数,比如改成CPoint(0, 0)来感受一下这个设置的作用。二是DragEnter(NULL, ptPut);的ptPut这个参数指定了初始拖动时图标出现的位置,这里注意这个位置不是图标左上角的位置,而是左上角加上偏移后的位置。这个位置应用的也不是相对坐标或客户区坐标,而是屏幕坐标。

      接下来是移动的处理,其实很简单就是一个DragMove函数。他有一个参数,也是一个点,意义和DragEnter的ptPut参数相似。例子中我限制了图标不能超出窗口范围,也是通过修改这个参数实现的。理论上我们可以拖着图标在屏幕范围内任意移动,不过结合这个例子如果在窗口范围以外释放鼠标那控件就找不到了,所以我做了限制,同时也可以更好的理解m_ptMove参数的意义。具体实现可以参考以下代码。

   好了,现在就剩结束拖动状态的相关操作了,这部分就比较简单了,我代码中还加了一些容错判断和移动控件的操作,大家注意提取有效信息。

到此拖动效果就实现了,最后再说一点,例子中有关于鼠标捕获和释放的操作,目的是为了当鼠标离开窗口范围仍然可以响应,而且针对窗口有可能被其它程序抢夺焦点的情况,例程中专门处理了OnActivate消息,具体实现可以参考示例源码,就不在这里赘述了。应该说通过CImageList实现拖动操作是十分方便的,而且效果也很好。据说VS2008下的CImageList还支持PNG,那样就可以做出更炫的拖动效果了。

 =====>源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值