我有一个原生的MFC C ++应用程序,我有一个基于功能区UI的版本和基于工具栏的版本。两个EXE的大小相似(~30mb),但运行基于功能区的版本大约需要25s,而工具栏版本大约需要5s。这只是用工具显示框架窗口。我已经介绍了基于功能区UI的版本的启动情况,并确定在CMFCRibbonBar::LoadFromResource
和更深入的时间花费了时间
BOOL CMFCRibbonInfoLoader::LoadImage(CMFCRibbonInfo::XImage& image, BOOL bSingle)
{
'
'
'
image.m_Image.SetTransparentColor(GetGlobalData()->clrBtnFace); // 15%
image.m_Image.SmoothResize(dblScale); // 64%
'
}
深入挖掘,似乎花费了大量时间手动着色工具栏〜总时间的44%。
有没有办法加快这个加载时间,可能是通过设置不透明的绘图方案? 25秒运行一个程序似乎有点过分,这是一个8核4ghz AMD 8350与EXE图像来自SSD。
编辑:尝试了以下有助于了解问题的内容,但并没有真正做出有用的答案。
经过一些探讨后,似乎调用afxGlobalData.EnableRibbonImageScale(FALSE);
会禁用缩放,但可能会在某些显示器上直观地留下不良结果。如果图像尺寸对于显示器开始是正确的,在我的1920x1080显示器上为40x40像素,则也会跳过缩放。我还没有尝试过,但我想如果你为所有的色带控件指定HDPI图像,你很幸运能够为你的HDPI图像获得1:1的缩放,它也会被跳过。搜索m_bIsRibbonImageScale
和m_dblRibbonImageScale
的MFC源代码(\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ atlmfc \ include \ afxglobals.h)会产生大部分相关代码。
如果大按钮图像不是32x32,则功能区编辑器似乎将它们视为原样,并且错误地切断基本BMP。因此,将基本大按钮BMP的大小调整为40x40会导致屏幕上出现垃圾。
编辑:我原以为Vlad的答案会有效,但显然MFC功能区资源中使用的XML不是Ribbon XML。请参阅MSDN here上的相关问题。
修改关于MSDN here
的进一步讨论答案 0 :(得分:5)
页面Specifying Ribbon Image Resources说明:
对于任何图像,确切的像素大小取决于显示器 正在使用的显示器的分辨率或每英寸点数(dpi)。在96 dpi,大图像尺寸为32x32像素,小图像尺寸为16x16 像素大小。图像尺寸以线性方式相对增加 dpi,如下表所示。
DPI Small Image Large Image 96 dpi 16x16 pixels 32x32 pixels 120 dpi 20x20 pixels 40x40 pixels 144 dpi 24x24 pixels 48x48 pixels 192 dpi 32x32 pixels 64x64 pixels
功能区框架根据需要缩放图像资源。然而, 因为调整大小可能会产生不良的伪像和图像 降级,强烈建议应用程序提供 跨越各种常用dpi的一小组图像资源 设置。如果未找到完全匹配,则最近的图像将是 放大或缩小。
为方便起见,可以在功能区标记中声明图像资源 通过为每个Command元素使用一组Image元素。在奔跑 时间,框架选择基于MinDPI显示的图像 每个Image元素的属性。
底部有一个例子。
答案 1 :(得分:0)
问题解决了:配置 - >清单工具 - >输入和输出 - >启用DPI意识NO
不,是解决方案。遗憾的是,默认值为YES。