3

私のアプリケーションはC#3.5、Winformsですが、とにかくP / Invokeが必要になる可能性が高いため、.NETに厳密に関連付けられているわけではありません。

ContextMenuMenuItemクラスを介して所有者が描画するメニュー項目を作成しました。すべて正常に機能しますが、一部のアイテムについては、小さなアニメーションを作成したいと思います(アイテムに関連付けられたプロセスが実行されていることを示しています)。残念ながら、上記の2つのクラスは、Invalidate()メソッドなどを提供しません。

これまでの私の最善のアイデアはWindowFromDC()、最初のOnDrawでP / Invokeを実行し、結果のハンドルを保存してInvalidateRect()から、メニューが閉じるまで定期的にハンドルを呼び出すことです。

これはちょっとハックなようですが、私はまだ試していません。もっとエレガントな方法があるのではないかと思います。

4

1 に答える 1

3

を使用するのではなく、関数WindowFromDCを呼び出して、特定のメニュー項目の境界四角形を取得することをお勧めします。次に、その関数によって塗りつぶされた四角形構造をfunctionに渡すことができます。GetMenuItemRectInvalidateRect

このソリューションには「ハック」のような感覚があることに同意しますが、それは、Windows API によって提供されるメニューがアニメーション化するように設計されていないためだと思います。.NET Framework によって提供されるメニュー ラッパー クラスには関数が含まれていませんInvalidate。これは、比較的まれな使用例であるためです。通常、所有者が描画したメニュー項目は、ポップアップ メニューが表示されるたびに (WM_INITMENUPOPUPメッセージを処理することによって) 変更するだけで十分です。私の知る限り、上記の提案は、あなたが望むことを行うための最も「正しい」方法です。

描画メニューをそれほど細かく制御する必要がある場合、あなたは安っぽいMenuStrip/ContextMenuStripクラスが実際に優れている数少ない人の 1 人かもしれません。これらは完全にマネージ コードで実装されるため、このToolStripItemクラスは有効Invalidateなメソッドを提供します。

于 2011-01-27T09:29:16.280 に答える