扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝

2016-01-29 11:50 35 1 收藏

扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝,扩展COleDropTarget类来支持任意窗口拖放 - 作者:王加宝

【 tulaoshi.com - C语言心得技巧 】


扩展COleDropTarget类来支持任意窗口拖放

作者:沈阳市热电厂汽机分场 - 王加宝

  本文详细论述了拖放的基本原理并提供一个支持窗口拖放的普遍类COleDropTargetEx,任何需要提供拖放的窗口包含此类后,将响应拖放消息函数加入,便可接收拖放。此类利用Windows消息来支持拖放,机制不同于COleDropTarget类与CView类那种直接的搭配关系,因此较以往的拖放方法简便、灵活,代码重用性非常好。

本文示例工程 19.1K


这是本文示例代码的运行效果图

一、拖放原理及MFC类库对拖放的支持

拖放(Drag and Drop)是OLE的一部分,是指对某一指定的对象,利用鼠标拖动的方法,在不同应用的窗口之间、同一应用的不同窗口之间或同一应用的同一窗口内进行移动、复制(粘贴)等操作的技术。
MFC为实现对象拖放提供了如下类:COleDataSource、COleDropSource、COleDropTarget、COleDataObject。对于上述几个类的用法,读者可参考有关资料。因拖放操作中的启动拖放部分,实现较模式化,很多文献都有详细的实现,本文在此不再赘述。这里着重说明MFC拖放操作中接收部分的实现原理,以使读者了解为何要扩展MFC拖放类的功能。

MFC通过提供COleDropTarget和CView类来支持拖放操作的接收。在CView及其继承类中创建COleDropTarget类对象,并在视图窗口初始化时,调用其成员函数Register(),以此在系统中注册该视图窗口为拖放接收窗口。当进行拖放操作的鼠标指针处于视图窗口范围内时,COleDropTarge类的OnDragEnter、OnDragOver、OnDropEx、OnDrop等成员函数被依次调用,这些函数默认调用与其相对应的CView类成员函数OnDragEnter、OnDragOver、OnDropEx、OnDrop等,在这些CView类成员函数中,用户可对拖动的过程及结果进行控制。但MFC这种内在的对拖放的实现是很不够的,一个用户界面友好的应用程序,很多时候要求不仅视图窗口支持拖放,而且对话框以及编辑框等控制窗口也需要拖放的支持。虽然现在已经有一些拖放目标类的扩展类了,但通常都是需要按照CView类对拖放的实现模式来实现这些窗口类,再在COleDropTarge继承类的响应拖放函数中利用RTTI(Run-time type information)来调用这些特定的窗口类拖放响应函数。而利用RTTI机制不可避免地会使拖放类只支持特定的窗口类,如果要增加新的可支持拖放的窗口类,则必须改写已实现的COleDropTarge继承类,这种情况是我们所不愿看到的。如果直接在COleDropTarge继承类中处理拖放呢?显然,只会造就一个针对性更强的类。针对这种情况,需要运用其它方式来支持无类型要求的窗口类拖放操作。

二、拖放扩展类运行原理

我们知道,使用消息是可以传递信息的。对于复杂的结构,可以通过在消息参数中传递结构的指针来传递结构信息。因此,在COleDropTarge扩展类响应拖放成员函数中,将拖放信息打包,存入拖放信息类中,向注册了拖放功能的控制窗口发送用户自定义消息,并传递拖放信息类地址。在窗口类中,映射该自定义消息到消息响应函数中,在该函数中,将消息参数转换回拖放信息类指针,以此来获得拖放信息,进行相应操作后,返回对拖放操作的控制信息。这样,经过将MFC对拖放操作的函数调用转化为类型无关的对窗口的消息发送,扩展的拖放目标类便具有了与拖放窗口类无关的特性,而且这种消息机制符合程序编写习惯。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

三、实例实现

下面我们通过一个程序实例来说明该扩展类的使用。在这个实例中演示几个通过嵌入COleDropTargetEx类方便的获得了拖放能力的控件,这里只介绍支持拖放的编辑控件的编程过程,其它控件过程类似。
利用AppWizard新建一工程"DropExDemo",选择基于对话框的应用,其它可取默认值。
将本文附录中拖放目标扩展类COleDropTargetEx的头文件与实现文件添加到工程中。
为了实现支持拖动的编辑框控制,从CEdit继承一新类CDropEdit。
添加如下成员变量与成员函数到CDropEdit类声明中并在文件首包含COleDropTargetEx类的头文件。

public:virtual BOOL Register();  // Generated message map functionsprotected:        COleDropTargetEx m_dropEx;virtual BOOL OnDrop(WPARAM pDropInfoClass, LPARAM lParm);        virtual DROPEFFECT OnDropEx(WPARAM pDropInfoClass, LPARAM lParm);        virtual DROPEFFECT OnDragOver(WPARAM pDropInfoClass,LPARAM lParm);在实现文件中添加消息映射如下:
                        

来源:https://www.tulaoshi.com/n/20160129/1483557.html

延伸阅读
支持换肤功能的窗口实例 译者:李不言 原文来源:codeproject 下载本文示例代码 这个例子展示了如何绘制定制(自绘)窗口框架(包括标题、边框等)。 一、前言 如今,支持定制皮肤功能的软件越来越流行。这样用户就可以自己修改程序的外观。甚至Windows...
标签: 电脑入门
如果您手边有一个高速U 盘,那么恭喜您!通过全新的Windows ReadyBoost 技术,就可以用它来扩展您的系统内存真是一个随需应变的电脑性能提升之道啊! 1) 鉴别 请参阅您的U 盘说明书或者外包装,一般都会标明是否为 高速U 盘或者是否支持ReadyBoost 技术;此外还要保证U 盘至少还有256M 以上的空间只有这样,才能实现这个功能。之后将您的U 盘插...
iPhone为什么不支持SD卡扩展?   对于iPhone而言,16GB与64GB两个版本之间的价格差距仿佛是一条跨不过去的鸿沟。 16GB的iPhone存储真的不够用有木有?为什么打死iPhone都不上存储拓展呢?真的是单纯为了设计考虑的吗? 经常看见现在有什么iPhone存储拓展套,把手机包裹的那么严实还其貌不扬,一个SD卡就能解决的事情为什么就这...
使用VC6.0实现窗口的任意分割 南京邮政局计算机中心 张中庆 一、关于CSplitterWnd类 我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割。 那么我们自己如何创建类似的界面,也实现窗口的任意的分...
标签: flash教程
FLASH时钟类 clock.as 功能:自动控制时.分.秒针围绕 演示两个FLASH时钟,引用的是同一个clock.as(界面做得随便了.重要的是as) clock.as源码分析: 这个不是扩展类.而是一个自定义类.通过自定一个DATE对象.再利用DATE对象本身的方法 求值后.通过自定义对象返回想要的值.就成了一个公共类.让MC或文本框等FLASH元素直接 调用. class...

经验教程

653

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部