前提是窗口继承wxTreeCtrl,
1, 在类的声明的结束部分的前面,加入
DECLARE_EVENT_TABLE()
来指示代码这个类需要消息路由。
2, 给自己的窗口一个ID,头文件中加入
enum
{
TreeControlId = 3265;
};
3,类的实现文件中,加入消息映射的具体表格
BEGIN_EVENT_TABLE(myTree, wxTreeCtrl)
EVT_TREE_BEGIN_DRAG(TreeControlId, myTree::OnBeginDrag) EVT_TREE_END_DRAG(TreeControlID, myTree::OnEndDrag)
END_EVENT_TABLE()
上面的路由指示窗口,遇到在窗口ID为"TreeControlId"中发生DRAG事件,请call我的OnBeginDrag() 和OnEndDrag()。
4、实现上面的两个函数。
5、在创建窗口的时候,初始化的时候调用父类wxTreeCtrl()的构造, 把TreeControlId这个ID送入,指示自己的这个窗口的id必须是我们预定义的,否则消息路由无法正确递送。
上面是让树能支持drag的最少的步骤,一个不能缺。特别是创建窗口的过程中的id,不能用缺省的那个wxID_ANY。
注:
窗口上如果从鼠标消息截取入手的话,有OnMouseEvent(), EVT_MOUSE_EVENTS这样的入口可以截取,系统传入的参数可以判断
event.LeftDown(), event.LeftUp(), event.Dragging()。这种方法自由度更高,但也更费劲。