Vytvorenie správy slučky

Systém automaticky vytvorí frontu správ pre každé vlákno. Ak vlákno vytvára jeden alebo viacero okien, správu vedenia musia poskytnúť; túto správu slučky načíta správy z front hlásení vlákno a expeduje vhodné okno postupov.

Pretože systém nasmeruje správy jednotlivých oknách v aplikácii, vlákno musí vytvoriť aspoň jedno okno pred začatím jej správu slučky. Väčšina aplikácií systému Win32 obsahovať jeden vlákno, ktoré vytvára systém windows. Typická aplikácia zaregistruje triedu okna pre jej hlavné okno, vytvorí a zobrazí v hlavnom okne a potom začne svoju správu slučky – všetky v WinMain funkcii.

Vytvoríte správu slučky pomocou funkcie GetMessage a DispatchMessage . Ak vašu žiadosť musí získať znak vstup od užívateľa, obsahujú aj TranslateMessage funkciu v slučke. TranslateMessage prekladá virtuálne kľúčové správy do znakov správy. Nasledujúci príklad zobrazuje hlásenie slučky vo funkcii WinMain jednoduchá Win32-založené aplikácia.

HINSTANCE hinst; 
HWND hwndMain; 
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / Zaregistrovať triedu okna pre hlavné okno. 
 
    Ak (! 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 = "Skrytie"; 
        WC.lpszClassName = "MainWndClass"; 
 
        if (!.RegisterClass(amp;wc)) vráti FALSE; 
    } hinst = hInstance;  / / save popisovač inštancie / / Create hlavné okno. 
 
    hwndMain = CreateWindow ("MainWndClass", "Vzorka", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL (HWND), hodnotu NULL (HMENU), hinst, NULL (LPVOID)); 
 
    / / Ak nie je možné vytvoriť v hlavnom okne, ukončiť / / žiadosti. 
 
    Ak (! hwndMain) vráti FALSE; 
 
    / / Zobraziť okno a maľovať jeho obsah. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Začať správy slučky. 
 
    zatiaľ čo (GetMessage (& msg, (HWND) NULL, 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / Vráti výstupný kód do systému. 
 
    návrat msg.wParam; 
} 
 

Nasledujúci príklad zobrazuje hlásenie slučku pre vlákno, ktoré používa urýchľovače a zobrazí dialógové okno sú nemodálne. Pri TranslateAccelerator alebo IsDialogMessage Vracia TRUE (s uvedením, že správa bola spracovaná), TranslateMessage a DispatchMessage nie nazývajú. Dôvodom pre to je, že TranslateAccelerator a IsDialogMessage vykonať všetky potrebné prekladať a odosielania správ.

HWND hwndMain; 
HWND hwndDlgModeless = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / Vykonať inicializáciu a vytvoriť hlavné okno. 
/ / zároveň (GetMessage (amp; msg, (HWND) NULL, 0, 0)) {Ak (hwndDlgModeless == NULL (HWND) || 
            !IsDialogMessage (hwndDlgModeless & msg) & &!TranslateAccelerator (hwndMain, haccel & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 
 

Index