+ -
当前位置:首页 → 问答吧 → 重新设置CTreeCtrl控件的父窗口后,无法获取该树控件的消息事件

重新设置CTreeCtrl控件的父窗口后,无法获取该树控件的消息事件

时间:2011-11-30

来源:互联网

源码简介:
1. 在Dialog1的OnInitDialog函数中,调用Create创建一个CTreeCtrl全局对象g_treeCtrl,设置其不可见,并指定其父窗口为this(即Dialog1)。之后,向g_treeCtrl插入根、叶结点...。

2. 在Dialog1上点击一个按钮,弹出Dialog2对话框。

3. 在Dialog2的OnInitDialog函数中,调用g_treeCtrl.Setparent(this),重新设置其父窗口,并设置WS_VISIBLE,使其可显示。

4. 为在Dialog2中响应g_treeCtrl控件的TVN_SELCHANGED消息,增加如下代码:
ON_NOTIFY(TVN_SELCHANGED, 0x1234,OnTreeSelChanged)// 说明:0x1234是其ID号,在Dialog1中,创建g_treeCtrl时用的
  // ID号就是0x1234。

结果:
当改变树的根节点时,并没有进入OnTreeSelChanged函数中。请问为什么?

作者: zhouxiangbai   发布时间: 2011-11-30

为啥不再dlg2中建立tree控件,为啥要这样做。。自己找麻烦。。

tree的父窗口还是dlg1。。。。。

作者: shen_wei   发布时间: 2011-11-30

引用 1 楼 shen_wei 的回复:
为啥不再dlg2中建立tree控件,为啥要这样做。。自己找麻烦。。

tree的父窗口还是dlg1。。。。。


谢谢您的回复!

确实,tree的父窗口还是dlg1,在dlg1的消息映射中能够捕获tree消息.我这么做,主要是如下考虑:
1. dlg1是主界面窗口,dlg2是弹出的一个子窗口.
2. tree需要加载的数据量很大,比较耗时.而且tree加载数据之前,好像必须被创建(即Create),并指定父窗口,否则加载数据时程序会崩溃.
3. 若是在dlg2中创建tree的话,岂不是每次都要重新加载tree数据?我觉得太耗时了,不合理.所以,想在dlg1中就先创建它,并把数据加载好,然后,在dlg2中显示即可.

作者: zhouxiangbai   发布时间: 2011-12-01

该回复于2011-12-01 10:46:16被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#4楼 得分:0回复于:2011-12-01 11:31:25
http://support.microsoft.com/kb/104069/zh-cn
SetParent并不能改变这些通知消息的接收窗口,需要旧父窗口转送消息到新窗口,或者依你需求做其他工作。

作者: allen_lanyuhai   发布时间: 2011-12-01