gpt4 book ai didi

c++ - MFC CdockablePane 改变外观

转载 作者:行者123 更新时间:2023-11-28 06:39:17 25 4
gpt4 key购买 nike

我正在升级一个旧的 MFC 项目以使用 MFC 功能包和功能区。我将派生自 CControlBar 的 Pane 更改为派生自 CDockablePane 并且效果很好,但它看起来仍然很旧并且不与功能区外观和主题融合。该 Pane 还有看起来仍然很旧的按钮。

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

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

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

最佳答案

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

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

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

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

关于c++ - MFC CdockablePane 改变外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26251607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com