|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Creating a Message Loop
Windows automatically creates a message queue for each thread. If the thread creates one or more windows, a message loop must be provided; this message loop retrieves messages from the thread's message queue and dispatches them to the appropriate window procedures.
Because Windows directs messages to individual windows in an application, a thread must create at least one window before starting its message loop. Most Windows-based applications contain a single thread that creates windows. A typical application registers the window class for its main window, creates and shows the main window, and then starts its message loop ѕ all in the WinMain function. You create a message loop by using the GetMessage and DispatchMessage functions. If your application must obtain character input from the user, include the TranslateMessage function in the loop. TranslateMessage translates virtual-key messages into character messages. The following example shows the message loop in the WinMain function of a simple Win32-based application.
HINSTANCE hinst; HWND hwndMain; int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; WNDCLASS wc; UNREFERENCED_PARAMETER(lpszCmdLine); // Register the window class for the main window. 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; // save instance handle // Create the main window. hwndMain = CreateWindow("MainWndClass", "Sample",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, (HMENU) NULL, hinst, (LPVOID) NULL); // If the main window cannot be created, terminate // the application. if (!hwndMain) return FALSE; // Show the window and paint its contents. ShowWindow(hwndMain, nCmdShow); UpdateWindow(hwndMain); // Start the message loop. while (GetMessage(&msg, (HWND) NULL, 0, 0))
{ TranslateMessage(&msg); DispatchMessage(&msg); } // Return the exit code to Windows. return msg.wParam; }
The following example shows a message loop for a thread that uses accelerators and displays a modeless dialog box. When TranslateAccelerator or IsDialogMessage returns TRUE (indicating that the message has been processed), TranslateMessage and DispatchMessage are not called. The reason for this is that TranslateAccelerator and IsDialogMessage perform all necessary translating and dispatching of messages.
HWND hwndMain; HWND hwndDlgModeless = NULL; MSG msg; HACCEL haccel; // // Perform initialization and create a main window. // while (GetMessage(&msg, (HWND) NULL, 0, 0)) { if (hwndDlgModeless == (HWND) NULL || !IsDialogMessage(hwndDlgModeless, &msg) && !TranslateAccelerator(hwndMain, haccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Создание Цикла Сообщения
Окно автоматически создает очередь сообщения для каждой резьбы. Если резьба создает одно или более окон, цикл сообщения должен быть предусмотрен; этот цикл сообщения извлекает сообщения из очереди сообщения резьбы и посылает им в подходящие процедуры окна.
Поскольку Окно направляет сообщения в индивидуальное окно в приложении, резьба должна создать по крайней мере одно окно перед запуском цикла сообщения. Наиболее базирующиеся приложения Окна содержат единственную резьбу, которая создает окно. Типичное приложение регистрирует класс окна для своего основного окна, создает и показывает основное окно, затем начинает свой цикл сообщения U все в функции WinMain. Вы создаете цикл сообщения используя GetMessage и функции DispatchMessage. Если ваше приложение должно получить символьный вклад из потребителя, включите функцию TranslateMessage в цикл. TranslateMessage ПЕРЕВОДИТСЯ виртуальные-ключевые сообщения в символьные сообщения. Следующий пример показывает цикл сообщения в функции WinMain простого базирующегося приложения Win32.
HINSTANCE hinst; HWND hwndMain; int PASCAL WinMain(hInstance HINSTANCE, hPrevInstance HINSTANCE, LPSTR lpszCmdLine, int nCmdShow) { msg MSG; wc 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) НЕДЕЙСТВИТЕЛЬНЫЙ, IDI_APPLICATION); wc.hCursor = LoadCursor((HINSTANCE) НЕДЕЙСТВИТЕЛЬНЫЙ, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "MainMenu"; wc.lpszClassName = "MainWndClass"; если (!RegisterClass(&wc)) ОБРАТНАЯ ЛОЖЬ; } hinst = hInstance; // сохраняемая ручка примера // Создайте основное окно. hwndMain = CreateWindow("MainWndClass", "Образец",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) НЕДЕЙСТВИТЕЛЬНЫЙ, (HMENU) НЕДЕЙСТВИТЕЛЬНЫЙ, hinst, (LPVOID) НЕДЕЙСТВИТЕЛЬНЫЙ); // Если основное окно не может быть создано, завершите // приложение. если (!hwndMain) обратная ЛОЖЬ; // Покажите окно и закрашивайте свое содержание. ShowWindow(hwndMain, nCmdShow); UpdateWindow(hwndMain); // Начало цикл сообщения. пока (GetMessage(&msg, (HWND) НЕДЕЙСТВИТЕЛЬНЫЙ, 0, 0))
{ TranslateMessage(&msg); DispatchMessage(&msg); } // Возврат выходной код в Окно. возвращайте msg.wParam; }
Следующий пример показывает цикл сообщения для резьбы, которая использует акселераторы и отображает независимый диалоговый ящик. Когда TranslateAccelerator или ИСТИНА возврата IsDialogMessage (указание, что сообщение обработано), TranslateMessage и DispatchMessage не вызваны. Причина этого -, что TranslateAccelerator и IsDialogMessage выполняет весь необходимый перевод и отправку сообщений.
HWND hwndMain; HWND hwndDlgModeless = НЕДЕЙСТВИТЕЛЬНЫЙ; msg MSG; HACCEL haccel; // // Выполните инициализацию и создавайте основное окно. // пока (GetMessage(&msg, (HWND) НЕДЕЙСТВИТЕЛЬНЫЙ, 0, 0)) { если (hwndDlgModeless == (HWND) НЕДЕЙСТВИТЕЛЬНЫЙ || !IsDialogMessage(hwndDlgModeless, &msg) && !TranslateAccelerator(hwndMain, haccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
|
|
|
|
| |