2014-10-08 60 views
0

我正在升級舊的MFC項目以使用MFC功能部件包和功能區。我改變了一個從CControlBar派生的窗格,它是從CDockablePane派生出來的,並且它很好用,但是它看起來仍然很舊,並且不會與功能區外觀和主題相融合。該窗格還有按鈕,仍然看起來很老。MFC CdockablePane更改外觀

如何更改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

新MFC使用一個CMFCVisualManager。使用當前樣式繪圖並不容易。

該類是虛擬的,用於應用程序特定風格的所有圖形。

只需查看CMFCToolBarButton :: OnDraw的源代碼,即可瞭解如何繪製各種按鈕和文本。

PS:如果只有按鈕和控件,可能會更容易創建新的CMFCToolBar。PPS:或者在CDockingPane中嵌入一個新的CMFCToolBar。

+0

這些按鈕打開允許顯示CTreeCtrl對象,所以我不認爲工具欄會有用,感謝輸入,我會研究它。 – Jak 2014-10-08 09:04:47

+0

好吧,比添加CMFCToolBar到您的對接窗格...此控制知道如何繪製自己;) – xMRi 2014-10-08 09:24:10

+0

我真的很想不要重做所有的代碼...我使用\t CMFCVisualManager :: SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7 ));在CMainFrame :: OnCreate中,但窗格不會更改,是否需要將它添加到窗格的OnCreate? – Jak 2014-10-08 09:42:46