WinPro logo. Перейти на сайт www.winpro.narod.ru

Пример цикла сообщений



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

Так как система направляет сообщения индивидуально каждому окну, то поток должен создать, по крайней мере, одно окно перед запуском цикла обработки сообщений. Многие приложения содержат только один поток, создающий окна. Обычно такие приложения регистрируют оконный класс для своего главного окна, создает его и отображает на экране, а затем начинает работу цикл сообщений - и все это в функции WinMain.

Цикл сообщений состоит из функции GetMessage и DispatchMessage. Если приложение должно получать символьный ввод от пользователя, то цикл должен содержать функцию TranslateMessage. Она переводит сообщения виртуальных клавиш в символьные сообщения. Пример показывает использование цикла сообщений в функции WinMain:

HINSTANCE hinst; 
HWND hwndMain; 
 
int PASCAL WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, 
    LPSTR lpszCmdLine, int nCmdShow) 
{ 
    MSG msg;
    BOOL bRet; 
    WNDCLASS wc; 
    UNREFERENCED_PARAMETER(lpszCmdLine); 
 
    // Регистрация оконного класса для главного окна. 
 
    if (!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"; 
 
        if (!RegisterClass(&wc)) 
            return FALSE; 
    } 
 
    hinst = hInstance;  // сохранение описателя экземпляра 
 
    // Создание главного окна. 
 
    hwndMain = CreateWindow("MainWndClass", "Sample", 
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
        CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, 
        (HMENU) NULL, hinst, (LPVOID) NULL); 
 
    // Если главное окно не создано, завершить
    // приложение. 
 
    if (!hwndMain) 
        return FALSE; 
 
    // Отобразить окно и заполнить его содержимое. 
 
    ShowWindow(hwndMain, nCmdShow); 
    UpdateWindow(hwndMain); 
 
    // Запуск цикла сообщений. 
 
    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
    { 
        if (bRet == -1)
        {
            // получение описателя ошибки и возможно выход.
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    } 
 
    // Возврат кода выхода в систему. 
 
    return msg.wParam; 
} 



Hosted by uCoz