5

このクエストの目標は単純です。TrackPopupMenu API の呼び出しによって表示されるコンテキスト メニューにアイコンを追加することです。しかし、明らかに Windows 向けのコーディングはスプーンでパドリングするようなものであり、所有者がメニューを作成する以外にアイコンを追加する簡単な方法はありません。そのため、所有者が描画したメニューに関する一連の C++ コードを思いついた検索を行いましたが、これまでのところ、自分に合ったものを見つけることができません。理由は簡単です。それが描画するメニューは、Windows 95 から出てきたもののように見えます...では、デフォルトの Windows 7 の外観を持つ所有者が描画したメニューを作成する方法はありますか?

PS。メニュー項目にアイコンを追加する簡単な方法がある場合、たとえば、LoadIcon を設定してから ChangeMenuItem を設定する方法がある場合は、代わりに喜んでそれを使用するので、誰かがその方法を教えてくれれば幸いです...

PS2。OK、私の好みでは長すぎます。このOSで最も単純なタスクを実行できないように見えるのはなぜですか:(問題を説明するために小さなテストプロジェクトを作成しました。アイコンをPARRGBビットマップに変換する独自のCreatePARGBBitmapFromIconメソッドでビットマップをロードします(以下で提案されているように)次に、2 つの場所に表示します: CStatic コントロール (画面の中央、問題ないように見えます) と、メニュー項目 (これはまったく問題ありません) です。Windows 7 と XP のスクリーンショットを次に示します (どちらもまったく異なって見えます)。

ここに画像の説明を入力

ここに画像の説明を入力

みんな、真剣に、ここで何が欠けているのですか????

PS3。@DavidHeffernan のおかげで、修正できました。これが実際の C++/MFC ソリューションです。ソリューションの基になっている記事は次のとおりです。スクリーンショットは次のとおりです。

ここに画像の説明を入力 ここに画像の説明を入力

参考までに、これを解決するのに約2日かかりました.OS XまたはiOSでは約2分かかりました...

そして最後に、私が完全に支持するソース記事からの私のお気に入りの引用のいくつか:

メニュー項目のアイコンを作成するためのシンプルで一貫した API があれば、これらすべてのハックやレシピは無意味になります。残念なことに、メニュー アイコンは、Windows および Microsoft アプリケーションに常に存在していましたが、まともな API を取得できませんでした。さらに、これらのアイコンを機能させる方法は、Windows のメジャー リリースごとに変化するため、開発者はアプリケーションを新しいアプリケーションに「移植」するのに時間を無駄にしています。生産的なことをするのではなく、「シニー」Windows

そして、これはそれをうまくまとめています:

ああああああああああああああああああああああああああああ!マイクロソフトはなぜ馬鹿だらけなのか???

4

1 に答える 1

9

この記事では、その方法について説明しています: http://www.nanoant.com/programming/themed-menus-icons-a-complete-vista-xp-solution

要約すると、XP では、MENUITEMINFO 構造体の hbmpItem フィールドに HBMMENU_CALLBACK を渡す必要があります。これにより、メニューの所有者が描画しますが、WM_MEASUREITEM と WM_DRAWITEM でアイコンを処理するだけで済みます。

Vista 以降では、hbmpItem に PARGB32 ビットマップ (あらかじめ乗算されたアルファ、32 ビットの色深度) を配置し、システムにメニューを描画させます。そのため、Vista 以降では所有者は描画されません。テーマ API はメニューを描画するための機能を提供しますが、それを正しく行うのは非常に難しく、システムに任せることができるので、実際には必要ありません。

于 2012-12-03T10:44:10.843 に答える