2016-05-13 33 views
3

リボンUIベースのバージョンとツールバーベースのバージョンがあるネイティブMFC C++アプリケーションがあります。どちらのEXEも同様のサイズ(約30MB)ですが、リボンベースのバージョンでは約25秒かかりますが、ツールバーのバージョンでは約5秒かかります。これは、フレームウィンドウにツールを表示させるだけです。私はリボンUIベースのバージョンの起動をプロファイリングし、時間が深く掘るMFCリボンアプリケーションの読み込み時間を短縮する方法

BOOL CMFCRibbonInfoLoader::LoadImage(CMFCRibbonInfo::XImage& image, BOOL bSingle) 
{ 
' 
' 
' 
    image.m_Image.SetTransparentColor(GetGlobalData()->clrBtnFace); // 15% 
    image.m_Image.SmoothResize(dblScale);       // 64% 
' 
} 

にダウンCMFCRibbonBar::LoadFromResourceで過ごし、より深くされている十分に確認してくださいましたが、多くの時間は、ツールバーをシェーディング手動で過ごしているように見えます総時間の約44%。

このロード時間を短縮する方法はありますか?透明でない描画スキームを設定することは可能でしょうか?プログラムを実行するために25秒は少し過剰に思えますが、これはSSDから来るEXEイメージを持つ8コア4GHz AMD 8350にあります。

編集:問題を理解するのに役立ちましたが、実際には役に立たない答えを試しました。

何度かポーズした後、afxGlobalData.EnableRibbonImageScale(FALSE);の呼び出しがスケーリングを無効にしているように見えますが、一部のモニタでは結果が視覚的に悪くなる可能性があります。モニタが1920x1080ディスプレイの40x40ピクセルで始まるイメージのサイズが正しい場合、スケーリングもスキップされます。まだ試したことはありませんが、すべてのリボンコントロール用にHDPIイメージを指定し、HDPIイメージの1:1スケーリングを得るのに十分なことがあれば、それもスキップされます。 m_bIsRibbonImageScalem_dblRibbonImageScaleのMFCソースコード(\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ atlmfc \ include \ afxglobals.h)を検索すると、関連するコードのほとんどが生成されます。

大きなボタンの画像が32x32でない場合、リボンエディタはそれらをそのまま扱うように見え、ベースBMPを誤って切り上げます。そのため、ベースの大きいボタンBMPを40x40にサイズ変更すると、画面にゴミが表示されました。

編集:私はVladの答えがうまくいくと思っていましたが、明らかに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に対応する画像リソースの小さなセットを に提供することを強くお勧めします。完全一致が見つからない場合、最も近い画像は に拡大または縮小されます。

これを容易にするために、イメージリソースは、各Command要素のImage要素のセットを使用してリボンマークアップ で宣言することができます。実行時に、 時間、フレームワークは、各画像要素のMinDPI 属性に基づいて表示する画像を選択する。

下部に例があります。解決

+0

ありがとうございますが、残念ながらMFCで使用されるリボンXMLは、リンクで使用されているリボンXMLと同じではありません。違いを示すために質問を編集します。 –

0

問題:設定 - >マニフェストツール - >入力と出力 - >有効DPI意識NO

NO、ソリューションです。デフォルト値は残念ながらYESです。

関連する問題