2011-01-27 4 views
3

私のアプリケーションはC#3.5、Winformsですが、これはおそらくP/Invokeを必要とするため、.NETと厳密には結びついていません。オーナーが描いたメニュー項目にアニメーションを提供する方法は?

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

これまでのところ、最初のOnDrawでWindowFromDC()をP/Invokeし、結果のハンドルを保存してから、メニューが閉じられるまでハンドルで定期的にInvalidateRect()を呼び出してください。

これはちょっとハッキリですが、まだ試していないし、よりエレガントな方法があるのだろうかと思っています。

答えて

3

WindowFromDCを使用するのではなく、GetMenuItemRect functionを呼び出して、特定のメニュー項目の境界矩形を取得することをお勧めします。次に、その機能で埋められたrectangle structureInvalidateRect functionに渡すことができます。

私は、この解決策に多少「ハック感」を感じることに同意しますが、Windows APIによって提供されるメニューはアニメーション化されていないためです。 .NET Frameworkによって提供されるメニューラッパークラスには、比較的まれに使用されるため、Invalidate関数は含まれていません。一般的には、ポップアップメニューが表示されるたびに(WM_INITMENUPOPUP messageを処理することによって)、オーナーが描いたメニュー項目を変更するだけで十分です。私が知る限り、上記の提案は、あなたが望むことを行うための最も正しい方法です。

実際に描画メニューより多くの制御が必要な場合は、実際にはより安価なMenuStrip/ContextMenuStripクラスのほんの数人の方がいらっしゃいます。これらは完全にマネージドコードで実装されているため、ToolStripItemクラスでは、Invalidate methodが動作します。

+1

はい、完全所有者であることに問題があります。少なくとも、人々がネット上で何を言っていたか、そして私はそれをすべてペイントすることができませんでした。私の場合、私はいくつかのかなり太いカスタマイズをしています - 異なるフォントで2行のテキスト。大きな好ましいアニメーションアイコン。多分何か。メニュー項目はすべて同じ高さではありません(一部には1行のテキストしかありません)。 –

+0

@Vilx:うーん、面白いです。正直言って、私は本当にオーナーを描く人はあまりありません。私はアイコンを得るために標準メニューのオーナーの描画をたくさん行ってきましたが、 'MenuStrip'とその仲間をツールボックスから完全に削除しました。私がオンラインで読んだことは、APIメニューよりも優れたカスタマイズ性/オーナードローサポートを提供しているようです。彼らの主なメリットは、適切に設計され、実際にオブジェクト指向であることです。つまり、 'ToolStripItem'をサブクラス化し、必要に応じて独自の描画を行うことができます。より限定された 'ToolStripMenuItem'をサブクラス化しようとしました。 –

+1

ああ、そうかもしれない。私は 'ToolStripMenuItem'をサブクラス化しようとしました。しかし、 'ContextMenuStrip'は' ToolStripMenuItem'以外の項目を含んでいますか? –

関連する問題