将 CMFCOutlookBar 嵌入 CSplitterWnd 窗格






3.21/5 (7投票s)
在 SplitterWnd 的任何窗格中创建一个 2008 MFCOutlookBar。
引言
本文档介绍了如何在 CSplitterWnd
窗格中添加 CMFCOutlookBar
。 上图显示了 Visual Studio 2008 和 MFC 功能包提供的 Office 2007 类型的用户界面。 有关更多详细信息,请参阅此链接:Visual C++ 2008 Feature Pack: MFC Enhancements(Visual C++ 2008 功能包:MFC 增强功能)。
使用代码
默认情况下,在 Office 2007 用户界面生成的代码中,CMFCOutlookBar
嵌入在派生自 CFrameWnd
的类中。 在这里,我们将讨论如何在 CSplitterWnd
/CSplitterWndEx
窗格中添加 CMFCOutlookBar
。
BOOL COffice2007Frame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { BOOL bRet=true; bRet=bRet&m_wndSplitter.CreateStatic(this,2,2); CRect rectClient; this->GetClientRect(&rectClient); bRet=bRet&m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMFCOutlookBar), CSize(rectClient.Width()/4,rectClient.Height()/2),pContext); bRet=bRet&m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(COffice2007View), CSize(rectClient.Width()*3/4,rectClient.Height()/2),pContext); bRet=bRet&m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(COffice2007View), CSize(rectClient.Width()/4,rectClient.Height()/2),pContext); bRet=bRet&m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(COffice2007View), CSize(rectClient.Width()*3/4,rectClient.Height()/2),pContext); return bRet; }
以上代码将分割器窗口划分为四个不等比例的窗格。 在第一个窗格中创建视图时,会提供一个 CMFCOutlookBar
运行时指针,因此它将在第一个窗格中创建一个 OutlookBar。
CMFCOutlookBar* pPane_0_0=(CMFCOutlookBar*)m_wndSplitter.GetPane(0,0); pPane_0_0->GetParent()->ModifyStyle(WS_CHILDWINDOW,WS_CHILDWINDOW| WS_CLIPCHILDREN,SWP_DRAWFRAME);
在上面的代码中,我们使用 GetPane
函数获取 OutlookBar 的指针,并修改分割器父窗格的属性以添加 WS_CLIPCHILDREN
属性。 如果我们不添加此属性,则在焦点更改时,分割器窗口窗格将覆盖 OutlookBar。
通过更改此属性,会在调试编译模式下创建一个调试断言失败的问题。 为了解决此问题,派生类 CSplitterWndEx
并重写函数 OnInvertTracker()
。
void CDSplitterWndEx::OnInvertTracker(const CRect& rect ) { this->GetPane(0,0)->GetParent()->ModifyStyle(WS_CLIPCHILDREN, 0,SWP_DRAWFRAME); this->GetPane(0,1)->GetParent()->ModifyStyle(WS_CLIPCHILDREN, 0,SWP_DRAWFRAME); this->GetPane(1,0)->GetParent()->ModifyStyle(WS_CLIPCHILDREN, 0,SWP_DRAWFRAME); this->GetPane(1,1)->GetParent()->ModifyStyle(WS_CLIPCHILDREN, 0,SWP_DRAWFRAME); CSplitterWndEx::OnInvertTracker(rect); //Base class this->GetPane(0,0)->GetParent()->ModifyStyle(0, WS_CLIPCHILDREN,SWP_DRAWFRAME); this->GetPane(0,1)->GetParent()->ModifyStyle(0, WS_CLIPCHILDREN,SWP_DRAWFRAME); this->GetPane(1,0)->GetParent()->ModifyStyle(0, WS_CLIPCHILDREN,SWP_DRAWFRAME); this->GetPane(1,1)->GetParent()->ModifyStyle(0, WS_CLIPCHILDREN,SWP_DRAWFRAME); }
以上代码在调用 OnInverTracker
之前,先移除每个窗格的 WS_CLIPCHILDREN
属性,以避免调试断言失败,然后再次将该属性添加回每个窗格。
关注点
这段代码对于那些想要以自己的方式修改 MFC Outlook 2008 的人来说特别有用。 这只是演示了如何在 SplitterWnd
窗格中代替默认主框架窗口添加 CMFCOutlookBar
的方法。