3

私はmsペイントに似た小さなペイントプログラムに取り組んでいます。現在、「select関数」を実装しようとしています。ちらつきの問題に直面しているので、いくつかの調査を行ったところ、独自のPanelクラスを作成する必要があることがわかりました。

public class MyDisplay : Panel
    {   
        public MyDisplay()
        {
            this.DoubleBuffered = true;            

            this.SetStyle(ControlStyles.UserPaint |
              ControlStyles.AllPaintingInWmPaint |
              ControlStyles.ResizeRedraw |
              ControlStyles.ContainerControl |
              ControlStyles.OptimizedDoubleBuffer |
              ControlStyles.SupportsTransparentBackColor
              , true);

            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            this.UpdateStyles();
        }
    }

メインフォームには次のフィールドがあります。

MyDisplay panel1 = new MyDisplay();
Graphics graphics1 = panel1.CreateGraphics();

パネルで3つのイベントを使用します。

  1. MouseDown-ここに到達ポイントp1
  2. MouseMove-ちらつきの問題が発生する場所で、電話をかけていて graphics1.drawRectangle(...)graphics1.Clear()クリックするたびにマウスが移動します
  3. MouseUp-最後に長方形を描画します。

それのどこが悪いんだい?パネル全体が白く、長方形が1つしかないのに、ちらつきの問題が発生するのはなぜですか?ありがとうございました。

編集:

OnPaintメソッドを上書きしましたが、次に何をすべきかまだわかりません。

   protected override void OnPaint(PaintEventArgs e)
    {
        // Call the OnPaint method of the base class.
        base.OnPaint(e);
        // Call methods of the System.Drawing.Graphics object.
        e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle);
    } 

edit2:ビットマップ/画像にペイントし、OnPaintメソッドをオーバーライドして、そこから画像をコピーしてパネルに貼り付ける必要がありますか?

4

1 に答える 1

1

graphics1フィールドを定義する行を削除します。

PaintEventArgsオブジェクトとともに渡されたGraphicsオブジェクトを使用して、OnPaintのオーバーライドですべてのペイントを実行します。メソッドInvalidate()、Refresh()、およびUpdate()を使用して、他のコードからの再描画のタイミングを制御します。

この設計で特定の問題が発生した場合は、コールバックしてください。

于 2013-03-16T17:03:15.573 に答える