Создание цикла обработки сообщений

Система автоматически создает очередь сообщений для каждого потока. Если поток создает один или более окон, цикл обработки сообщений должны быть предоставлены; Этот цикл обработки сообщений, получает сообщения из очереди сообщений потока и передает их соответствующим окно процедуры.

Поскольку система направляет сообщения для отдельных окон в приложении, поток необходимо создать по крайней мере одно окно перед началом своего цикла обработки сообщений. Большинство 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, NULL (HWND), NULL (HMENU), hinst, NULL (LPVOID)); 
 
    / / Если главное окно не может быть создан, расторгнуть / / приложение. 
 
    Если (! hwndMain) вернуть значение FALSE; 
 
    / / Показать окно и рисовать его содержимое. 
 
    ShowWindow (hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    / / Запустить цикл обработки сообщений. 
 
    при этом (GetMessage (и msg, NULL (HWND), 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, NULL (HWND), 0, 0)) {если (hwndDlgModeless == NULL (HWND) || 
            !IsDialogMessage (hwndDlgModeless и msg) & &!TranslateAccelerator (hwndMain, haccel и msg)) {TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 
 

Index