3

描画面として使用される単純なパネルがあります。ここでの目標は、特定の状況下で子 ListView の周りに 4 ピクセル幅のアウトラインを描画することです。何かをドラッグできるときにアウトラインを脈動させたいと思います。

ListView の周りに単純な四角形を描画し、タイマー ティック イベント内の四角形の不透明度を更新しています。不透明度が変更されると、境界線が再描画されます。この時点で、絵画をダブル バッファリングしています。また、15 ティックごとにのみ再描画を許可しています (タイマー間隔は 20 ミリ秒です)。このすべての後、描画プロセスはまだ少しちらつきます。これは受け入れられないため、これを回避する方法についてのガイダンスが必要です。

コントロールを頻繁に描画する方法がわかりません。不透明から固体へ、そして再び不透明へとスムーズに移行する必要があります。ティック間隔を十分に下げると (約 300 ~ 500 ミリ秒まで)、点滅は停止しますが、リフレッシュ レートが遅すぎます。

私はどんなアイデアにもオープンです。おそらく、私がこれにアプローチしている方法は単に間違っているか、またはあなたの誰かがすでにグロー効果を作成し、何をすべきかを知っているかもしれません. 事前に助けてくれてありがとう。

4

6 に答える 6

4

誰かが興味を持っている場合、私はこれに対する解決策を見つけました。ちらつきは、背景の塗りつぶしが原因であることがわかりました。SetStyle を使用して、すべての描画を処理することをコントロールに伝えました。

SetStyle(ControlStyles.SupportsTransparentBackColor |
         ControlStyles.Opaque |
         ControlStyles.UserPaint |
         ControlStyles.AllPaintingInWmPaint, true);

次に、まず領域に透明な色を塗り、次に境界線を塗ります。私はちょっとしたハックですが、それは魅力のように機能します。

編集:画像もダブルバッファリングすることを忘れないでください。

于 2008-10-09T00:24:58.523 に答える
3

フォームで DoubleBuffered = true を設定します。

于 2008-10-08T22:31:39.860 に答える
1

強い答えはありませんが、あなたには何もないので、とにかく投稿します:

まず、私は System.Drawing.ImageAnimator クラスを使用したことがありませんが、それはあなたにとってより良いアプローチでしょうか?

次に、それが失敗した場合、ダブルバッファリングを使用しないようにしましたか? それはロングショットですが、ダブルバッファリングコードが実際に悪化させている可能性があります.

于 2008-10-08T22:27:38.323 に答える
1

これは役に立たない可能性が高いことを事前に申し訳ありませんが、WPFにはアニメーションがあり、少なくとも理論的にはこれをスムーズに行うことができます.

于 2008-10-08T23:11:49.983 に答える
0

ロングショットですが、試しましたか

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

パネルコントロールで?

于 2008-10-08T22:31:25.163 に答える
0

また、ビットマップ上で描画を行い、ビットマップが変更されている場合はビットマップを表示することも検討してください。ちょうど私の2c。

于 2008-10-08T23:10:22.107 に答える