Win32_API - Pen & Brush (그리기 도구)

컴퓨터/Win32-API

728x90
반응형

서론

지난 포스트에서 RGB의 개념을 통해 색을 얻어내는 방법을 배웠습니다. 이제 색상을 선택했다면 어떤 도구를 이용해서 그림을 그릴지 선택해야 됩니다. 

본문에서는 가장 대표적인 Pen 과 Brush에 대하여 알아보도록 합시다.

 

실제로 그림을 그리는 것과 비슷한 개념이다.

만약 여러분들이 종위이에 테두리는 검은색에 안에는 빨간색인 원을 그린다고 가정합시다. 

  • 우선 검은색 팬을 들고 원을 그린다.
  • 이후 빨간색 팬을 들고 원을 채운다.

위와 같은 개념이 될 것입니다. 

Windows 프로그래밍에서도 비슷합니다. 선과 같은 개념에는 Pen, 채우기와 같은 개념에는 Brush가 들어간다고 생각하시면 됩니다.

 

사용하기 위한 순서 - 1. handle 생성하기

우선 Pen이든 Brush든 원하는 종류의 색을 가진 장비가 필요하기 때문에 소스코드상에서 만들어 주어야 합니다. 

 

예시

HBRUSH myBrush = CreateSolidBrush(RGB(255, 0, 0));
HPEN myPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));

 

  • Brush의 경우 CreateSolidBrush(RGB(R,G,B))
  • Pen의 경우 CreatePen(스타일, 두께, RGB(R, G, B))

사용하기 위한 순서 - 2. 도구 사용하기 (적용하기)

이제 생성된 장비들을 사용하려면 손에 들고 있어야 되는 것처럼 사용을 하려면 프로그래밍에서 이 녀석을 사용한다고 인식시켜주는 과정이 필요합니다. 

 

//예제 소스코드 에러 유발가능성이 있음 ! 사용 XX
SelectObject(hdc, myBrush);
SelectObject(hdc, myPen);

여기서 중요한 점!!

그리기 도구를 가지고 온다면 이전에 가지고 있던 기본적인 도구들은 어떻게 될까?

기본적으로 그리기 도구가 없이 그리기를 요청하면 어떻게 될까?

위와 같은 질문이 생길수 있습니다. 이러한 문제는 에러를 발생하게 됩니다. 그래서 아래의 4번 내용 또한 적용이 불가능 합니다. (그리기 도구 해제가 불가능하다.)

위와같은 문제로 인해 Windows 응용 프로그래밍에서 SelectObject함수는 기존에 있던 원래의 그리기 도구를 반환해 줍니다.

따라서, 우리는 기존의 그리기 도구를 가지고 있어야만 됩니다. 그래야만 사용한 이후 그리기 도구를 정상적으로 제거하고 원래의 상태로 돌아갈 수 있습니다.

다시 정리하자면 소스코드는 아래와 같이 될 것입니다.

HBRUSH OldBrush = (HBRUSH)SelectObject(hdc, myBrush);
HPEN OldPen = (HPEN)SelectObject(hdc, myPen);

함수를 통해 새로운 그리기 도구를 적용하고 기존의 그리기 도구를 받아 놀 공간을 만들어 둔 것입니다.

 

사용하기 위한 순서 - 3. 그리기

Windows 프로그래밍에서는 다양하게 그릴 수 있는 방법을 제공합니다. 본문에서는 간단하게 사각형을 그린다고 가정하고 예제 소스코드를 제공하겠습니다.

Rectangle(hdc, 200,50,500,400);

이 사각형은 검은색 팬과, 빨간색 브러시로 칠한 상태의 사각형이 그려졌을 것입니다.

 

사용하기 위한 순서 - 4. 만든 도구 삭제하기

그리기를 모두 사용했다면, 가상의 공간에 만들어둔 펜과 브러시는 필요 없습니다. 프로그램에서는 불필요한 자원이 되기 때문입니다. 

따라서 모두 사용했다면 더 이상의 자원을 소모하지 않기 위해 없애 주어야 효율적입니다.

2번에서 말한 것과 같이 자원을 소모하기 위해 정상적으로 없애주려면, 하나의 그리기 도구는 선택되어야만 합니다.

따라서 다시 원래의 그리기 도구를 선택한 후 만든 그리기 도구를 삭제합니다.

 

SelectObject(hdc, OldBrush);
SelectObject(hdc, OldPen);
DeleteObject(myBrush);
DeleteObject(myPen);

 

주의사항

반드시 하나 이상의 그리기 도구를 들고 있어야만 합니다. 

만약 들고 있는 그리기 도구를 DeleteObject를 통해 지우려고 하면 에러는 없지만 사실상 지워지지 않은 메모리 누수의 현상이 발생하게 됩니다. 

 

 

 

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :