五.ole拖放实现
因为coledroptarget默认只对cview提供支持,所以如果要让其他的窗口支持拖放,我们必须同时对要支持拖放的窗口类与coledroptarget类进行派生.把对拖放操作具体进行处理的代码封装成派生窗口类的成员函数,然后重载coledroptarget中对应的五个虚函数,当它接收到拖放动作时,调用窗口派生类的处理函数即可.但这里有一个问题,就是我们怎么知道何时调用派生类的处理函数呢?答案是运用rtti技术.如果coledroptarget派生类收到的窗口指针类型,就是我们派生的窗口类,那么就调用它的处理函数,否则调用基类进行处理. 【程序编程相关:路由模拟——路由算法1的实现(路由基因类】 mfc本身的cview类是支持拖放操作的,通过研究cview类的源码,大体知道它的实现原理是这样的:cview类中有一个coledroptarget类的对象,在视图窗口初始化时,调用coledroptarget类成员函数register(),以此在系统中注册该视图窗口为拖放接收窗口.当进行拖放操作的鼠标指针处于视图窗口范围内时,coledroptarge类会做出反应,它的ondragenter.ondragover.ondropex.ondrop等成员函数被依次调用,这些函数默认均是调用与其相对应的cview类成员函数ondragenter.ondragover.ondropex.ondrop等,程序员只需重载这些cview类成员函数,即可对拖动的过程及结果进行控制. 【推荐阅读:路由模拟——路由算法1的实现(结点集合类】 第一个类名为clistctrlex,父类为clistctrl.添加完毕后,在clistctrlex的定义头文件中加入declare_dynamic(clistctrlex),在其实现文件中加入implement_dynamic(clistctrlex,clistctrl),这样就对clistctrlex类添加了rtti运行期类型识别(run time type information)支持. 【扩展信息:路由模拟——路由算法1的实现(路由计算类】 首先生成一个对话框工程,添加二个新类. 第二个类名为coledroptargetex,父类为coledatatarget. 在clistctrlex中添加coledroptargetex类的对象,并添加下列公有虚函数的声明: virtual bool initialize(); virtual dropeffect ondragover(cwnd* pwnd, coledataobject* pdataobject, dword dwkeystate, cpoint point); virtual dropeffect ondropex(cwnd* pwnd, coledataobject* pdataobject, dropeffect dropeffect, dropeffect droplist, cpoint point); virtual bool ondrop(cwnd* pwnd, coledataobject* pdataobject, dropeffect dropeffect, cpoint point); virtual void ondragleave(cwnd* pwnd);... 下一页