Erstellen einer Meldungsschleife

Das System erstellt automatisch eine Nachrichtenwarteschlange für jeden Thread. Wenn der Thread eine erstellt oder mehr Windows, eine Nachrichtenschleife bereitgestellt werden müssen; Diese Nachrichtenschleife ruft Nachrichten aus dem Thread-Nachrichtenwarteschlange ab und verteilt sie an die entsprechenden Fenster-Verfahren.

Weil das System leitet die Nachrichten an einzelne Fenster in einer Anwendung, muss ein Thread mindestens ein Fenster erstellen, vor dem Starten einer Meldungsschleife. Die meisten Win32-basierten Anwendungen enthalten einen einzelnen Thread, der Windows erstellt. Eine typische Anwendung registriert die Fensterklasse für das Hauptfenster erstellt und zeigt das Hauptfenster und beginnt dann seine Meldungsschleife — alle in der WinMain -Funktion.

Sie erstellen eine Meldungsschleife mithilfe der Funktion GetMessage und DispatchMessage . Wenn Ihre Anwendung den Benutzer Zeicheneingabe besorgen muss, gehören Sie die TranslateMessage Funktion in der Schleife. TranslateMessage übersetzt virtuelle Kernaussagen in Zeichen Nachrichten. Das folgende Beispiel zeigt die Nachrichtenschleife in der WinMain -Funktion eine einfache Win32-basierten Anwendung.

HINSTANCE Hinst; 
HWND HwndMain; 
 
Int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / Registrieren die Window-Klasse für das Hauptfenster. 
 
    Wenn (! 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 = NULL LoadCursor((HINSTANCE), IDC_ARROW); 
        WC.hbrBackground = GetStockObject(WHITE_BRUSH); 
        WC.lpszMenuName = "MainMenu"; 
        WC.lpszClassName = "MainWndClass"; 
 
        If (!.RegisterClass(amp;wc)) return FALSE; 
    } Hinst = hInstance;  / / Instanzenhandle der speichern / / das Hauptfenster zu erstellen. 
 
    HwndMain = CreateWindow ("MainWndClass", "Sample", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL (HMENU) NULL, Hinst, (LPVOID) NULL); 
 
    / / Beenden, wenn das Hauptfenster kann nicht erstellt werden, / / die Anwendung. 
 
    Wenn (! HwndMain) return FALSE; 
 
    / / Fenster zeigen und ihren Inhalt zu zeichnen. 
 
    ShowWindow (HwndMain, Height); 
    UpdateWindow(hwndMain); 
 
    / / Die Meldungsschleife starten. 
 
    während (GetMessage (& msg, (HWND) NULL, 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / Den Exitcode an das System zurück. 
 
    msg.wParam zurück; 
} 

 

Das folgende Beispiel zeigt eine Meldungsschleife für einen Thread, der Beschleuniger verwendet und zeigt ein nicht modales Dialogfeld. Wenn TRUE, TranslateAccelerator oder IsDialogMessage zurückgibt (angibt, dass die Meldung verarbeitet wurde), TranslateMessage und DispatchMessage nicht nennt. Der Grund dafür ist, dass alle erforderlichen Übersetzungen und Versand von Nachrichten führen Sie TranslateAccelerator und IsDialogMessage.

HWND HwndMain; 
HWND HwndDlgModeless = NULL; 
MSG msg; 
HACCEL Haccel; 
/ / / / Initialisierung ausführen und erstellen ein Hauptfenster. 
/ / während (GetMessage (Amp; msg, (HWND) NULL, 0, 0)) {Wenn (HwndDlgModeless == NULL (HWND) || 
            !IsDialogMessage (HwndDlgModeless & msg) & &!TranslateAccelerator (HwndMain, Haccel & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

Index