컴퓨터 공부/Win32 API 프로그래밍

[5월 1일 3교시] 대화상자 2 + 메세지1

려리군 2009. 5. 1. 17:57

대화상자 기반의 프로그램

HWND_DESKTOP : 이 대화상자가 메인 윈도우가 되도록 한다.

예시) DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), HWND_DESKTOP, MainDlgProc);


모델리스형 대화상자
DialogBox 대신에 CreateDialog함수 이용.
HWND CreateDialog(HISTANCE, LPCTSTR, HWND, DLGPROC); 
리턴 : 성공시 다이얼로그 핸들, 실패시 NULL
HINSTANCE : 대화상자 리소스를 가진 인스턴스 핸들
LPCTSTR : 대화상자 리소스 아이디
HWND : 대화상자를 소유한 부모 윈도우
DLGPROC : 메세지를 보낼 대화상자 프로시저 포인터

※ (모델리스형 대화상자의 메세지도 같이 날라오기 때문에)

메인 윈도우의 메세지만 forwarding되도록 처리한다. 

While(GetMessage(&msg, NULL, 0, 0))

{

  If(!IsWindow(hMDlg) || IsDialogMessage(hMDlg,&msg))

  {

  TranslateMessage(&msg);

  DispatchMessage(&msg);

  }

}

BOOL IsWindow(HWND hWnd);
hWnd 핸들의 윈도우가 존재하는 지 확인한다.
리턴 : TRUE면 존재. FALSE면 존재하지 않음.

BOOL IsDialogMessage(HWND hDlg, LPMSG lpmsg);
대화상자를 위한 메세지인지 메인 윈도우의 메세지인지 검사. (모델리스 대화상자가 떠 있는 경우에만 해당)
리턴 : 메세지가 모델리스 다이얼로그에서 처리되었다면 TRUE, 그렇지 않으면 FALSE
HWND hDlg : 모델리스 대화상자 윈도우 핸들
LPMSG : GetMessage를 통해 받은 메세지 포인터

메세지
큐 메세지 : PostMessage함수에 의해 처리될 수 있는 메세지. 주로 사용자 입력으로부터 발생.
비큐 메세지 : 곧바로 윈도우 프로시저로 보내지는 메세지. SendMessage함수로 처리.
시스템은 쓰레드를 생성할 때 디폴트로 메세지큐를 가지지 않는 쓰레드 생성.

BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
현재 호출한 쓰레드 메시지 큐로부터 메세지를 받는다. 새로운 메세지가 들어올 때까지 리턴하지 않는다.
무한대기 -> Dead time비율이 높다.
LPMSG lpMsg : 메세지 정보를 받을 MSG 구조체의 포인터
HWND hWnd 
 : 윈도우의 메세지를 받게될 핸들. 이 윈도우는 현재 실행되고 있는 쓰레드에 속해야 한다.
 : NULL이면 현재 실행되고 있는 쓰레드에 속한 어떤 윈도우든지 간에 메세지를 보낸다.
 : -1이면 PostMessage(의 인수가 NULL)이나 PostThreadMessage에 의해 호출된 메세지만 수행된다.
wMsgFilterMin, wMsgFilterMax : 메세지를 골라서 가져오기 위한 필터값

BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
메세지를 할당하고 쓰레드 메세지 큐를 검사하고 메세지가 있다면 그것을 얻는다. 즉시 리턴.
리턴 : 메세지가 있을 경우 TRUE, 없으면 FALSE
LPMSG lpMsg : 메세지 정보를 받을 MSG 구조체의 포인터
HWND hWnd 
 : 윈도우의 메세지를 받게될 핸들. 이 윈도우는 현재 실행되고 있는 쓰레드에 속해야 한다.
 : NULL이면 현재 실행되고 있는 쓰레드에 속한 어떤 윈도우든지 간에 메세지를 보낸다.
 : -1이면 PostMessage(의 인수가 NULL)이나 PostThreadMessage에 의해 호출된 메세지만 수행된다.
wMsgFilterMin, wMsgFilterMax : 메세지를 골라서 가져오기 위한 필터값
wRemoveMsg
 : PM_NOREMOVE : 메세지 큐의 메세지를 지우지 않는다.
 : PM_REMOVE : 메세지 큐의 메세지를 지운다.