在两个不同窗口之间的drag和drop,或者是从应用程序外面传进来的drop(如从某个文件夹拖入文件到应用程序的窗口中),需要下面的知识:
接收drop的窗口:
1、接受drop的窗口在初始化的时候用SetDropTarget()方法来说明自己接受某类物体的drop;
2、SetDropTarget()的参数是一个wxDropTarget的子类,常用的有wxTextDropTarget、wxFileDropTarget,都必须包含dnd.h;
3、如果自己从wxDropTarget派生子类,可以重载OnData()来过滤自己喜欢的信息;
注意:
SetDropTarget()必须在窗口创建后再调用,如果发现按照文中的步骤做了,但是drap到目标窗口的时候,依然不能正常drop,首先需要查的就是这一点。
产生drag的窗口:
1、建立(new)一个DropSource,在wxWidgets中,就是“wxDropSource”。这个源包含了drag的信息。
2、然后程序可以用类似wxDropSource.DoDragDrop()的方式执行这个drag过程。
内部原理:
如果在释放鼠标左键的时候,window内部会检查当前鼠标在的窗口是否是一个DropTarget(),是就会调用上面的参数中的OnData()。
上面一段也说明了drag的信息,drop的源就是drag产生出的Drop source。
陷阱:
貌似最简便的方式是利用C++的继承能力,从wxTextDropTarget等继承。只要3步:
1、继承 wxTextDropTarget;
2、声明和实现父类的虚函数;
3、在创建窗口的时候,用SetDropTarget(this)设置自己成为一个接受相关drop的目标。
这样,一个对应的源,就可以被拖到我们现在的窗口了。
问题在于,wxWidgets会在某个析构的函数里面试图删除SetDropTarget()中送入的参数,因此事实上刚才的只是个美丽的设想。不能实现。