如何使MFC CToolbar按钮更加一致,以使Windows 7/10上的高DPI了解应用程序



我正在使用ctoolbar使用ctoolbar来使用Visual Studio 2017编译工具栏。

在清单设置(项目/properties/configuration properties/stumest tool/input/intup/optupt/dpi意识)中,将应用程序设置为"高dpi意识"时,如运行时所预期的Windows 10上的缩放系数,大约大约一半的菜单栏文本。

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

Windows 7对Windows 7的基础工具栏的共同控制是否从根本上降低了DPI缩放?是否有一种有效的方法来调整此问题并使Windows 7和Windows 10工具栏大小更加一致?

我可以使用Visual Studio 2017重新编译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 mainbarn");
        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缩放。

最新更新