메시지 루프 작성

시스템에는 자동으로 각 스레드에 대 한 메시지 큐를 만듭니다. 만약 스레드 하나를 만듭니다 또는 더 많은 윈도우, 메시지 루프를 제공 해야 합니다; 이 메시지 루프는 스레드의 메시지 큐에서 메시지를 검색 하 고 적절 한 창 프로시저에 전달.

시스템 메시지 응용 프로그램에서 개별 윈도우를 지휘, 때문에 스레드 메시지 루프를 시작 하기 전에 하나 이상의 창을 만들어야 합니다. 대부분의 Win32 기반 응용 프로그램 포함 단일 스레드 창을 만듭니다. 일반적인 응용 프로그램의 주 창에 대 한 창 클래스를 등록, 고 주 창 표시 만들고 메시지 루프를 시작 ? WinMain 함수에 모든.

GetMessageDispatchMessage 함수를 사용 하 여 메시지 루프를 만듭니다. 응용 프로그램 사용자의 문자 입력을 받아야 합니다, 루프에서 TranslateMessage 함수를 포함 합니다. TranslateMessage 문자 메시지를 가상 키 메시지를 변환합니다. 다음 예제는 간단한 Win32 기반 응용 프로그램의 WinMain 함수에 메시지 루프.

HINSTANCE hinst; 
HWND hwndMain; 
 
int 파스칼 WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG 메시지; 
    WNDCLASS 화장실; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / 주 창에 대 한 창 클래스를 등록 합니다. 
 
    경우 (! hPrevInstance) {wc.style = 0; 
        wc.lpfnWndProc = (WNDPROC) WndProc; 
        wc.cbClsExtra = 0; 
        wc.cbWndExtra = 0; 
        wc.hInstance = hInstance; 
        wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION); 
        wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); 
        wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
        wc.lpszMenuName = "MainMenu"; 
        wc.lpszClassName = "MainWndClass"; 
 
        if (!.RegisterClass(amp;wc)) 반환 FALSE; 
    } hinst = hInstance;  / / 인스턴스 핸들을 저장 / / 메인 윈도우를 만듭니다. 
 
    hwndMain = CreateWindow ("MainWndClass", "예", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL (HMENU) NULL, hinst, (LPVOID) NULL); 
 
    / 주 창을 만들 수 없습니다, 종료 / / / 응용 프로그램. 
 
    경우 (! hwndMain) 반환 FALSE; 
 
    / / 창을 표시 하 고 그 내용을 페인트. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / 메시지 루프를 시작 합니다. 
 
    반면 (GetMessage (& msg, (HWND) NULL, 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / 시스템 종료 코드를 반환 합니다. 
 
    반환 msg.wParam; 
} 
 

다음 예제에서는 가속기를 사용 하 여 모덜리스 대화 상자를 표시 하는 스레드에 대 한 메시지 루프를 보여 줍니다. TranslateAccelerator 또는 IsDialogMessage TRUE를 반환 하는 경우 (메시지 처리를 나타내는), TranslateMessageDispatchMessage 는 호출 되지 않습니다. 이 대 한 이유는 TranslateAcceleratorIsDialogMessage 이 모든 필요한 번역 하 고 메시지의 발송을 수행합니다.

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG 메시지; 
HACCEL haccel; 
/ / / / 초기화를 수행 하 고 주 창을 만듭니다. 
/ / (GetMessage (amp; msg, (HWND) NULL, 0, 0)) 동안 {경우 (hwndDlgModeless (HWND) NULL = = | | 
            !IsDialogMessage (hwndDlgModeless, & msg) & &!TranslateAccelerator (hwndMain, haccel, & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 
 

 

Index