Sma*_*acL 4 performance mfc ribbon
我有一个本机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%
'
}
Run Code Online (Sandbox Code Playgroud)
深入挖掘,似乎花了很多时间手动着色工具栏〜总时间的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不是Ribbon XML.请在此处查看MSDN上的相关问题.
编辑进一步讨论在MSDN上这里
指定功能区图像资源的页面指出:
对于任何图像,确切的像素大小取决于所使用的监视器的显示分辨率或每英寸点数(dpi).在96 dpi时,大图像的尺寸为32x32像素,小图像的尺寸为16x16像素.图像尺寸相对于dpi以线性方式增加,如下表所示.
Run Code Online (Sandbox Code Playgroud)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 pixelsRibbon框架根据需要缩放图像资源.但是,由于调整大小可能会产生不希望的伪像和图像质量下降,因此强烈建议应用程序提供一组跨越各种常用dpi设置的图像资源.如果未找到完全匹配,则最近的图像将按比例放大或缩小.
为此,可以使用每个Command元素的一组Image元素在Ribbon标记中声明图像资源.在运行时,框架根据每个Image元素的MinDPI属性选择要显示的图像.
底部有一个例子.
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |