그리기개요 [Windows Forms with C#]

안녕하세요. 언제나 휴일입니다.

1. Paint 이벤트

이번에는 Windows Forms 앱에서 그리기 방법을 소개할게요.

Windows Forms 앱은 시각화해야 할 영역이 생기면 Paint 이벤트가 발생합니다.

폼을 생성하여 Load할 때, 다른 창에 의해 가려졌다가 다시 보여질 때, 프로그램 방식에 의해 다시 그리는 영역으로 지정(무효화 영역으로 설정)할 때 Paint 이벤트가 발생한다고 볼 수 있어요.

이 때 Paint 이벤트 핸들러에 전달하는 Graphics 개체를 이용하여 그리기 작업을 진행합니다.

    
    public class PaintEventArgs : EventArgs, IDisposable
    {
        public PaintEventArgs(Graphics graphics, Rectangle clipRect);
        public Rectangle ClipRectangle { get; }
        public Graphics Graphics { get; }
    }

2. 그리기 예

다음은 Form1에 Paint 이벤트 핸들러를 등록한 후에 Graphics 개체를 이용하여 그리기 작업을 하는 간단한 예제입니다.

(실행 파일이 있는 위치에 demo.png 파일이 있어야 합니다.

using System.Drawing;
using System.Windows.Forms;

namespace Graphics_개요
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            Rectangle rect = new Rectangle(50, 50, 100, 100);
            Pen pen = new Pen(Color.Red, 10);
            graphics.DrawRectangle(pen, rect);
            Brush brush = new SolidBrush(Color.DarkCyan);
            graphics.FillRectangle(brush, rect);
            Font font = new Font("고딕", 12);
            graphics.DrawString("50,50", font, Brushes.Black, new PointF(25,25));
            graphics.DrawString("150,150", font, Brushes.Black, new PointF(125, 163));
            Image image = new Bitmap("demo.png");
            graphics.DrawImage(image, 200,0,image.Width/8,image.Height/8);
        }
    }
}

실행 화면
실행 화면

3. 코드 설명

이벤트 인자 e에 멤버 Graphics 속성은 현재 Forms에 그리기 할 수 있는 개체를 참조할 수 있어요.

            Graphics graphics = e.Graphics;

Grahpics 형식에는 점이나 선, 도형을 그릴 때 사용하는 다양한 메서드를 제공합니다.

그 중에 사각형을 그리는 메서드는 DrawRectangle입니다.

사각형을 그릴 때 어떠한 펜으로 어느 영역을 그릴 것인지 결정할 수 있습니다.

            Rectangle rect = new Rectangle(50, 50, 100, 100);
            Pen pen = new Pen(Color.Red, 10);
            graphics.DrawRectangle(pen, rect);

영역을 채울 때는 브러시를 사용합니다.

다음은 속이 꽉 찬 브러시로 사각 영역을 채우는 코드입니다.

            Brush brush = new SolidBrush(Color.DarkCyan);
            graphics.FillRectangle(brush, rect);

Graphics 개체를 이용하여 원하는 폰트로 글을 쓸 수도 있습니다.

다음은 크기가 12인 “고딕” 폰트로 문자열을 출력하는 코드입니다.

            Font font = new Font("고딕", 12);
            graphics.DrawString("50,50", font, Brushes.Black, new PointF(25,25));
            graphics.DrawString("150,150", font, Brushes.Black, new PointF(125, 163));

이미지 파일을 로딩하여 화면에 표시하거나 이미지를 그려 파일로 저장할 수도 있어요.

다음은 실행 파일이 있는 폴더에 있는 “demo.png”파일을 로딩하여 화면에 표시하는 코드입니다.

제가 사용한 원본 파일의 크기가 커서 가로, 세로를 1/8로 줄여서 나타냈습니다.

            Image image = new Bitmap("demo.png");
            graphics.DrawImage(image, 200,0,image.Width/8,image.Height/8);