65.9K
CodeProject 正在变化。 阅读更多。
Home

将 CMFCOutlookBar 嵌入 CSplitterWnd 窗格

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.21/5 (7投票s)

2008年9月16日

CPOL

1分钟阅读

viewsIcon

45030

在 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 的方法。

© . All rights reserved.