728x90
안녕하세요!
이번 글에서는 MFC 이벤트 함수 중 OnSize함수에 대해 알아보겠습니다.
OnSize는 MFC에서 제공하는 CWnd 클래스를 상속받은 모든 클래스에서 사용할 수 있습니다.
함수원형
afx_msg void OnSize(
UINT nType,
int cx,
int cy);
매개변수
UINT nType
- 크기조절 타입을 지정해 줍니다. 이 타입은 매크로로 지정이 되어 있습니다.
- SIZE_MAXIMIZED : 창 최대화
- SIZE_MINIMIZED : 창 최소화
- SIZE_RESTORED : 창의 크기가 조정됨(Maximize / Minimize 적용 안됨.)
- SIZE_MAXHIDE 다른창이 최대화 되면 메시지가 모든 팝업 창으로 전송됩니다.
- SIZE_MAXSHOW : 다른창이 이전 크기로 복원되면 메시지가 모든 팝업창으로 전송됩니다.
int cx
- 클라이언트 영역의 가로크기
int cy
- 클라이언트 영역의 세로크기
예제코드
void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 다이얼로그의 크기에 맞춰서 버튼이 일정 크기로 조정됨.
m_BTN_TEST.MoveWindow(10, 10, cx - 20, cy - 20);
}
- MFC 프로젝트를 생성 해 다이얼로그 클래스에 WM_SIZE이벤트 함수를 추가시키고 위 예제코드처럼 CButton 컨트롤변수를 MoveWindow해줍니다.
- 이 예제를 빌드하면 Debug Assertion Failed! 라는 오류메시지가 발생합니다.
오류메시지가 발생 한 이유
- OnSize 함수는 다이얼로그 라이프사이클에 의해 DoDataExchange 함수보다 먼저 호출이 됩니다.
- 때문에 변수와 리소스ID가 연결이 되지 않은 상태로 OnSize이벤트가 발생해 내부 코드인m_BTN_TEST의MoveWindow함수가 호출이 됩니다.
- MoveWindow동작 특성 상 해당하는 컨트롤의 리소스를 찾지못하여 발생하는 오류입니다.
오류 해결방법
/* 클래스의 헤더파일 */
private:
//OnInitDialog함수 호출 플래그
bool m_bInit;
- 클래스 헤더파일 private 영역 내부에 위와같이 bool 변수를 선언하여 줍니다.
/* 다이얼로그 클래스의 생성자 */
{
//생성자 내부 내용 생략
//생성과 동시에 false로 초기화.
m_bInit = false;
}
- 헤더파일에 선언한 변수를 생성자 내부에서 false로 초기화 하여 줍니다.
/* 다이얼로그 클래스의 OnInitDialog 함수 내부 */
{
//함수 내부 내용 생략
//초기화 완료 플래그
m_bInit = true;
return TRUE;
}
- OnInitDialog함수 맨 아래 return TRUE; 의 위에서 변수를 true로 바꿔줍니다.
void CMFCTESTDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
//초기화가 완료 된 이후 조건문에 진입.
if(m_bInit == true)
{
// 다이얼로그의 크기에 맞춰서 버튼이 일정 크기로 조정됨.
m_BTN_TEST.MoveWindow(10, 10, cx - 20, cy - 20);
}
}
- 조건문을 사용해 초기화가 진행된 후 MoveWindow함수를 호출하도록 조건문을 사용하여 코드를 바꿔줍니다.
- 빌드 후 다이얼로그의 사이즈를 바꿔보면 버튼이 다이얼로그의 크기에 맞춰 움직이는것을 확인할 수 있습니다.
이번 글에서는 OnSize 함수에 대해 알아보았습니다.
라이프사이클과 관련하여 다이얼로그의 메시지함수 호출순서 등은 힘드시다면 억지로 이해하실 필요는 없습니다.
앞으로의 예제를 진행하면서 더 상세히 알려드리겠습니다.
감사합니다!
728x90
'[C++] > MFC 프로그래밍' 카테고리의 다른 글
[C++] MFC 프로그래밍 : CString 클래스 (31) | 2023.06.18 |
---|---|
[C++] MFC 프로그래밍 : CRect 클래스 (30) | 2023.06.17 |
[C++] MFC 프로그래밍 : 컨트롤 변수 (41) | 2023.06.13 |
[C++] MFC 프로그래밍 : 컨트롤 소개 (39) | 2023.06.13 |
[C++] MFC 프로그래밍 : MFC 프로젝트 생성 (42) | 2023.06.10 |