Crearea o buclă de mesaj

Sistemul creează automat o coadă de mesaje pentru fiecare fir. Dacă firul creează una sau mai multe ferestre, o buclă de mesaj trebuie prevăzute; Această buclă mesaj preia mesaje din coada de mesaje firul de execu?ie ?i le expedieri procedurile corespunzătoare fereastra.

Deoarece sistemul direcționează mesajele individuale windows într-o aplicație, un fir trebuie să creați cel puțin o fereastră înainte de a începe sa bucla de mesaj. Cele mai multe Win32-aplicații bazate pe conțin un singur fir care creează windows. O aplicație tipică registrele clasa ferestrei pentru fereastra sa principală, creează și afișează fereastra principală, și apoi începe sale bucla mesaj — toate în funcția WinMain.

Creați o buclă de mesaj utilizând funcțiile GetMessage și DispatchMessage . Dacă cererea dumneavoastră trebuie să obține caracterul de intrare de la utilizator, include funcția TranslateMessage în bucla. TranslateMessage traduce virtual-cheie mesajele în mesaje de caractere. Următorul exemplu arată bucla mesaj în funcția WinMain de un simplu bazate pe Win32 cerere.

HINSTANCE hinst; 
HWND hwndMain; 
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / Inregistreaza clasa ferestrei pentru fereastra principală. 
 
    Dacă (! 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)) return FALSE; 
    } hinst = hInstance;  / / Salvare mâner exemplu / / creați fereastra principală. 
 
    hwndMain = CreateWindow ("MainWndClass", "E?antion", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, NULL (HMENU), hinst, NULL (LPVOID)); 
 
    / / Dacă imposibil de creat fereastra principală, rezilia / / cererii. 
 
    Dacă (! hwndMain) return FALSE; 
 
    / / Afișează fereastra și picta conținutul său. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Start bucla de mesaj. 
 
    în timp ce (GetMessage (& msg, NULL (HWND), 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / Returnează codul de ieșire la sistemul. 
 
    return msg.wParam; 
} 

 

Următorul exemplu arată o buclă de mesaj pentru un fir care utilizează acceleratoare și afișează o casetă de dialog fără mod. Atunci când TranslateAccelerator sau IsDialogMessage întoarce TRUE (indicând faptul că mesajul a fost prelucrat), TranslateMessage și DispatchMessage sunt nu numit. Motivul pentru aceasta este că TranslateAccelerator și IsDialogMessage efectua toate traducerea necesare și expedierea mesajelor.

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / Efectuează ini?ializarea și de a crea o fereastra principală. 
/ / în timp ce (GetMessage (amp; msg, NULL (HWND), 0, 0)) {dacă (hwndDlgModeless == NULL (HWND) | 
            !IsDialogMessage (hwndDlgModeless, & msg) & &!TranslateAccelerator (hwndMain, haccel & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

Index