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类里面才能识别,因为控件是创建在他们呢身上的。
纠结呐,请高手说说如何解决
所以请问如何解决这个矛盾
要实现的是点击菜单之后 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类里面才能识别,因为控件是创建在他们呢身上的。
纠结呐,请高手说说如何解决
所以请问如何解决这个矛盾
((CMainFrame*)AfxGetMainWnd())->OnPROCESS(); ??
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的消息处理以及映射宏的理解没有问题
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);
}