Een bericht lus

Het systeem wordt automatisch gemaakt voor elke thread een berichtenwachtrij. Als de draad een maakt of meer windows, een bericht lus moeten worden verstrekt; deze lus bericht haalt berichten op uit de berichtenwachtrij van de thread en verzendt ze naar de juiste venster procedures.

Omdat het systeem berichten naar afzonderlijke vensters in een toepassing stuurt, moet ten minste ťťn venster in een thread maken voordat u begint haar bericht lus. Meeste Win32-toepassingen bevatten een enkele draad die windows maakt. Een typische toepassing registreert de venster klasse voor het hoofdvenster, creŽert het hoofdvenster toont en dan begint de lus bericht ó allemaal in de WinMain functie.

Met behulp van de functies GetMessage en DispatchMessage u een lus bericht. Als uw toepassing karakter input van de gebruiker verkrijgen moet, de TranslateMessage -functie opneemt in de lus. TranslateMessage vertaalt virtuele-kernboodschappen in karakter-berichten. In het volgende voorbeeld toont de bericht-lus in de WinMain functie van een eenvoudige Win32-toepassing.

HINSTANCE hinst; 
HWND hwndMain; 
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / De klasse venster van het hoofdvenster te registreren. 
 
    Als (! hPrevInstance) {wc.style = 0; 
        WC.lpfnWndProc = WndProc (WNDPROC); 
        WC.cbClsExtra = 0; 
        WC.cbWndExtra = 0; 
        WC.HINSTANCE = hInstance; 
        WC.HICON = NULL LoadIcon((HINSTANCE), IDI_APPLICATION); 
        WC.hCursor = NULL LoadCursor((HINSTANCE), IDC_ARROW); 
        WC.hbrBackground = GetStockObject(WHITE_BRUSH); 
        WC.lpszMenuName = "Hoofdmenu"; 
        WC.lpszClassName = "MainWndClass"; 
 
        If (!.RegisterClass(amp;wc)) return FALSE; 
    } hinst = hInstance;  / / save sessiehandler / / Create van het belangrijkste venster. 
 
    hwndMain = CreateWindow ("MainWndClass", "Monster", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT (HWND) NULL, NULL (HMENU), hinst, (LPVOID) NULL); 
 
    / / Als het belangrijkste venster kan niet worden gemaakt, beŽindigen / / de toepassing. 
 
    Als (! hwndMain) return FALSE; 
 
    / / Toon het venster en de inhoud ervan te schilderen. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Start de lus bericht. 
 
    terwijl (GetMessage (& msg, NULL (HWND), 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / De afsluitcode terug naar het systeem. 
 
    Return msg.wParam; 
} 
 

In het volgende voorbeeld toont een bericht lus voor een thread die maakt gebruik van versnellers en een niet-modaal dialoogvenster wordt weergegeven. Wanneer TranslateAccelerator of IsDialogMessage waar als resultaat geeft worden (die aangeeft dat het bericht is verwerkt), TranslateMessage en DispatchMessage niet genoemd. De reden hiervoor is dat TranslateAccelerator en IsDialogMessage uitvoeren van alle nodige vertalen en het verzenden van berichten.

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / Initialisatie uitvoeren en maken een hoofdvenster. 
/ / terwijl (GetMessage (amp; msg, (HWND) NULL, 0, 0)) {als (hwndDlgModeless == NULL (HWND) || 
            !IsDialogMessage (hwndDlgModeless, & msg) & &!TranslateAccelerator (hwndMain, haccel, & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 
 

Index