【问题标题】:how to speed up load time for MFC ribbon application如何加快 MFC 功能区应用程序的加载时间
【发布时间】: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_bIsRibbonImageScalem_dblRibbonImageScale 会产生大部分相关代码。

如果大按钮图像不是 32x32,功能区编辑器似乎会按原样处理它们,并且会错误地切割基本 BMP。因此,将基本大按钮 BMP 的大小调整为 40x40 会导致屏幕出现垃圾。

编辑:我原以为 Vlad 的回答会起作用,但显然 MFC 功能区资源中使用的 XML 不是功能区 XML。请参阅 MSDN here 上的相关问题。

编辑进一步讨论 MSDN here

【问题讨论】:

    标签: performance mfc ribbon


    【解决方案1】:

    问题已解决:配置 -> 清单工具 -> 输入和输出 -> 启用 DPI Awareness NO

    不,是解决方案。不幸的是,默认值是 YES。

    【讨论】:

      【解决方案2】:

      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
      

      Ribbon 框架根据需要缩放图像资源。然而, 因为调整大小可能会产生不良的伪影和图像 退化,强烈建议该应用程序提供一个 跨越各种常用 dpi 的一小组图像资源 设置。如果未找到完全匹配的图像,则将是最近的图像 放大或缩小。

      为方便起见,可以在功能区标记中声明图像资源 通过为每个 Command 元素使用一组 Image 元素。运行时 时间,框架根据MinDPI选择要显示的图像 每个 Image 元素的属性。

      底部有例子。

      【讨论】:

      • 感谢您的链接,但不幸的是,MFC 中使用的 Ribbon XML 与链接中使用的 Ribbon XML 不同。我将编辑问题以显示差异。
      猜你喜欢
      • 2010-10-20
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多