我升级旧的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);
}
}
下图显示了按钮和功能区之间的对比度:
答案 0 :(得分:1)
新MFC使用CMFCVisualManager。使用当前样式绘图并不容易。
此类是虚拟的,用于应用程序特定样式的所有绘图。
只需查看CMFCToolBarButton :: OnDraw的源代码,看看如何绘制各种按钮和文本。
PS:如果只有Buttons和控件,可能会更容易创建一个新的CMFCToolBar。 PPS:或者在CDockingPane中嵌入一个新的CMFCToolBar。