4

マウスが panel2 の上に移動すると、線を引く必要があります。これまでのところ、私は次のことを行っています

public Form1()
{           
    InitializeComponent();            

}

private void panel2_Paint(object sender, PaintEventArgs e)
{
    if (isDragging)
    {
        letsPaint(sender, e);
    }
}

private void panel2_MouseMove(object sender, MouseEventArgs e)
{
    if (isDragging) 
    {
        mouseMoveX = e.X;
        mouseMoveY = e.Y;                               
        this.Paint += new PaintEventHandler(panel2_Paint);
    }
}

private void letsPaint(object sender, PaintEventArgs e) 
{             
    Pen blackpen = new Pen(Color.Black, 3);
    Graphics g = e.Graphics;
    g.DrawLine(blackpen, mouseClickedX, mouseClickedY, mouseMoveX, mouseMoveY);
    g.Dispose(); 
}

しかし、マウスを動かしても何も起こりません。ここで何か間違った PaintEventHandler() をしたと思います。これを行う方法と、これを行うためのより良い方法があれば教えてください。

また、私のメソッドはフォームに線を引くと思いますが、panel2に線を引く必要があります。実行する方法?前もって感謝します。

4

1 に答える 1

4

無効にします:

public Form1()
{           
  InitializeComponent();            
  panel2.Paint += new letsPaint;
}

private void panel2_MouseMove(object sender, MouseEventArgs e)
{
  if (isDragging) {
    mouseMoveX = e.X;
    mouseMoveY = e.Y;                               
    panel2.Invalidate();
  }
}

グラフィックオブジェクトを破棄しません(作成していません)が、ペンを実行します。

private void letsPaint(object sender, PaintEventArgs e) {             
  using (Pen blackpen = new Pen(Color.Black, 3)) {
    e.Graphics.DrawLine(blackpen, 
                        mouseClickedX, mouseClickedY, mouseMoveX, mouseMoveY);
  }
}

ビットマップで動作する簡単な方法を次に示します。

Bitmap bmp;
Point lastPoint;

public Form1() {
  InitializeComponent();
  bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height, 
                   System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

  panel1.MouseDown += panel1_MouseDown;
  panel1.MouseMove += panel1_MouseMove;
  panel1.Paint += panel1_Paint;
}

void panel1_Paint(object sender, PaintEventArgs e) {
  e.Graphics.DrawImage(bmp, Point.Empty);
}

void panel1_MouseMove(object sender, MouseEventArgs e) {
  if (e.Button == MouseButtons.Left) {
    using (Graphics g = Graphics.FromImage(bmp)) {
      g.DrawLine(Pens.Black, lastPoint, e.Location);
    }
    lastPoint = e.Location;
    panel1.Invalidate();
  }
}

void panel1_MouseDown(object sender, MouseEventArgs e) {
  lastPoint = e.Location;
}

これはちらつきますので、パネルをダブル バッファ パネルに交換することをお勧めします。このようなもの:

public class PanelEx : Panel {
  public PanelEx() {
    this.DoubleBuffered = true;
  }
}
于 2013-04-05T20:55:58.340 に答える