티스토리 뷰
Visual Studio 2012
다이얼로그 크기 조절시 안에 있는 컨트롤 사이즈도 자동으로 조절해보자.
간단히 컨트롤을 조절하기 위해 인터넷 검색 중 덴마크의 Marc Richarme 아저씨가 만든 EasySize란 좋은 매크로를 발견하여 공유합니다.
소스는 여기서 받는다.
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에서 설정한 값 기준으로 가운데를 맞춘다.
끝
참조 본문: 코드프로젝트 사이트
'Programming > MFC(C++)' 카테고리의 다른 글
[MFC] 레지스트리(Registry) 활용하여 값 저장/불러오기 (0) | 2018.11.29 |
---|---|
[MFC] 스레드(Thread) 활용하기 (5) | 2018.11.29 |
[MFC] 운영체제(OS) Bit 확인하기 (0) | 2018.10.26 |
[MFC] CreateProcess와 CreatePipe를 이용하여 ping command 실행 하고 결과 읽기 (0) | 2018.10.26 |
[MFC] CListCtrl 클립보드 복사 구현하기(Ctrl+C 기능 구현) (1) | 2018.10.26 |
- Total
- Today
- Yesterday
- 부가가치세
- Modeless
- 청년내일채움공제
- 소켓
- SendMessage
- MFC
- MFC Modeless
- CMFCBUTTON
- MFC ADO
- 해외송금확인
- 항공알파벳
- c++
- 부가가치세전산매체
- ADODB
- 전자신고파일설명서
- 프로세스이름변경
- 스티커메모로드중
- 스쿠트항공 환불받기
- #자동업데이트
- 모달리스
- MXCOMPONENT
- 전자신고변환
- Sticky Notes Loading
- sqlite3
- 세금계산서합계표양식
- MSSQL
- 청년내일채움공제 만기신청
- 법정동코드
- ADO
- 모달리스 다이얼로그
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 |