본문 바로가기
C++ 200제/코딩 IT 정보

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

by vicddory 2017. 1. 13.

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 프로그래밍 강좌)

댓글