如何在Windows 7/10上使MFC CToolbar按钮大小更一致,以支持支持高DPI的应用程序 我正在使用CtOrthBar使用C++工具包,使用VisualStudio 2017编译工具栏。

如何在Windows 7/10上使MFC CToolbar按钮大小更一致,以支持支持高DPI的应用程序 我正在使用CtOrthBar使用C++工具包,使用VisualStudio 2017编译工具栏。,c++,visual-studio,mfc,highdpi,C++,Visual Studio,Mfc,Highdpi,当应用程序在运行时按预期在清单设置(项目/属性/配置属性/清单工具/输入和输出/DPI感知)中设置为“高DPI感知”时,工具栏似乎与Windows 10上的主监视器DPI比例因子成比例,大约为菜单栏文本的一半高 在Windows7上,这种扩展似乎不会发生。工具栏在100%DPI时与菜单栏文本的高度大致相同,在不同DPI设置时保持相同的像素高度。使用或不使用XP风格的DPI缩放没有区别 Windows 7上的底层工具栏公共控件是否根本不具备高DPI扩展能力?是否有一种有效的方法来调整这一点,使Wi

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

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

Windows 7上的底层工具栏公共控件是否根本不具备高DPI扩展能力?是否有一种有效的方法来调整这一点,使Windows 7和Windows 10工具栏的大小更加一致

我可以使用Visual Studio 2017在清单中运行DOCKTOOL MFC示例并以高DPI感知度重新编译,重现相同的问题

用于指定新的按钮大小和位图大小。您必须知道资源中使用的位图的尺寸

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

//获取DPI缩放
double fx=GetSystemMetrics(SM_CXSMICON)/16.0f;
双fy=GetSystemMetrics(SM_CYSMICON)/16.0f;
如果(fx<1)fx=1;
如果(fy<1)fy=1;
正确的温度;
m_wndMainBar.GetItemRect(0,&temp);
温度MoveToXY(0,0);
右侧温度=内部温度(右侧温度*fx);
温度底部=int(温度底部*fy);
csizebmp_大小(16,15);
设置大小(临时大小(),bmp大小);
要使位图变大,必须转到资源编辑器,为每次缩放创建单独的位图

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


<>这个方法会变得非常复杂,因此你可以考虑使用图标。通过这种方式,您可以创建一个大图标,比如说150%DPI,并使用相同的图标进行125%和100%DPI缩放。

不幸的是,我看到系统以125%的速度拉伸(放大)工具栏按钮位图,即使在创建20x18版本的工具栏并相应地设置bmp_大小(20,18)后也是如此。有什么办法可以防止吗?回答我自己的问题:CMFCToolBar上有一个名为m_bDontScaleImages的公共成员变量,可以在加载资源之前将其设置为TRUE。
// 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
    }
//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);