应用BCGCB写的一个界面上,左边是一棵树。这个树的实现类为WorkspaceBar.cpp然后在MainFrm中定义
CWorkspaceBar m_wndWorkSpace;  在MainFrm.cpp中m_wndWorkSpace.Create()来建立这个树。现在的问题是我点击了树中的项目,希望产生的消息执行OnSelchanged和OnClick函数,
定义的消息如下:
ON_NOTIFY_REFLECT(TVN_SELCHANGED,  OnSelchanged)
ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
消息定义是在WorkspaceBar.cpp中的,而且我希望是在WorkspaceBar,但是目前点了树没有产生现有的消息,不知是定义的消息不对呢还是不能在WorkspaceBar定义?
小弟刚学VC,还请大家帮忙!!!

解决方案 »

  1.   

    ON_NOTIFY的话编译都通不过呀,我是想这个消息的定义是否一定要在MainFrm.cpp啊?
      

  2.   

    使用afx_msg void OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult);
    加ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnTvnSelchanged)
    定义的话只能用于自身响应消息,这是CTreeCtrl控件自身的消息响应函数。
    你要WorkspaceBar响应的话,可以在TreeCtrl的OnTvnSelchanged函数中给WorkspaceBar发一条你自定义的消息。
    或者把WorkspaceBar的指针给TreeCtrl,在TreeCtrl的OnTvnSelchanged函数中直接调用WorkspaceBar的某个函数,执行相应操作。
      

  3.   

    楼上的说法有点好像道理,但是不会操作我是在WorkspaceBar.h中定义了CTreeCtrl  m_wndTree;
    ,你说的TreeCtrl的OnTvnSelchanged应该在哪里实现啊?
    请给些实例代码好啊
      

  4.   

    还有个问题,就是在View.cpp中要得到MainFrm中的对象m_wndToolBar,从而获得树中的项目的属性,应该怎么写啊?
      

  5.   

    从结构上来说,最好不要直接使用MFC的TreeCtrl,而是自己从CTreeCtrl派生一个自己的TreeCtrl类,这样分开级别的话,我们就可以在自己的类里做自己想做的事情,不用局限于MFC提供的函数。
    单文档的话,View的父窗口就是MainFrame,用GetParent()就能找到。
    或者用全局的App对象也能找到:CMainFrame * pMainFrame = (CMainFrame *)theApp.GetMainWnd();
    然后pMainFrame->m_wndToolBar 就行了。
      

  6.   

    eterblue(云流)真的十分谢谢你,第二个问题我明白了。
    关于第一个问题,你的意思就是让我自己从CTreeCtrl派生一个tree类,然后再这个类中加入OnTvnSelchanged函数。我在想我需要的操作就在OnTvnSelchanged中完成,而不再通过接调用WorkspaceBar的某个函数,这样可以吗?
      

  7.   

    eterblue(云流)兄,试了一下,问题解决了,想再问一下“或者把WorkspaceBar的指针给TreeCtrl,在TreeCtrl的OnTvnSelchanged函数中直接调用WorkspaceBar的某个函数,执行相应操作。”
    在我定义的tree类中如何获得WorkspaceBar中的某个函数的指针啊?
      

  8.   

    是的,你自己派生一个TreeCtrl类,然后响应它的TVN_SELCHANGED消息(重写OnTvnSelchanged函数)就行了,自己想做什么在里面写就行了。
    现在的情况大概你的TreeCtrl的父窗口就是WorkspaceBar,直接用:
    CWorkspaceBar * pBar=(CWorkspaceBar *)GetParent();
    然后 pBar-> 某一个函数() 就行了。不过函数的定义必须是public的。
    如果想直接把WorkspaceBar的指针给TreeCtrl,就在TreeCtrl的头文件中定义一个WorkspaceBar的指针,你在WorkspaceBar中Create TreeCtrl之后,马上把自己的指针赋给TreeCtrl中的那个变量就行了。
    如在TreeCtrl.h中:CWorkspaceBar * m_pBar;
    在WorkspaceBar中Create TreeCtrl之后:m_wndTree.m_pBar=this;
    就行了,之后m_pBar->某个函数()。
      

  9.   

    eterblue(云流)兄,谢谢你,不光给我解决了问题,而且还让我学到很多东西,50分太少了,真不好意思。