ピクチャボックスのペイントイベントが2回実行される

WinFormsフォームに画像ボックスを追加し、ペイントイベントを追加しました。デバッグすると、ペイントイベントが2回呼び出されることがわかります。

どうすれば修正できますか?

0
イベントコードをペイントすることをお勧めします。あなたはあまりにも多くをやろうとしているかもしれません。あるいは、イベントで2回目のペイントイベントを引き起こす何かをしているかもしれません。ちらつき効果が得られたら、コントロール/フォームの DoubleBuffering をオンにしてみてください
追加された 著者 musefan,
私は理解していない、それはなぜプログラムがちょうど開くときに2回呼び出すのですか?例えば;私のペイントのイベントハンドラで、ピクチャボックスにイメージを描画すると、ユーザはそれが2度描かれていることがわかります。私はそれを中止するつもりはない。
追加された 著者 user983924,
なぜこれは驚くべきことでしょうか?ペイントサイクルごとに1回、何度も呼び出されるペイントイベントが見えます。
追加された 著者 David Heffernan,
あなたはC ++やC#のどちらをやっているのですか?
追加された 著者 Ash Burlaczenko,

2 答え

ピクチャボックスコントロールは、Windowsのペイントサイクルと WM_PAINT イベントの比較的緩やかなラッパーです。

WM_PAINT イベントは、ウィンドウの描画面が無効であるとみなされるたびにシステムがアプリケーションメッセージキューに配置するキューに入れられたメッセージです。これは多くの理由で発生します。

  • 別のウィンドウがウィンドウの上にドラッグされます(現代のウィンドウではこれを緩和するためにバッファリングが使用されます)。
  • 最終的にWin32の InvalidateRect 関数を呼び出す無効化を呼び出すことによってウィンドウを無効にします。
  • システム全体のテーマ設定が変更されました。
  • その他

だから、これの自然な結論は、あなたの画像ボックスペイントハンドラは、複数回呼び出されるという前提の下で書かれる必要があるということです。

4
追加された
なぜあなたはそれをしたいのですか?
追加された 著者 David Heffernan,
グラフを描画するのに10秒間タックしてはいけません。それを修正してください。
追加された 著者 David Heffernan,
どのようにそのようなペイントハンドラを書くか?私はグラフを描いていますが、1つのドローはかなり遅いので、最初のドロー直後に再描画する必要はありません。私は何とか再描画呼び出しの原因を突き止めて、実際に再描画するかどうかを決定できますか?
追加された 著者 Buksy,
私が言ったように、大きなグラフと1回の描画を描画するImは、2回目の再描画のために常に直ちに2回目の再描画と呼ばれ、凍ったように見えます。私はペイントからすぐに戻って、Imが2回目の塗り替えを起こしているかどうかを確認しようとしましたが、とにかく呼ばれました。
追加された 著者 Buksy,
私はちょうどこれを見つけました。この panel_topology.Paint + =新しいPaintEventHandler(panel_topology_Paint); を削除しました。ビジュアルスタジオは私のハンドラをどこかで定義しなければなりません。
追加された 著者 Buksy,

ペイントイベントは、頻繁に再描画されるたびに発生します。あなたのペイントイベントハンドラのコードは、n回呼び出されることに対処できなければなりません。

2
追加された