嵌入CMFCOutlookBar CSplitterWnd窗格

介绍 本文帮助您在CSplitterWnd窗格中添加一个CMFCOutlookbar。上面的图片显示了Visual Studio 2008和MFC功能包中提供的Office 2007类型的UI。有关更多细节,请参考此链接:Visual c++ 2008特性包:MFC增强。 使用的代码 默认情况下,Office 2007 UI生成的代码中的CMFCOutlookBar嵌入到CFrameWnd派生类中。在这里,我们将讨论在CSplitterWnd/CSplitterWndEx窗格中添加一个CMFCOutlookBar。 隐藏,复制Code

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。 隐藏,复制Code

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的指针,并修改splitter父窗格的属性以添加WS_CLIPCHILDREN属性。如果我们不添加此属性,那么在焦点更改时,拆分器窗口窗格将覆盖展望栏。 通过更改此属性,它会在调试编译模式下造成调试断言失败的问题。要解决这个问题,派生类CSplitterWndEx并覆盖函数OnInvertTracker()。 隐藏,复制Code

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以从调试断言失败中转escape之前删除每个窗格的WS_CLIPCHILDREN属性,然后再次将该属性添加回每个窗格。 的兴趣点 这段代码对于那些想用自己的方式修改MFC Outlook 2008的人特别有用。这只是演示了如何在SplitterWnd窗格中添加一个CMFCOutlookBar来代替默认的主框架窗口。 本文转载于:http://www.diyabc.com/frontweb/news10957.html

原文地址:https://www.cnblogs.com/Dincat/p/13473293.html