Win32 API
창 메시지
수색…
통사론
- #include <windows.h>
- BOOL WINAPI DestroyWindow (HWND hwnd);
- VOID WINAPI PostQuitMessage (int exitcode);
- BOOL WINAPI MoveWindow (HWND hwnd, int x, int y, int cx, int cy, BOOL bRepaint);
WM_CREATE
WM_CREATE 메시지는 창 CreateWindowEx
호출 중에 창 프로 시저로 전송됩니다. lp
인수에는 CreateWindowEx
전달 된 인수가 들어있는 CREATESTRUCT
대한 포인터가 포함됩니다. 응용 프로그램이 WM_CREATE에서 0을 반환하면 창이 만들어집니다. 응용 프로그램이 -1을 반환하면 만들기가 취소됩니다.
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_CREATE:
CREATESTRUCT *cs = (CREATESTRUCT *) lp;
if (MessageBox(hwnd,
"Do you want to continue creating the window?", "", MB_YESNO)
== IDYES) {
/* create window controls */
return 0;
}
/* cancel creation */
return -1;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_DESTROY
이 메시지는 창을 제거 할 때 창 프로 시저로 전송됩니다. 창을 화면에서 제거한 후에 전송됩니다. 대부분의 응용 프로그램은 메모리 나 핸들과 같은 WM_CREATE에서 얻은 모든 리소스를 해제합니다. 이 메시지를 처리하면 0을 반환합니다.
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
static char *text;
switch (wm) {
case WM_CREATE:
text = malloc(256);
/* use the allocated memory */
return 0;
case WM_CLOSE:
switch (MessageBox(hwnd, "Save changes?", "", MB_YESNOCANCEL)) {
case IDYES:
savedoc();
/* fall through */
case IDNO:
DestroyWindow(hwnd);
break;
}
return 0;
case WM_DESTROY:
/* free the memory */
free(text);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_CLOSE
응용 프로그램의 닫기 버튼을 클릭하면 전송됩니다. WM_DESTROY
와 혼동하지 마십시오. WM_DESTROY
는 윈도우가 소멸 될 때 보내집니다. 가장 큰 차이점은 WM_CLOSE에서 닫기가 취소 될 수 있다는 것입니다 (변경 사항을 저장하라는 Microsoft Word의 생각). Windows가 이미 닫혀있는 경우 (Microsoft Word에서 메모리 해제)
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
static char *text;
switch (wm) {
case WM_CREATE:
text = malloc(256);
/* use the allocated memory */
return 0;
case WM_CLOSE:
switch (MessageBox(hwnd, "Save changes?", "", MB_YESNOCANCEL)) {
case IDYES:
savedoc();
/* fall through */
case IDNO:
DestroyWindow(hwnd);
break;
}
return 0;
case WM_DESTROY:
/* free the memory */
free(text);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_SIZE
이 메시지는 크기가 변경된 후 창 창 프로 시저로 보내집니다. 이 메시지를 처리하는 가장 일반적인 이유는 모든 하위 창의 위치를 조정하는 것입니다. 예를 들어 메모장에서 창 크기를 조정하면 자식 창 (편집 컨트롤)의 크기도 조정됩니다. 이 메시지를 처리하면 0을 반환합니다.
논의 | 값 |
---|---|
wp | 창 사이징 상수 중 하나입니다. |
LP | LOWORD (lp)는 클라이언트 영역의 새로운 너비입니다. HIWORD (lp)는 클라이언트 영역의 새로운 높이입니다. |
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_SIZE:
/* hwndEdit is the handle of the edit control window */
MoveWindow(hwndEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE);
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_COMMAND
다음과 같은 경우 창 프로 시저로 전송됩니다.
- 사용자가 메뉴에서 항목을 선택하면
- 컨트롤이 부모 창으로 알림을 보냅니다.
- 촉진제 키 스트로크가 번역된다.
메시지 소스 | HIWORD (wp) | LOWORD (wp) | LP |
---|---|---|---|
메뉴 | 0 | 메뉴 ID (IDM_ *) | 0 |
촉진 신경 | 1 | Accel ID (IDM_ *) | 0 |
제어 | 통지 코드 | 제어 ID | 제어창의 HWND |
예를 들어, 메모장에서 사용자가 "파일 -> 열기"를 클릭하면 사용자가 파일을 열 수있는 대화 상자가 표시됩니다. 메뉴 항목은 다음과 같이 창 프로 시저의 WM_CREATE 메시지에서 처리됩니다.
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_COMMAND:
switch (LOWORD(wp) {
case ID_FILE_OPEN:
/* show file open dialog */
break;
case ID_FILE_NEW:
/* create new instance */
break;
}
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}