gpt4 book ai didi

c++ - 如何使 MFC CToolbar 按钮大小对于 Windows 7/10 上的高 DPI 感知应用程序更加一致

转载 作者:行者123 更新时间:2023-11-30 04:50:34 26 4
gpt4 key购买 nike

我正在开发一个旧的 C++ MFC 应用程序,它使用 CToolbar 作为其工具栏,使用 Visual Studio 2017 进行编译。

当应用程序在运行时按预期在 list 设置(项目/属性/配置属性/ list 工具/输入和输出/DPI 感知)中设置为“高 DPI 感知”时,工具栏似乎与主监视器 DPI 一起缩放Windows 10 上的缩放因子,大约是菜单栏文本高度的一半。

在 Windows 7 上似乎不会发生这种缩放。在 100% DPI 下,工具栏与菜单栏文本的高度大致相同,并且在不同的 DPI 设置下保持相同的像素高度。使用或不使用 XP 风格的 DPI 缩放没有区别。

Windows 7 上的底层工具栏通用控件是否从根本上降低了高 DPI 缩放的能力?有没有一种有效的方法来调整这一点并使 Windows 7 和 Windows 10 的工具栏大小更加一致?

我可以在使用 Visual Studio 2017 运行 list 中使用高 DPI 感知重新编译的 DOCKTOOL MFC 示例时重现相同的问题。

https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general/docktool

// code excerpts from DOCKTOOL below:
class CMainFrame : public CFrameWnd

{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)

CToolBar m_wndMainBar;

// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//....


if (!m_wndMainBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC |
CBRS_TOP | ((m_bToolTips)?(CBRS_TOOLTIPS | CBRS_FLYBY):0), IDW_MAIN_BAR) ||
!m_wndMainBar.LoadBitmap(
(m_bColor)?IDR_COLOR_MAINBAR:IDR_MONO_MAINBAR) ||
!m_wndMainBar.SetButtons(MainButtons, sizeof(MainButtons)/sizeof(UINT)))
{
TRACE0("Failed to create mainbar\n");
return -1; // fail to create
}

最佳答案

使用CToolBar::SetSizes分配新的按钮大小和位图大小。您必须知道资源中使用的位图的尺寸。

以下示例假定位图为 16 x 15 像素。这将使按钮根据 DPI 设置变大(但不会使位图变大)

//get DPI scaling 
double fx = GetSystemMetrics(SM_CXSMICON) / 16.0f;
double fy = GetSystemMetrics(SM_CYSMICON) / 16.0f;
if(fx < 1) fx = 1;
if(fy < 1) fy = 1;

CRect temp;
m_wndMainBar.GetItemRect(0, &temp);
temp.MoveToXY(0, 0);
temp.right = int(temp.right * fx);
temp.bottom = int(temp.bottom * fy);

CSize bmp_size(16, 15);
m_wndMainBar.SetSizes(temp.Size(), bmp_size);

要使位图更大,您必须转到资源编辑器并为每次缩放创建一个单独的位图。

例如,对于 125% DPI 缩放,创建一个大 25% 的位图并使用 bmp_size(20, 18) 而不是 bmp_size(16, 15)

此方法可能会变得非常复杂,因此您可以考虑使用带有 LoadIconWithScaleDown 的图标.这样你就可以创建一个大图标,比如 150% DPI,并使用相同的图标进行 125% 和 100% DPI 缩放。

关于c++ - 如何使 MFC CToolbar 按钮大小对于 Windows 7/10 上的高 DPI 感知应用程序更加一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54946518/

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