본문 바로가기

Programming/Win32&MFC&COM

윈도우 리전(Region) 설정해서 윈도우 모양 바꾸기

반응형

윈도우 리전(Region)은 똑같은 사각형 형태의 밋밋한 윈도우의 모습을 바꿔줍니다.

자기가 만들고 싶은 모양을 얼마든지 만들 수 있습니다.

윈도우 리전을 생성하는 API함수는 다음과 같이 있습니다.

CreatePolygonRgn();
CreateRectRgn();
CreateEllipticRgn();

딱 봐도 그 용도가 보이는 참 착한 함수입니다.

Polygon은 다각형, Rect는 사각형, Elliptic은 원을 그리는 용도로 쓰입니다.

이 함수들 외에도 생성된 리전을 합쳐주는 함수와 만들어진 리전을 화면에 세팅하는 함수가 있습니다.

CombineRgn();
SetWindowRgn();

이 함수들이 그런 역할을 수행하는 함수입니다.

CombineRgn() 은 만들어진 리전을 합치는데 사용하는 함수입니다.

SetWindowRgn() 은 화면에 셋팅하는 역할을 합니다.

이렇게 알아봤지만, 우리가 이용할 것은 사실 이게 아닙니다.

왜냐하면 이 방법으로 정교한 그림을 표현하기는 아무래도 무리가 따르기 때문입니다.

그럼 다른 방법으로 해보도록 하겠습니다.

http://www.codeguru.com/code/legacy/tools/RGNCreator_src.zip
http://www.codeguru.com/code/legacy/tools/RGNCreator_demo.zip

이 2개를 우선 받습니다.(첨부파일을 다운 받아도 됩니다.)

압축을 풀고 RGNCreator_demo의 폴더에 있는 RGNerator.exe를 실행해 보겠습니다.

Browse 를 눌러서 내가 편집하고 싶은 그림(bmp파일)을 클릭합니다.

그러면 Enter Image File Name 이라는 부분에 선택한 그림의 경로가 나옵니다.

다 했으면 Pick 버튼을 클릭합니다.

그러면 불러온 그림이 보이고 그림에 마우스 커서를 올려놓으면 스포이드 모양으로 마우스 커서의 모양이 바뀝니다.

여기서 내가 투명하게 만들고 싶은 색깔을 선택하면 됩니다.

배경(하얀색)에 마우스 커서를 대고서 오른쪽 마우스를 클릭하면 우측의 검은색이 하얗게 바뀝니다.

이것은 저 배경(하얀색)을 모두 투명으로 처리하겠다는 말입니다.

그리고서 OK버튼을 눌러줍니다.

그리고서 좌측에 있는 버튼(검은 버튼)인 CREATE 를 눌러주고 rgn 파일을 저장합니다.

이제 우리의 프로젝트에 적용해 보겠습니다.

새로운 프로젝트를 만들고 MFC Application 프로젝트를 선택합니다.

일단 test란 이름으로 생성하겠습니다.

Dialog based로 변경합니다.

MFC 라이브러리를 DLL로 사용할 것인지 static library로 사용할 것인지 체크합니다.

사용자 인터페이스 기능에서는 모든 기능을 제거했습니다.

필요한 기능은 추가해도 되지만 윈도우 모양을 변경할 것이기 때문에 굳이 필요가 없으면 삭제합니다.

나머지 필요한 설정을 진행하고 프로젝트를 생성합니다.

적용은 다음과 같은 순서로 진행합니다.

먼저 적용할 비트맵 파일과 생성된 rgn 파일을 프로젝트 폴더로 위치시킵니다.

리소스 뷰(Resource View)에서 리소스를 추가합니다.

Import를 누르고 생성된 rgn 파일을 추가해 줍니다.

rgn 파일이 보이지 않을 때는 파일 타입을 All Files로 변경합니다.

리소스 형식을 설정하는데 다음과 같이 RGN이라고 입력하면 됩니다.

리소스 뷰에 RGN 타입이 새로 생긴 것이 보입니다.

리소스 명을 "IDR_RGN1" 으로 바꿔줍니다.(""포함해서 써줘야 합니다.)

BMP 파일을 동일한 방법으로 추가합니다.

다음으로 해줘야할 작업은 리소스에서 다이어로그를 설정해주는 것입니다.

다이얼로그에 있는 컨트롤을 모두 삭제합니다.

그리고 맨 우측의 속성창에서 Border를 None으로 바꿔주면 테두리가 사라집니다.

속성창이 보이지 않을 때는 메뉴의 VIEW로 들어가서 Other Windows의 Property Window를 선택하면 됩니다.

그리고서 다이어로그에 Picture Control을 추가합니다.

적당히 범위를 잡아서 만들어주고 좌상단에 꼭지점를 맞춰줍니다.

리고 다이얼로그 크기를 그림에 딱 맞춰줍니다.

그리고 속성 창에서 Picture Box의 몇가지 속성을 바꿔줍니다.

(다이어로그의 속성이 아님!)

일단 Type을 Bitmap으로 바꿔줍니다.

그러면 Image 부분이 선택이 가능한데, 추가했던 IDR_BITMAP1을 선택해줍니다.

그리고 마지막 컨트롤의 ID를 IDC_BKIMAGE로 바꿔줍니다.

(RGNDLG 부분에서 그렇게 참조하고 있습니다.)

코드를 적용하기 위해 RGNCreator_src 폴더에서 다음 2개 파일을 Project 폴더로 옮깁니다.

Project 폴더의 CPP와 H파일 있는 곳에 옮겨주면 됩니다.

RGNDLG.CPP
RGNDLG.H

옮기고서 이제 이 H파일을 include 시키고 testDlg의 h를 수정하겠습니다.

이렇게 헤더 파일을 추가해주고 코드를 변경하면 됩니다.

CPP 파일은 다음과 같이 수정하면 됩니다.

생성자가 이렇게 정의되어 있는데 CRGNDlg를 상속하도록 변경합니다.

CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CtestDlg::IDD, pParent)

위의 코드를 다음과 같이 변경합니다.

CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
	: CRGNDlg(CtestDlg::IDD, pParent, _T("IDR_RGN1"))

"IDR_RGN1" 부분은 추가한 RGN 리소스의 ID입니다.

그리고나서 소스코드 안에 있는 CDialogEx를 찾아서 CRGNDlg로 모두  바꿔줍니다.

기본적으로는 다음의 네 곳에 CDialogEx가 사용됩니다.

CDialogEx::DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)
CDialogEx::OnInitDialog();
CDialogEx::OnPaint();

솔루션 뷰(Solution View)의 파일 목록에 추가한 RGNDLG.CPP와 RGNDLG.H를 이동시킵니다.

마지막으로 RGNDLG.CPP의 상단에 존재하는 #include "rgndemo.h"를 변경합니다.

test라는 이름으로 프로젝트를 생성했기 때문에 #include "test.h" 로 변경하면 됩니다.

유니코드 프로젝트 생성할 경우에는 한 군데서 더 에러가 발생하는데 다음 코드를 수정합니다.

hResInfo = FindResource(AfxGetInstanceHandle(), m_rgnfile,"RGN");

아래와 같이 수정하면 됩니다.

hResInfo = FindResource(AfxGetInstanceHandle(), m_rgnfile, _T("RGN"));

컴파일을 한 이후에 작업한 내용을 확인하기 위해서 실행합니다.

정상적으로 표시가 되는 것을 확인할 수 있습니다.

메뉴가 없기 때문에 창의 아무 부분이나 클릭한 상태로 드래그하면 창이 이동합니다.

이동할 때는 테두리만 그려지는 것을 확인할 수 있습니다.

이것으로 편리하게 복잡한 형태의 리전을 적용할 수 있습니다.



반응형