티스토리 뷰

Visual Studio 2012


다이얼로그 크기 조절시 안에 있는 컨트롤 사이즈도 자동으로 조절해보자.


간단히 컨트롤을 조절하기 위해 인터넷 검색 중 덴마크의 Marc Richarme 아저씨가 만든 EasySize란 좋은 매크로를 발견하여 공유합니다.


소스는 여기서 받는다.


easysize_src.zip


EasySize 사용하기


1. 받은 EasySize.h 파일을 프로젝트의 stdafx.h에 포함시킨다.


// ...
#include "EasySize.h"
//...


2. 클래스 선언함수 안에 DECLARE_EASYSIZE를 추가한다. (세미콜론을 넣지 않는다.)


// ...
// TestDlg.h : 헤더 파일
// CTestDlg 대화 상자
class CTestDlg : public CDialog
{
	//...
	DECLARE_EASYSIZE
	//...
}
//...


3. OnInitDialog 가상함수를 생성하고 마지막 부분에 "INIT_EASYSIZE;"를 추가한다.


// ...
// TestDlg.cpp : 구현 파일
//
BOOL CTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	//...
	INIT_EASYSIZE;

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
//...


4. WM_SIZE 메시지 처리기를 만들고 "UPDATE_EASYSIZE;"를 추가한다.


// ...
// TestDlg.cpp : 구현 파일
//
void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);
	UPDATE_EASYSIZE;
}
//...


5. 옵션 - 다이얼로그의 최소사이즈를 지정하고 싶다면 WM_SIZING 메시지 처리기를 만들고 EASYSIZE_MINSIZE 매크로를 아래와 같이 추가한다.

아래의 예제는 X,Y 최소 사이즈를 400으로 고정시켜서 400 이하로 크기를 줄일 수 없게 한다.


// ...
// TestDlg.cpp : 구현 파일
//
void CTestDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
	CDialog::OnSizing(fwSide, pRect);
	EASYSIZE_MINSIZE(400, 400,fwSide,pRect);
}
//...


6. 이제 EasySize 맵을 만들어보자. 이 부분이 다이얼로그 크기 조절 시 각각의 컨트롤의 행동을 지정하게 된다.

클래스 구현 함수 안에 어디든 넣으면 되는데 보통 END_MESSAGE_MAP() 이후에 넣는다. 형식은 아래와 같다.


// ...
BEGIN_EASYSIZE_MAP(class_name)
    ...
    EASYSIZE(control,left,top,right,bottom,options)
    ...
END_EASYSIZE_MAP
//...


예제로 표현된 소스는 아래를 참조한다.


// ...
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_EASYSIZE_MAP(CTestDlg)
    EASYSIZE(IDC_TITLE,ES_BORDER,ES_BORDER,
        ES_BORDER,ES_KEEPSIZE,ES_HCENTER)
    EASYSIZE(IDC_RADIO1,ES_BORDER,ES_BORDER,
        ES_KEEPSIZE,ES_KEEPSIZE,0)
    EASYSIZE(IDC_RADIO2,ES_BORDER,ES_BORDER,
        ES_KEEPSIZE,ES_KEEPSIZE,0)
    EASYSIZE(IDC_CONTENT,ES_BORDER,ES_BORDER,
        ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_STATUSFRAME,ES_BORDER,ES_KEEPSIZE,
        ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_STATUS,ES_BORDER,ES_KEEPSIZE,
        ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,
        ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,
        ES_BORDER,ES_BORDER,0)
    EASYSIZE(IDC_MYICON1,ES_BORDER,IDC_RADIO2,IDC_CONTENT,
        IDC_STATUSFRAME,ES_HCENTER|ES_VCENTER)
    EASYSIZE(IDC_MYICON2,ES_BORDER,ES_BORDER,IDC_TITLE,
        ES_KEEPSIZE,ES_HCENTER)
END_EASYSIZE_MAP

///////////////////////////////////////////////////////////////
// CTestDlg message handlers
//...


막연히 보면 어려울 것이다. 위에 표기된 EASYSIZE 매크로에 대해 알아보자.



EASYSIZE 매크로


1. 매크로 함수 원형은 아래와 같다.


// ...
EASYSIZE(control,left,top,right,bottom,options)
//...


- control: 매크로를 사용할 매개 컨트롤의 ID를 입력하면 된다.


- left, top, right, bottom: 크기 조절에 관련된 매개변수로 컨트롤의 ID를 입력하거나, ES_BORDER 나 ES_KEEPSIZE를 입력하면 된다. 설명하기가 애매하여 직접 본인이 사용하며 느끼는게 좋다. 필자는 이 설정하는 부분을 테스트하며 갈고리를 떠올렸다. ES_BORDER나 다른 컨트롤 ID를 넣으면 해당 파트와 맞닿는 부분에 갈고리를 걸어서 크기를 늘이는데 사용하거나 ES_KEEPSIZE를 사용하여 갈고리를 해제해서 크기를 일정하게 유지하면서 이동할수 있게 한다는 느낌을 받았다.


예를들어, 컨트롤 하나에 left를 ES_KEEPSIZE로 하고 right를 ES_BORDER로 한다면 대화상자를 우측으로 늘리게 되면 left는 갈고리를 떼고 오른쪽은 대화상자 끝에 갈고리를 걸어서 컨트롤이 오른쪽으로 끌려오게 된다. left에도 동일하게 ES_BORDER를 적용한다면 대화상자 양쪽 끝에 갈고리를 걸었으니 좌우를 늘리게되면 컨트롤이 늘어나게 된다.


options: 해당 컨트롤의 정렬 관련 옵션을 설정할 수 있다. ES_HCENTER/ES_VCENTER/0 을 입력할수 있다.(아무것도 사용하고 싶지 않으면 0을 쓴다)

ES_HCENTER는 가로 기준인 left와 right에서 설정한 값 기준으로 가운데를 맞춘다. ES_VCENTER는 세로 기준인 top와 bottom에서 설정한 값 기준으로 가운데를 맞춘다.




참조 본문: 코드프로젝트 사이트

댓글