Opprette en meldingsløkke

Programmet oppretter automatisk en meldingskø for hver tråd. Hvis tråden oppretter ett eller flere vinduer, en meldingsløkke må være angitt; Denne meldingsløkke henter meldinger fra meldingskøen trådens og ekspederte seg å aktuelle vindu-prosedyrer.

Fordi systemet dirigerer meldinger til individuelle vinduer i et program, må en tråd opprette minst ett vindu før du starter sin meldingsløkke. De fleste Win32-baserte programmer inneholder en enkelttråd som oppretter windows. En typisk program registrerer vindusklasse for sin hovedvinduet, oppretter og viser hovedvinduet, og starter deretter sin meldingsløkke – alt i WinMain -funksjonen.

Du oppretter en meldingsløkke ved hjelp av funksjonene GetMessage og DispatchMessage . Hvis programmet må hente Tegninndata fra brukeren, må du ta med funksjonen TranslateMessage i løkken. TranslateMessage oversetter virtual-key meldinger til tegn meldinger. Eksemplet nedenfor viser meldingsløkker i WinMain -funksjonen for en enkelt Win32-basert program.

HINSTANCE hinst; 
HWND hwndMain; 
 
Int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / Registrere vindusklasse for hovedvinduet. 
 
    Hvis (! 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 = "Hovedmeny"; 
        WC.lpszClassName = "MainWndClass"; 
 
        if (!.RegisterClass(amp;wc)) return FALSE; 
    } hinst = hInstance;  / / Lagre Forekomstreferanse / / Opprett hovedvinduet. 
 
    hwndMain = CreateWindow ("MainWndClass", "Eksempel", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, NULL (HMENU), HINST-, NULL (LPVOID)); 
 
    / / Hvis hovedvinduet ikke kan opprettes på nytt, avslutter du / / programmet. 
 
    Hvis (! hwndMain) return FALSE; 
 
    / / Vis vinduet og male innholdet. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Start meldingen løkken. 
 
    mens (GetMessage (& msg, (HWND) NULL, 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / Gå tilbake exit koden til systemet. 
 
    Return msg.wParam; 
} 

 

Følgende eksempel viser en meldingsløkke for en tråd som bruker hurtigvalg og viser et ikke-sperrende dialogboksen. Når TranslateAccelerator - eller IsDialogMessage som returnerer SANN (som angir at meldingen er behandlet), TranslateMessage og DispatchMessage kalles ikke. Grunnen til dette er at TranslateAccelerator og IsDialogMessage utfører alle nødvendig å oversette og ved sending av meldinger.

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / Utfører initialisering og opprette en hovedvindu. 
/ / mens (GetMessage (amp; msg, (HWND) NULL, 0, 0)) {hvis (hwndDlgModeless == NULL (HWND) || 
            !IsDialogMessage (hwndDlgModeless & msg) & &!TranslateAccelerator (hwndMain, haccel og msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

Index