마우스가 무브일때 그려지게 만들었는데 전에 그렸던선을 화이트팬으로 지우고 새선을 검정색팬으로 그렸습니다 vc++에서 레스터 오퍼레이션 있는데 c#에서는 어떤식으로 그리는거를 구현해야될지 모르겠습니다.
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace 그림판
{
public partial class Form1 : Form
{
//[DllImport("user32.dll")]
//public static extern int FindWindow(string className, string classTile);
public Point pt1 = new Point();//start point
public Point pt2 = new Point();//end point
private bool bDraw = false;
enum drawSelect {line=1, ellipse=2, rectangle=3 };//
drawSelect ds;//enum 변수
//Shape[] arr = new Shape[100];
ArrayList saveAL= new ArrayList();
Rectangle reDrawRect;
public struct Shape
{
public int shapeinfo;
public Point Spt;//시작점
public Point Ept;//끝점
};
Shape shape; //구조체변수
//Shape shapeDraw;
public Form1()
{
InitializeComponent();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, ClientRectangle);
reDrawRect=e.ClipRectangle;
if (bDraw)
{
for (int i = 0; i < saveAL.Count; i++)
{
if (((Shape)saveAL[i]).shapeinfo == (int)drawSelect.line)
{
g.DrawLine(Pens.Black, ((Shape)saveAL[i]).Spt, ((Shape)saveAL[i]).Ept);
}
else if (((Shape)saveAL[i]).shapeinfo == (int)drawSelect.ellipse)
{
// Rectangle r = new Rectangle(((Shape)saveAL[i]).Spt.X, ((Shape)saveAL[i]).Spt.Y, ((Shape)saveAL[i]).Ept.X, ((Shape)saveAL[i]).Ept.Y);
g.DrawEllipse(Pens.Black, ((Shape)saveAL[i]).Spt.X, ((Shape)saveAL[i]).Spt.Y, ((Shape)saveAL[i]).Ept.X, ((Shape)saveAL[i]).Ept.Y);
}
else if (((Shape)saveAL[i]).shapeinfo == (int)drawSelect.rectangle)
{
//Rectangle r = new Rectangle(((Shape)saveAL[i]).Spt.X, ((Shape)saveAL[i]).Spt.Y, ((Shape)saveAL[i]).Ept.X, ((Shape)saveAL[i]).Ept.Y);
g.DrawRectangle(Pens.Black, ((Shape)saveAL[i]).Spt.X, ((Shape)saveAL[i]).Spt.Y, ((Shape)saveAL[i]).Ept.X, ((Shape)saveAL[i]).Ept.Y);
}
}
}
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (bDraw)
{
pt1.X = e.X;
pt1.Y = e.Y;
}
}
private void Form1_Load(object sender, EventArgs e)
{
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Graphics g = this.CreateGraphics();
if (bDraw)
{
if (e.Button == MouseButtons.Left)
{
switch (ds)
{
case drawSelect.line:
g.DrawLine(Pens.White, pt1, pt2);
pt2.X = e.X;
pt2.Y = e.Y;
g.DrawLine(Pens.Black, pt1, pt2);
break;
case drawSelect.rectangle:
g.DrawRectangle(Pens.White, pt1.X, pt1.Y, pt2.X, pt2.Y);
g.DrawRectangle(Pens.Black, pt1.X, pt1.Y, e.X - pt1.X, e.Y - pt1.Y);
pt2.X = e.X - pt1.X;
pt2.Y = e.Y - pt1.Y;
break;
case drawSelect.ellipse: //넓이 폭
g.DrawEllipse(Pens.White, pt1.X, pt1.Y, pt2.X, pt2.Y);
g.DrawEllipse(Pens.Black, pt1.X, pt1.Y, e.X - pt1.X, e.Y - pt1.Y);
pt2.X = e.X - pt1.X;
pt2.Y = e.Y - pt1.Y;
break;
}
}
}
//
// g.Dispose();
}
private void rect_Click(object sender, EventArgs e)
{
bDraw = true;
ds = drawSelect.rectangle;
}
private void ellipse_Click(object sender, EventArgs e)
{
bDraw = true;
ds = drawSelect.ellipse;
}
private void line_Click(object sender, EventArgs e)
{
bDraw = true;
ds = drawSelect.line;
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
shape.shapeinfo = (int)ds;
shape.Spt = pt1;
shape.Ept.X = pt2.X;
shape.Ept.Y = pt2.Y;
saveAL.Add(shape);
}
}
}