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