界面:CDialog,上面有CTreeCtrl,和若干其他控件操作:将CTreeCtrl中的节点拖动到另一个控件中,中间可能经过其他的控件,对话框本身,甚至窗口外说明:CTreeCtrl中节点代表的意义不同,那么,点击右键时弹出菜单不同,拖动到另一个特定控件时,事件不同,其他控件不接受此拖动
好了,对于这么一个程序,我做了如下的事情:搜到几篇文章,我要先弄明白拖动节点时,节点图标跟随的一系列动作(目前唯一不明白的是:如果CTreeCtrl的节点没有图标,我只想拖动文字,该怎么办);然后派生CTreeCtrl,重载鼠标消息,写代码,调试……结果:当经过非CTreeCtrl控件的时候(对话框,其他控件,窗口外),图标停在了CTreeCtrl的边缘,不再移动;于是,我重载了CDialog的OnMouseMove消息,调用树的OnMouseMove函数,问题暂时解决;然后立刻想到,其他控件的消息我都要照顾吗,似乎不用,使用SetCapture,ReleaseCapture可以吗?嗯,似乎可以了;此时,我需要给树的节点加入一些不同的属性,使它们代表不同的事物。我看到了成员函数CTreeCtrl::SetItemData,其中一个参数是DWORD_PTR类型;这是我困惑的地方,我该怎么做?1.写一个结构或一个类,里面包含菜单ID,图标ID,其他的属性,然后把实例地址转化成长整数Set进去,用的时候再转回来,程序结束时搜索并销毁;
2.……我也想不出其他的办法,HTREEITEM我似乎没法动了,可是办法1不知道为什么就是觉得不爽;似乎看到过一个属性,可以使得节点附带一些数据,可是又找不到了,不知道是不是就是那个CTreeCtrl::SetItemData,综上,我发现我其实需要一个Tree的Item的“再封装”,不知道是否可以……
然后又发现,使用了SetCapture,ReleaseCapture后,松开鼠标的消息回到了树控件本身,那么此时,想在另一个控件中做动作,就只有靠发消息了吧……发给对话框,对话框根据消息的参数来做剩下的事情?应该是这样吧(汗……已经晕了)……暂时先这么做着;我在资源中加入菜单,加入菜单项,给菜单项加入事件handler(通过向导,加在对话框类中,只有一个CXXXDlg),在树控件的右键函数中LoadMenu,GetSubMenu,TrackPopupMenu,设置响应鼠标键……调试,没反应……再看:ON_COMMAND( ID_MENUID, OnFunc ),看来这个消息不会传到Dlg中了(会吗?)……我现在只好在树派生类中得到菜单项ID然后处理,是不是弹出菜单都是这么用的,有点难看呀……问了三个问题,写的有点乱。我其实想把树控件当成一个面板,这个面板会展示一些东西,这个面板还会接受用户的操作,发送消息,只是在细节上很多东西没有掌握,上述都是主动发送消息,那么控件就或多或少的需要知道其他的类信息,至少知道要发送给谁吧。如果让Dlg来“监视”控件的状态,就是Observer,在这样没有规模的小程序中似乎又不值得,真是有点两难。没有经验啊,还希望大家不吝赐教,谢谢!