簡體   English   中英

如何使 MFC CToolbar 按鈕大小對於 Windows 7/10 上的高 DPI 感知應用程序更加一致

[英]How to make MFC CToolbar button sizes more consistent for high DPI aware applications on Windows 7/10

我正在開發一個舊的 C++ MFC 應用程序,它使用 CToolbar 來使用 Visual Studio 2017 編譯其工具欄。

當應用程序在清單設置(項目/屬性/配置屬性/清單工具/輸入和輸出/DPI 感知)中按預期在運行時設置為“高 DPI 感知”時,工具欄似乎隨着主監視器 DPI 縮放因子的開啟而縮放Windows 10 大約是菜單欄文本的一半高。

在 Windows 7 上,這種縮放似乎不會發生。 工具欄與 100% DPI 時的菜單欄文本高度大致相同,並且在不同的 DPI 設置下保持相同的像素高度。 使用或不使用 XP 風格的 DPI 縮放沒有區別。

Windows 7 上的底層工具欄公共控件是否根本無法實現高 DPI 縮放? 有沒有一種有效的方法來調整這一點並使 Windows 7 和 Windows 10 工具欄的大小更加一致?

我可以在運行使用 Visual Studio 2017 的清單中使用高 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 縮放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM