대화상자(Dialog Box)
메뉴로 쉽게 관리할 수 있는 범위를 넘어서는 많은 수의 데이터가 필요할 경우, 사용자로부터 추가적인 입력을 받기 위해 가장 흔히 사용되는 것이 바로 대화상자다.
일반적으로 대화상자는 다양한 자식 윈도우 컨트롤을 포함하는 팝업 윈도우(popup window) 형태를 취한다.
대화상자에는 '모드형(modal)'과 '비모드형(modeless)' 이 있는데, 가장 흔한 것은 모드형 대화상자다.
모드형 대화상자
프로그램이 모드형 대화상자를 표시하면, 사용자는 대화상자와 프로그램 내의 다른 윈도우 사이에 전환할 수 없다. 이 경우, 사용자는 흔히 OK 또는 Cancel이라 표시된 푸시 버튼을 클릭함으로써 명시적으로 대화상자를 종료해야 한다.
모드형 대화상자 중 특별히 '시스템 모드형 (system modal)'이라 하는 것은 이것 마저도 허용하지 않는다.
시스템 모드형 대화상자를 닫지 않으면, 사용자는 윈도우즈에서 어떤 일도 할 수 없다.
대화상자 프로시저
프로그램 내의 대화상자 프로시저는 대화상자가 받는 메시지를 처리한다.
ex )
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG :
return TRUE;
case WM_COMMAND :
switch (LOWORD (wParam) )
{
case IDOK :
case IDCANCEL :
EndDialog (hDlg, 0) ;
return TRUE ;
}
break;
}
return FALSE ;
}
대화상자 프로시저는 CALLBACK 함수로 정의해야 한다.
먼저 이 함수와 윈도우 프로시저의 차이점에 주목해 보자.
▶ 윈도우 프로시저는 LRESULT를 리턴, 대화상자 프로시저는 BOOL을 리턴.
▶ 윈도우 프로시저는 특정 메시지를 처리하지 않을 경우 DefWindowProc( )을 호출.
대화상자 프로시저는 메시지를 처리하면 TRUE(0이 아닌 값), 그렇지 않으면 FALSE(0)를 리턴
▶ 대화 상자 프로시저는 WM_PAINT, WM_DESTROY 메시지를 처리할 필요가 없다.
또한 WM_CREATE 메시지를 받지 않고, WM_INITDIALOG 메시지를 받을 때 초기화를 수행한다.
WM_INITDIALOG는 대화상자가 받는 첫번째 메시지다. 이 메시지는 대화상자 프로시저에만 보내지는 것이다.
WM_COMMAND는 푸시 버튼 컨트롤이 부모 윈도우에 보내는 메시지로서, 버튼을 마우스로 클릭하거나 버튼이 입력 포커스를 가진 상태에서 spacebar를 눌렀을 때 발생한다.
댓글 없음:
댓글 쓰기