2016-05-13 75 views
3

我有一個本機MFC C++應用程序,我有一個基於功能區UI的版本和基於工具欄的版本。這兩個EXE的大小相似(〜30mb),但運行基於功能區的版本大約需要25s,而工具欄版本大約需要5s。這只是爲了讓框架窗口顯示工具。我已經成型的帶狀基於UI版本開始了,果然時間被消耗在CMFCRibbonBar::LoadFromResource如何加快MFC功能區應用程序的加載時間

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會導致屏幕上出現垃圾。

編輯:我曾經認爲弗拉德的答案是可行的,但顯然在MFC功能區資源中使用的XML不是功能區XML。請參閱MSDN here上的相關問題。

編輯上MSDN here

回答

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 dpi設置的小圖像資源組。如果找不到精確匹配,則最近的圖像將被放大或縮小爲 。

爲了便於實現,可以通過爲每個Command元素使用一組Image元素,在Ribbon標記 中聲明圖像資源。在運行 時間,框架根據每個Image元素的MinDPI 屬性選擇要顯示的圖像。

底部有一個例子。

+0

感謝您的鏈接,但不幸的是,MFC中使用的Ribbon XML與鏈接中使用的Ribbon XML不同。我將編輯問題以顯示差異。 –

0

問題解決了:配置 - >清單工具 - >輸入與輸出 - >啓用DPI意識NO

NO,是解決方案。不幸的是,默認值是YES。