■14695 |
Re[19]: パネル内の座標値、そして座標値の範囲を設定す |
□投稿者/ 魔界の仮面弁士 -(2008/02/25(Mon) 15:40:03)
| ■No14692 (Tetsu さん) に返信
> private void button1_Click(object sender, EventArgs e)
> {
> panel2.Paint += panel2_Paint;
> panel2.Invalidate();
> }
クリックするたびに、Paint イベントを割り当ててはマズイと思いますよ。
最初に一度だけ割り当てておけば十分です。
ここでは -= せずに、+= ばかり繰り返していますので、一度の
再描画要求に対し、同じ描画処理が複数回繰り返されてしまっています。
No14463のコードは、「Paint で処理する場合/何も処理しない場合」を
切り替えているからあのようなコードになっているのであって、
今回のように、常に自分で描画したい場合には当てはまりません。
> //座標値を得て、描画をさせるメソッドを呼び出す
> this.myDraw.DrawMovingObjects();
> panel2.Invalidate();
座標値を得るまでは良いですが、実際の描画処理は Paint に記述してください。
Invalidate メソッドを呼び出せば、Paint イベントも連動して発生します。
逆に、Paint イベントを使いたく無いのであれば、座標値を得た後、
画像を Bitmap クラスにして、それを BackgroundImage に割り当てましょう。
座標データが変更されたタイミングは、DrawingMOD クラスで
把握できるでしょうけれども、描画すべきタイミングを
把握できるのは、(DrawingMOD ではなく)コントロール自身です。
> PaintEventArgs e = new PaintEventArgs(m_control.CreateGraphics(), m_control.ClientRectangle);
上記のコードでは、Graphics の破棄処理が抜け落ちています。
もしも CreateGraphics するのであれば、作成した Graphics は、
呼び出し元が責任を持って破棄しなくてはいけません。
また、そもそも Paint イベントとは、スクロールした場合などに応じて、
OS が「再描画が必要になった」事を知らせるために発生させるものです。
プログラムから発生させたいのであれば、Invalidate/Update/Refresh 等を
使うべきであって、外部から CreateGraphics して呼び出すような物ではありません。
http://dobon.net/vb/dotnet/control/refreshupdateinvalidate.html |
|