Creazione di un ciclo di messaggi

Il sistema crea automaticamente una coda di messaggi per ciascun thread. Se il thread crea uno o più finestre, un ciclo di messaggi devono essere fornite; Questo ciclo di messaggi recupera i messaggi dalla coda di messaggi del thread e li invia ai procedimenti appropriati finestra.

Perché il sistema indirizza i messaggi a singole finestre in un'applicazione, è necessario che un thread creare almeno una finestra prima di iniziare il suo ciclo di messaggi. La maggior parte delle applicazioni basate su Win32 contengono un singolo thread che crea windows. Una tipica applicazione registra la classe finestra per la sua finestra principale, crea e mostra la finestra principale e poi inizia il suo ciclo di messaggi — tutto nella funzione WinMain.

Creare un ciclo di messaggi utilizzando le funzioni GetMessage e DispatchMessage . Se l'applicazione deve ottenere l'ingresso di carattere da parte dell'utente, includere la funzione TranslateMessage in loop. TranslateMessage traduce i messaggi chiave virtuale in messaggi di carattere. L'esempio seguente mostra il ciclo di messaggi nella funzione WinMain di una semplice applicazione Win32.

HINSTANCE hinst; 
HWND hwndMain; 
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / Registrare la classe finestra per la finestra principale. 
 
    Se (! 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 = "MainMenu"; 
        WC.lpszClassName = "MainWndClass"; 
 
        if (!.RegisterClass(amp;wc)) return FALSE; 
    } hinst = hInstance;  / / handle di istanza di save / / crea la finestra principale. 
 
    hwndMain = CreateWindow ("MainWndClass", "Campione", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, NULL (HMENU), hinst, (LPVOID) NULL); 
 
    / / Se non è possibile creare la finestra principale, terminare / / l'applicazione. 
 
    Se (! hwndMain) return FALSE; 
 
    / / Visualizza la finestra e dipingere il suo contenuto. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Avvia il ciclo di messaggi. 
 
    mentre (GetMessage (& msg, (HWND) NULL, 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / Restituisce il codice di uscita al sistema. 
 
    return msg.wParam; 
} 
 

Nell'esempio seguente viene illustrato un ciclo di messaggi per un thread che utilizza gli acceleratori e visualizza una finestra di dialogo non modali. Quando TranslateAccelerator o IsDialogMessage restituisce TRUE (che indica che il messaggio è stato elaborato), TranslateMessage e DispatchMessage non sono chiamati. La ragione di questo è che TranslateAccelerator e IsDialogMessage eseguire tutti necessario tradurre e invio di messaggi.

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / Eseguire l'inizializzazione e creare una finestra principale. 
/ / mentre (GetMessage (amp; msg, (HWND) NULL, 0, 0)) {se (hwndDlgModeless = = NULL (HWND) | | 
            !IsDialogMessage (hwndDlgModeless & msg) & &!TranslateAccelerator (hwndMain, haccel e msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 
 

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index