问题描叙:
    我用VC编写一个SDI单文档视图程序,程序界面类似于Windows资源管理器那样的框架,不过左边部分我是用的CControlBar控件内嵌CTreeCtrl代替了一般常用的CTreeView视图。
但我在消息响应方面遇到了问题,请问怎样让CTreeCtrl响应菜单和选择CTreeCtrl子项时的消息呢?比方点击一个树控件子项或选择一个菜单时就弹出一个消息框。
    十万火急!还望各位大虾多多帮忙啊,最好能有代码提示,小弟在此先谢谢各位了!

解决方案 »

  1.   

    还要补充一下的是我用了GUIToolKit界面控件,我用的是它的CGuiControlBar控件衍生了一个我自定义的一个CXXXBar类,为了实现像VC++6.0左边的Workspace工作区那样的视图我在CXXXBar里面再定义CGuiTabWnd控件和三个CTreeCtrl控件,但是我想让CTreeCtrl响应菜单消息和CTreeCtrl子项消息时遇到就不知道如何处理了,比方说点击一个CTreeCtrl子项或菜单时弹出一个消息框,还望大伙帮帮我啊!
    小弟在线等.... 问题一解决就给分!
      

  2.   

    你可以让这个CControlBar控件关联到已有的类上,比如CMainframe就可以用classwizard来处理CTreeCtrl的消息了,不关联也可以,自己要手动添加消息影射了!响应TVN_SELCHANGED消息吧
      

  3.   

    请问怎样关联到CMainFrame上,楼上的大虾可否详细说明一下
    再有就是我也想到了自己动手添加消息映射,
    可这个ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTreeSurvey)有三个参数,我怎样将第二个参数IDC_TREE1和我的控件m_TreeCtrl联系起来啊? 我知道在对话框中用ClassWizard是很好解决的,但我用了外部的CControlBar,在ClassWizard中它就没有显示了
      

  4.   

    自己在CControlBar中添加OnSelchanged消息映射!!!
    protected:
    //{{AFX_MSG(CmyControlBar)
    afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };.............
    BEGIN_MESSAGE_MAP(CmyControlBar, CControlBar)
    //{{AFX_MSG_MAP(CLeftView)
    ON_NOTIFY(TVN_SELCHANGED,IDC_SHELL_TREE, OnSelchanged)
    //}}AFX_MSG_MAP
    // Standard printing commands
    END_MESSAGE_MAP().............
    void CmyControlBar::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
            ..............
    }
      

  5.   

    然后你有对话框资源,那就在上面点classwizard,提示你的时候你选择已经存在的类,然后选择一个,比如CMainframe,然后就可以用classwizard了。如果你连控件也是动态创建的,那没有办法了,手动吧
      

  6.   

    IDC_TREE1和m_TreeCtrl创建是时候就可以关联的,也可以subclass
      

  7.   

    有两种方法去map消息。1、在你的Dialog里去映射。2、你可以自己做一个CTreeCtrl的类,在其中写消息响应。我觉得你还是用第二种方法吧。
      

  8.   

    如果控件是动态创建的话,你要像byry(百事罐头)所说的那样在CXXXBar类中定义自己的
    OnSelchanged消息映射至于IDC_TREE1和控件变量m_TreeCtrl怎样联系起来,你可以这样
    在CXXXBar类头文件中:
    #define IDC_TREE1 0x1001 //常量可以自己随便定义,不要和已有程序中id号重复就行
    在CXXXBar类源文件中:
    // create the tree control.
    if (!m_TreeCtrl.Create(WS_VISIBLE, CRect(0,0,0,0), this, IDC_TREE1))  
    {
    TRACE0( "Unable to create tree control.\n" );
    return -1;
    }
    这样你就将m_TreeCtrl与IDC_TREE1联系起来了!
      

  9.   

    在此先谢谢各位大虾!
    按照 suya101(森林狼) 所说的我终于把IDC_TREE1和我的控件m_TreeCtrl联系起来了,
    按照  byry(百事罐头) 所说的我也知道了要在CXXXBar类中定义自己的OnSelchanged消息映射,但是又出现了新的问题:
    我用如下代码测试时:
    // CmyControlBar.h
    ....
    #define IDC_TREE1 0x1001 
    protected:
    //{{AFX_MSG(CmyControlBar)
    afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };// CmyControlBar.cpp
    .............
    BEGIN_MESSAGE_MAP(CmyControlBar, CControlBar) ON_NOTIFY(TVN_SELCHANGED,IDC_TREE1, OnSelchanged)

    END_MESSAGE_MAP()// create the tree control.
    if (!m_TreeCtrl.Create(WS_VISIBLE, CRect(0,0,0,0), this, IDC_TREE1))  
    {
    TRACE0( "Unable to create tree control.\n" );
    return -1;
    }
    ..........................
    void CmyControlBar::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
             
             AfxMessageBox("Hit me!");   //测试代码
               
             *pResult = 0;         
    }编译连接无错!
    但当我点选树控件子项时居然一点反映都没有,按理说应该弹出"Hit me"消息框才对!
    请问有哪位大虾知道是怎么回事啊
    刚刚眼看有点希望,又陷入困境
    我都晕死了!
      

  10.   

    ygzdev(TheEcho)兄!我也同样谢谢你啊!
    多亏你打开了大家的思路呢!
      

  11.   

    就这样的确看不出来是什么错误!不过如果你窗口上已经放了一个TREE的话,要么让他代替你的IDC_TREE1,要么去掉那个tree!同时一般还要指定WS_CHILD和WS_VISIBLE窗口风格!其他我看不出来可能出错的地方!以后再给你看看