我正在使用CToolbar开发旧的C ++ MFC应用程序,以便其工具栏与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
}
答案 0 :(得分:1)
使用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);
要使位图更大,您必须转到资源编辑器并为每个缩放比例创建一个单独的位图。
例如,对于DPI缩放比例为125%的情况,请创建25%的位图,然后使用bmp_size(20, 18)
代替bmp_size(16, 15)
此方法可能会变得非常复杂,因此您可以考虑使用带有LoadIconWithScaleDown
的图标。这样,您可以创建一个大图标,例如DPI为150%,并使用相同的图标进行DPI缩放的125%和100%。