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