wxWidgets的drag和drop

在两个不同窗口之间的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()中送入的参数,因此事实上刚才的只是个美丽的设想。不能实现。






你可能感兴趣的:(wxWidgets的drag和drop)