티스토리 뷰

목차

    반응형

    C# 그림판 - GDI 코딩배우기 (닷넷 윈폼 GUI 프로그래밍 강좌)


    제가 학생 시절에 만들었던 C# 그림판입니다. 지금 다시 보니 null 여부도 거르지 않고 엉망으로 만들어 놨네요. 어쨌든, 일단 공유하는 차원에서 업로드 합니다.


    C# 그림판 첨부파일


    프로젝트 전체 압축 파일 : PaintEx.cs [다운]

    윈폼 디자이너 소스 : PaintEX.Designer.cs [다운]

    윈폼 기능 구현 소스 : PaintEX.zip [다운]

    MSDN에서 참조한 DrawData 클래스 : DrawData.cs [다운]


    c# 그림판c# 그림판

    1. PaintBox 초기화


    바로 아래 코드는 프로그램을 처음 실행할 때, 수행되는 코드입니다. C# 그림판 Form이 로드 될 때 불려지는 코드가 되겠죠.

    ResizeRedraw의 값을 기준으로 GDI를 갱신합니다. 저 부분을 중심으로 보면 됩니다. (GDI 갱신을 확실히 해줘야 동적 그리기가 가능합니다)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void Form1_Load(object sender, EventArgs e)
    {
        Invalidate();
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);
     
        // 그림이 잔상을 남기지 않도록 설정
        // UserPaint가 True 값을 가질 때만 그리도록 설정
     
        ResizeRedraw = true// 크기 조정 시 다시 그림
    }
    cs


    이로써, C# 그림판 폼에서의 그림은 항상 유지될 수 있습니다. 그러나 이건 외곽의 틀만 잡은 것이고 세부적으로도 함수를 정의해 줘야 합니다. 자세한 구현 과정은 바로 아래 소스 코드로 확인해 보세요.


    C# 그림판 gdiC# 그림판


    2. OnPaint 함수 소스


    OnPaint 함수에선 saveData 같은 ArrayList에 담긴 좌표와 색상 정보를 이용해 C# 그림판 폼 위에 요소들을 계속 갱신합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    protected override void OnPaint(PaintEventArgs e)
    {   // OnPaint 재정의
     
        Graphics g = e.Graphics; // 그리기 객체 생성
     
        // 4개의 ArrayList에 따로 저장된 선과 도형들을 모두 그려줌
        foreach (DrawData outData in saveData)
        {
            outData.drawData(e.Graphics);
        }
     
        foreach (DrawData outData in saveLine)
        {
            outData.drawData(e.Graphics);
        }
     
        foreach (DrawData outData in saveCircle)
        {
            outData.drawData(e.Graphics);
        }
     
        foreach (DrawData outData in saveRectangle)
        {
            outData.drawData(e.Graphics);
        }
    }
     
    cs

    3. ArrayList 소스에 도형 저장


    이 C# 그림판 프로그램에선 선, 원, 사각형, 곡선을 제공하는데, 각각의 좌표 정보는 ArrayList에 별도로 저장이 됩니다.


    c# gdiC# 그림판


    1
    2
    3
    4
    5
    6
    Point startPoint, nowPoint; // 시작 좌표와 현재 좌표
     
    ArrayList saveData;         // 커브가 생길 때 마다 저장, 취소 전용
    ArrayList saveCurve;        // 커브 좌표가 누적되어 저장, 그리기 전용
     
    ArrayList saveLine, saveCircle, saveRectangle;
    cs


    소스를 보실 때, 마우스 이벤트와 이 ArrayList의 관계만 잘 파악하시면 되겠어요. 소스가 그렇게 복잡하진 않네요.


    GDI 코딩배우기C# gdi


    이상으로 윈폼 GUI 프로그래밍 예제를 끝내며 더 많은 GDI 강좌는 아래 포스트를 참조해 주세요.


    << 더 보기 >>


    - MFC - GDI+ LCD CONTROL (그래픽 라이브러리)

    - C# 3D 프로그래밍, GDI+ Euler Rotation 표현

    - C# 윈도우 핸들 예제, 다른 프로그램에 도형 그리기 (Graphics)



    C# 그림판 - GDI 코딩배우기 (닷넷 윈폼 GUI 프로그래밍 강좌)

    반응형