mfc 单文档,文档/视图 结构支持。
要实现的是点击菜单之后 ON_COMMAND(ID_SHOWCTRL, OnShowctrl)  CTreeCtrl m_ctc;
CTabCtrl m_ctbc;
CStatic m_l;
是CMainFrame.hl里面定义的。void CMainFrame::OnShowctrl() 
{
m_ctc.Create(WS_VISIBLE | WS_TABSTOP | WS_BORDER | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES |TVS_DISABLEDRAGDROP|TVS_EDITLABELS|TVS_TRACKSELECT, 
CRect(10, 50, 200, 200), GetActiveView(), IDC_DYNAMIC_TREE);
m_ctc.SetImageList(NULL,TVSIL_NORMAL);
  HTREEITEM hItem,hSubItem1,hSubItem2,hSubItem3;
    hItem = m_ctc.InsertItem("Parent1",TVI_ROOT);
hSubItem1= m_ctc.InsertItem("sub0",hItem);
hSubItem2= m_ctc.InsertItem("sub1",hItem);
hSubItem3= m_ctc.InsertItem("sub2",hItem); m_ctbc.Create(WS_VISIBLE|WS_CHILD |TCS_TABS|TCS_RIGHTJUSTIFY|TCS_FIXEDWIDTH,
CRect(300, 50, 600, 350),GetActiveView(), IDC_DYNAMIC_TAB);
m_ctbc.InsertItem(0, "tab0");
m_ctbc.InsertItem(1, "tab1");
m_ctbc.InsertItem(2, "tab2");
m_l.Create("not init yet",WS_VISIBLE|WS_CHILD ,CRect(50, 100, 250, 150),GetActiveView()->GetDlgItem(IDC_DYNAMIC_TAB));
m_ctbc.InsertItem(3, "tab2");
}这些控件是动态创建的,创建在当前的活动视图上面(而且一定要建在活动试图上面,否则出现控件点击不了)接下来要处理这些动态创建控件的消息,我感觉应该在VIEW的类里面添加映射,映射到其他类处理
ON_NOTIFY(TVN_SELCHANGED,IDC_DYNAMIC_TREE,CMainFrame::CTC_Change)
但是发现错误,如果在VIEW类自身处理的话,又不知道如何得到CMainFrame的实例void CCtree_with_tabView::CTC_Change(NMHDR* pNMHDR,LRESULT* pResult){
::MessageBox(NULL,"ASD","ASDA",MB_OK);
HTREEITEM hItemt;
hItemt=(AfxGetApp()->GetMainWnd())->m_ctc.GetSelectedItem();
....在CMainFrame里面映射
ON_NOTIFY(TVN_SELCHANGED,IDC_DYNAMIC_TREE,CTC_Change)
是没有效果的,我试过,我想可能是由于IDC_DYNAMIC_TREE这个东西只有VIEW类里面才能识别,因为控件是创建在他们呢身上的。
纠结呐,请高手说说如何解决
所以请问如何解决这个矛盾

解决方案 »

  1.   

    你可以在View类中的消息响应函数中转发到CMainFrame主框架类中去处理
      

  2.   

    转发是如何转发,这样??
    ((CMainFrame*)AfxGetMainWnd())->OnPROCESS(); ??
      

  3.   

    在其他人帮助下,实现了.
    void CCtree_with_tabView::CTC_Change(NMHDR* pNMHDR,LRESULT* pResult){
        ::MessageBox(NULL,"ASD","ASDA",MB_OK);
        HTREEITEM hItemt;
        hItemt=((CMainFrame*)AfxGetMainWnd())->m_ctc.GetSelectedItem();
    ....
    这一段的错误是CMainFrame不能识别,只要添加
    #include "MainFrm.h"就可以了,看见俺来我对MFC的消息处理以及映射宏的理解没有问题
      

  4.   


    void CCtree_with_tabView::CTC_Change(NMHDR* pNMHDR,LRESULT* pResult){
    ((CMainFrame*)AfxGetMainWnd())->CTC_Change_F(pNMHDR,pResult);
    /*::MessageBox(NULL,"ASD","ASDA",MB_OK);
    HTREEITEM hItemt;
    hItemt=(AfxGetApp()->GetMainWnd())->m_ctc.GetSelectedItem();
    CString t=m_ctc.GetItemText(hItemt),tt="item "+t+" is seelected";
    if(t=="sub0")
    m_ctbc.SetCurSel(0);
    else{
    if(t=="sub1")
    m_ctbc.SetCurSel(1);
    else{
    if(t=="sub2")
    m_ctbc.SetCurSel(2);
    }
    }
    m_l.SetWindowText(tt);*/
    }
    void CMainFrame::CTC_Change_F(NMHDR* pNMHDR,LRESULT* pResult){
    HTREEITEM hItemt;
    hItemt=m_ctc.GetSelectedItem();
    CString t=m_ctc.GetItemText(hItemt),tt="item "+t+" is seelected";
    if(t=="sub0")
    m_ctbc.SetCurSel(0);
    else{
    if(t=="sub1")
    m_ctbc.SetCurSel(1);
    else{
    if(t=="sub2")
    m_ctbc.SetCurSel(2);
    }
    }
    m_l.SetWindowText(tt);
    }