티스토리 뷰
DialogBox
다이얼로그 상자 폭은 글자 폭의 1/4, 높이는 글자 높이의 1/8 단위로 취급한다.
윈도우 프로시저에서
DialogBox(hInstance, ""다이얼로그박스 이름", hWnd, 다이얼로그박스 메시지처리콜백함수);
로 다이얼로그박스를 만들면 모든 메시지는 윈도우프로시저에서 받아 다이얼로그박스 메시지처리함수로 전달하게된다.
BOOL CALLBACK 다이얼로그메시지처리함수(HWND hDlg, UINT iMsg, WPARA wParam, LPARAM lParam)
{
....
return FALSE;
}
다이얼로그 프로시저가 윈도우프로시저와 다른점
- LRESULT 가 아닌 BOOL 타입을 리턴한다.
- 윈도우 프로시저는 특정메시지를 처리하지 못하면 DefWindowProc()를 호출하지만 대화상자는 메시지처리하면 TRUE, 처리 못하면 FALSE 를 반환해서 윈도우프로시저에게 처리 못했음을 알려준다.
- 윈도우의 WM_PAINT, WM_DESTORY, WM_CRETAE 는 받지 않는다. 초기화는 WM_INITDIALOG 에서 해준다.
- 모달다이얼로그 메시지는 프로그램 메시지큐를 통하지 않는다.
WM_INITDIALOG 에서 TRUE를 리턴하면 TABSTOP 속성을 가진 컨트롤에 포커스를 가진다. 만약, FALSE를 리턴하면 다이얼로그박스에 포커스가 없어 다이얼로그를 닫을 수 없다.
다이얼로그 닫기 : EndDialog(hDlg, 0);
부모윈도우로 메시지 보내기 : SendMessage(GetParent(hDlg), ....)
WS_CAPTION 속성을 가지면 WS_SYSMENU도 사용 가능해진다.
메뉴도 가질 수 있음.
CONTROL "OK", IDOK, "button", WS_CHILD|WS_VISIBLE 은
CreateWindow("button", "OK", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_TABSTOP, 10*cxChar/4, 20*cyChar/8, 32*cxChar/4, 14*cyChar/8, hDlg, IDOK, hInstance, NULL) 과 같다.
다이얼로그 닫기 : EndDialog(hDlg, TURE); TRUE(보통 확인(OK)버튼 TRUE, 취소버튼은 FALSE) 값은 DialogBox() 에 리턴값이다.
hWndCtrl = GetNextDlgTabItem(hDlg, hWndCtrl, bPrevious); GetNextDlgGroupItem(hDlg, hWndCtrl, bPrevious)
bPrevious 값이 TRUE면 이전 탭으로 이동할 컨트롤, FALSE면 다음으로 이동할 컨트롤을 얻는다.
EnableWindow(hWndCtrl, TRUE); 컨트롤을 활성화, FALSE면 비활성화 시킴
사용자정의 컨트롤 추가 방법 (기존 OK버튼 대신 사용자 정의 버튼으로 바꾸기)
클래스 정보 등록하고 (클래스이름 EllipPush)
도구상자에서 class=EllipPush, ID=IDOK, Caption=OK 로 설정한다.
1 |
LRESULT CALLBACK EllipsePushWndProc(HWND, UINT, WPARAM, LPARAM); |
cs |
1
2
3
4
5
6
7
8 |
// 클래스 정의
wcex.lpfnWndProc = EllipsePushWndProc;
wcex.hIcon = NULL;
wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT("EllipsPush");
wcex.hIconSm = NULL;
return RegisterClassExW(&wcex); |
cs |
모달 다이얼로그
다른 창으로 포커스 이동 불가능
DialogBox(), EndDialog() 쌍으로 이뤄진다.
모달리스 다이얼로그
다른 창으로 포커스 이동 가능
CreateDialog(hInstance, szTemplate, 부모핸들, 프로시저함수); // 보통의 윈도우와 비슷함
WS_VISIBLE 을 지정하거나 ShowWindow(hDlgModeless, SW_SHOW) 호출해야 모달리스 다이얼로그를 볼 수 있다.
메시지는 메시지큐를 통해 오므로 메시지 루프를 수정해야만 한다.
1
2
3
4
5
6
7
8
9 |
while (GetMessage(&msg, nullptr, 0, 0))
{
if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg))
if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} |
cs |