MFC CdockablePane改变外观

时间:2014-10-08 07:42:30

标签: c++ mfc panel ribbon mfc-feature-pack

我升级旧的MFC项目以使用MFC功能包和功能区。我将从CControlBar派生的窗格更改为从CDockablePane派生而来,它工作得很好,但它仍然看起来很旧,并且不会与功能区外观和主题混合。 Pane还有一些看起来很旧的按钮。

如何更改CDockablePane派生对象的外观,感觉或主题以及从CButton派生的按钮?

我使用以下代码绘制按钮,是简单更改背景的最佳方式吗?

void CFolderButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{   
    UINT uState=DFCS_BUTTONPUSH;
    if( lpDrawItemStruct->itemState & ODS_SELECTED )
    {
        uState|=DFCS_PUSHED;
    }

    //CDC dc;
    CDC* dc = CDC::FromHandle(lpDrawItemStruct->hDC);


    dc->DrawFrameControl(&lpDrawItemStruct->rcItem,DFC_BUTTON,uState);
    if( !IsWindowEnabled() )
    {
        dc->SetTextColor(::GetSysColor(COLOR_3DSHADOW));        
    }

    CString csText;
    GetWindowText(csText);

    if (m_iDisplayType != 2 || !m_hIcon)
    {
        LOGFONT lf;
        memset(&lf, 0, sizeof(LOGFONT)); 
        lf.lfHeight = m_iFontSize;                      
        strcpy(lf.lfFaceName, "Tahoma Bold");       
        VERIFY(font.CreateFontIndirect(&lf));  

        CFont* def_font = dc->SelectObject(&font);

        RECT buttonRect = lpDrawItemStruct->rcItem;
        buttonRect.left += 10;
        buttonRect.right += 10;

        if (m_iDisplayType != 1 || !m_hIcon) //text & Icon
        {
            buttonRect.left += 30;
            buttonRect.right += 30;
        }   
        dc->DrawText(csText,&buttonRect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);  

        dc->SelectObject(def_font);

        font.DeleteObject();
    }


    if (m_hIcon && m_iDisplayType != 1)
    {   
        CSize czText = dc->GetTextExtent(csText);
        dc->DrawIcon(0,0,m_hIcon);
    }
}

下图显示了按钮和功能区之间的对比度:

DockablePane contrast to ribbon

1 个答案:

答案 0 :(得分:1)

新MFC使用CMFCVisualManager。使用当前样式绘图并不容易。

此类是虚拟的,用于应用程序特定样式的所有绘图。

只需查看CMFCToolBarButton :: OnDraw的源代码,看看如何绘制各种按钮和文本。

PS:如果只有Buttons和控件,可能会更容易创建一个新的CMFCToolBar。 PPS:或者在CDockingPane中嵌入一个新的CMFCToolBar。