Створення повідомлення цикл

Система автоматично створює черга повідомлень для кожного потоку. Якщо потік створює один або більше вікон, цикл повідомлення повинні бути надані; цього повідомлення петля отримує повідомлення із черга повідомлень в темі і вбиває їх у порядку, відповідне вікно.

Тому що система спрямовує повідомлень, індивідуальних Windows в застосунку, потік необхідно створити принаймні одне вікно перед початком його повідомлення циклі. Більшість Win32-додатки містять один потік, який створює windows. Типове застосування реєструє клас вікна для його головного вікна, створює і головне вікно показує та запускає його повідомлення петля — всі в WinMain функції.

Створення циклу повідомлення за допомогою функції GetMessage і DispatchMessage . Якщо у вашому додатку необхідно отримати символ вводу від користувача, включають функцію TranslateMessage в циклі. TranslateMessage переводить віртуальний ключових повідомлень в символів повідомлення. Наступний приклад показує повідомлення петлі в WinMain функцію просте додаток на основі Win32.

HINSTANCE hinst; 
HWND hwndMain; 
 
Int ПАСКАЛЬ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg; 
    WNDCLASS туалет; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    / / Реєстрація для головного вікна, клас вікна. 
 
    Якщо (! 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"; 
 
        Якщо (!.RegisterClass(amp;wc)) повертає FALSE; 
    } hinst = hInstance;  / / збереження дескриптор екземпляра / / створити головне вікно. 
 
    hwndMain = CreateWindow ("MainWndClass", "Зразки", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) значення NULL, NULL (HMENU), hinst (LPVOID) значення NULL); 
 
    / / Якщо не вдалося створити головне вікно, припинити / / застосування. 
 
    Якщо (! hwndMain) повертає FALSE; 
 
    / / Показати вікно і намалюйте його вміст. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Початок циклу повідомлення. 
 
    під час (GetMessage (& msg, (HWND) значення NULL, 0, 0)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } / / Повернення код завершення до системи. 
 
    повернення msg.wParam; 
} 

 

Наступний приклад показує повідомлення петля для потоку, що використовує корисні можливості і відображає діалогове вікно немодальною. При TranslateAccelerator або IsDialogMessage повертає TRUE (із зазначенням, що повідомлення були оброблені), TranslateMessage і DispatchMessage не називаються. Причиною цього є, що TranslateAccelerator та IsDialogMessage виконання всіх необхідних перекладу і диспетчерських повідомлень.

HWND hwndMain; 
HWND-hwndDlgModeless = NULL; 
MSG msg; 
HACCEL haccel; 
/ / / / Виконати ініціалізацію і створити головне вікно. 
/ / під час (GetMessage (amp; msg, (HWND) значення NULL, 0, 0)) {Якщо (hwndDlgModeless = = NULL (HWND) | | 
            !IsDialogMessage (hwndDlgModeless & msg) & &!TranslateAccelerator (hwndMain, haccel & msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

 

Index