关于使用标签视后菜单消息命令的奇怪问题(高分重谢)
MFC的SDI程序,重载CMainFrame类的OnCreateClient函数,使用一个标签视:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if(!m_wndTab.Create(WS_BORDER | WS_CHILD | WS_VISIBLE | TCS_TABS | TCS_HOTTRACK,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST))
{
TRACE0("Failed to create TabContainer!\n");
return FALSE;
}
//m_wndTab.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
m_wndTab.AddView(_T("标签页1"), pContext->m_pNewViewClass, pContext, -1);
return TRUE;
}
m_wndTab为一CTabCtrl派生类的实例:
.h文件内容为:
class CTabViewContainer : public CTabCtrl
{
DECLARE_DYNCREATE(CTabViewContainer)
public:
CTabViewContainer();
virtual ~CTabViewContainer();
BOOL AddView(LPCTSTR pszText, CRuntimeClass *pRT, CCreateContext *pContext = NULL, int nImage = -1);
void ChangeView(int nIndex);
CWnd * GetSelView(void);
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult);
};
.c文件内容为:
IMPLEMENT_DYNCREATE(CTabViewContainer, CTabCtrl)
CTabViewContainer::CTabViewContainer()
{
}
CTabViewContainer::~CTabViewContainer()
{
}
BEGIN_MESSAGE_MAP(CTabViewContainer, CTabCtrl)
ON_WM_SIZE()
ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnTcnSelchange)
ON_NOTIFY_REFLECT(TCN_SELCHANGING, OnTcnSelchanging)
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CTabViewContainer 消息处理程序
// 添加一个视图页
BOOL CTabViewContainer::AddView(LPCTSTR pszText, CRuntimeClass *pRT, CCreateContext *pContext, int nImage)
{
int nIndex = this->GetItemCount();
CSize sz(40, 20);
this->SetItemSize(sz);
TCITEM tci;
tci.mask = TCIF_TEXT | TCIF_PARAM;
if (nImage != -1)
tci.mask |= TCIF_IMAGE;
CWnd *pView = (CWnd *)pRT->CreateObject();
pView->CreateEx(WS_EX_CLIENTEDGE, NULL, NULL, WS_CHILD | WS_VISIBLE,
CRect(0, 0, 0, 0), this, nIndex, pContext);
tci.pszText = (char *)pszText;
tci.lParam = (LPARAM)pView;
tci.iImage = nImage;
this->InsertItem(nIndex, &tci);
return TRUE;
}
// 切换视图
void CTabViewContainer::ChangeView(int nIndex)
{
ASSERT(nIndex>=0);
int nCount=GetItemCount();
ASSERT(nIndex<nCount);
int nSel=GetCurSel();
TCITEM tci;
CRect rc;
tci.mask = TCIF_PARAM;
if(nSel!=nIndex)
{
this->GetItem(nSel, &tci);
CWnd *pView = (CWnd *)tci.lParam;
pView->SetWindowPos(NULL, 0, 0, 10, 10, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW | SWP_NOACTIVATE);
}
this->GetItem(nIndex, &tci);
CWnd *pView = (CWnd *)tci.lParam;
this->GetClientRect(&rc);
rc.top = 24;
pView->SetWindowPos(&CWnd::wndTop, 0, 24, rc.right, rc.bottom - 24, SWP_SHOWWINDOW);
SetCurSel(nIndex);
}
// 得到当前选中的视图索引
CWnd * CTabViewContainer::GetSelView(void)
{
int nSel = GetCurSel();
TCITEM tci;
CRect rc;
tci.mask = TCIF_PARAM;
GetItem(nSel, &tci);
return ((CWnd *)tci.lParam);
}
// 改变尺寸时,需要挪动子窗口
void CTabViewContainer::OnSize(UINT nType, int cx, int cy)
{
CTabCtrl::OnSize(nType, cx, cy);
CRect rc(0, 24, cx, cy);
int nSel = this->GetCurSel();
if (nSel >= 0)
{
TCITEM tci;
tci.mask = TCIF_PARAM;
this->GetItem(nSel, &tci);
CWnd *pView = (CWnd *)tci.lParam;
pView->MoveWindow(&rc);
}
}
void CTabViewContainer::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult)
{
int nSel = this->GetCurSel();
ChangeView(nSel);
*pResult = 0;
}
void CTabViewContainer::OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult)
{
int nSel = this->GetCurSel();
TCITEM tci;
tci.mask = TCIF_PARAM;
this->GetItem(nSel, &tci);
CWnd *pView = (CWnd *)tci.lParam;
pView->SetWindowPos(NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOACTIVATE);
*pResult = 0;
}
问题在于使用标签视后,在Doc和View类中新添加的菜单消息处理命令是灰色的,只能在MainFrame类中添加有效。更奇怪的是在View中只要鼠标左单击一下,Doc和View类中新添加的菜单消息处理命令就有效了。
请各位高手帮忙解决这个问题,高分重谢!!解决后开贴另加分。