ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GDI + 네이버 지식인 그림 저장하며 그리기 예제
    .NET/GDI + 2008. 12. 11. 22:52
    반응형




    C#에서 그림판을 만들때 선이 겹치면 지워지지 않게 하는 해결방법 아시는분?

    tacks02006.11.06 13:59

    답변 2| 조회 358

    마우스가 무브일때 그려지게 만들었는데  전에 그렸던선을 화이트팬으로 지우고 새선을 검정색팬으로 그렸습니다  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);
                  
            }

            
        }
    }

    신고

    의견 쓰기

    질문자 채택된 경우, 추가 답변 등록이 불가합니다.

    질문자 선택

    re: C#에서 그림판을 만들때 선이 겹치면 지워지지 않게 하는 해결방법 아시는분?

     leiria4u

    답변채택률96.0%

    2006.11.06 16:54

    그냥 설명하기에는 좀 복잡하니 간단한 예제 하나 만들어봤네요^^;

    bitmap하나를 만들어서 이때까지 그린 그림을 계속 저장해 나가는 식입니다.

    G는 Form1에 대한 그래픽클래스이며,

    G2는 Bitmap에 대한 그래픽클래스입니다.

    2005로 제작한지라 전체 소스는 올리기 힘들어 Form 안의 필요한 소스만 올렸습니다.

    밑의 내용을 붙여넣기하시고, 이벤트만 등록시켜주면 무난히 실행되실겁니다^^


    Graphics G;
    Graphics
     G2;
    Bitmap
     bit;
    Point
     OldPt;
    Pen
     myPen;
    bool
     ButtonDown;

    public
     Form1()
    {
        InitializeComponent();
    }

    private
     void Form1_Load(object sender, EventArgs e)
    {
        G = 
    this.CreateGraphics();
        bit = 
    new Bitmap(400, 300, G);
        G2 = 
    Graphics.FromImage(bit);
        G2.Clear(
    Color.White);
        myPen = 
    new Pen(Color.Blue, 2);
        ButtonDown = 
    false;
    }

    private
     void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        OldPt = 
    new Point(e.X, e.Y);
        ButtonDown = 
    true;
    }

    private
     void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        ButtonDown = 
    false;
        G2.DrawLine(myPen, OldPt, 
    new Point(e.X, e.Y));
    }

    private
     void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        
    if (ButtonDown)
        {
            G.DrawImage(bit, 0, 0);
            G.DrawLine(myPen, OldPt, 
    new Point(e.X, e.Y));
        }
    }

    private
     void Form1_Paint(object sender, PaintEventArgs e)
    {
        G.DrawImage(bit, 0, 0);
    }


    반응형

    '.NET > GDI +' 카테고리의 다른 글

    GDI + 비트맵 이미지 저장 관련 예제  (0) 2008.12.12
    C# "GDI폴리곤";  (0) 2008.11.18
    C# GDI32 GDI plus  (0) 2008.11.18
    C# 리스트박스 개별 색깔넣기 GDI 사용  (0) 2008.11.18

    댓글

Designed by Tistory.