수색…


통사론

  • #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);
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow