【发布时间】:2016-09-09 23:06:27
【问题描述】:
我有一个本地 MFC C++ 应用程序,我有一个基于功能区 UI 的版本和一个基于工具栏的版本。两个 EXE 大小相似(~30mb),但运行基于功能区的版本大约需要 25 秒,而工具栏版本大约需要 5 秒。这只是为了使用工具显示框架窗口。我已经分析了基于功能区 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 缩放,它也会被跳过。在 MFC 源代码 (\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\afxglobals.h) 中搜索 m_bIsRibbonImageScale 和 m_dblRibbonImageScale 会产生大部分相关代码。
如果大按钮图像不是 32x32,功能区编辑器似乎会按原样处理它们,并且会错误地切割基本 BMP。因此,将基本大按钮 BMP 的大小调整为 40x40 会导致屏幕出现垃圾。
编辑:我原以为 Vlad 的回答会起作用,但显然 MFC 功能区资源中使用的 XML 不是功能区 XML。请参阅 MSDN here 上的相关问题。
编辑进一步讨论 MSDN here
【问题讨论】:
标签: performance mfc ribbon