Операционная система Microsoft Windows 3.1 для программиста© Александр Фролов, Григорий ФроловТом 11, М.: Диалог-МИФИ, 1993, 269 стр. 6.3. Приложение MOUSEXYПриложение MOUSEXY демонстрирует обработку сообщений мыши, имеющих отношение к внутренней области окна. Задачей приложения является отображение координат курсора мыши в тот момент, когда вы в окне приложения нажимаете левую клавишу курсора. Если нажать правую клавишу мыши, содержимое внутренней области окна должно быть стерто. Обработка двойного щелчка левой клавишей мыши должна сводиться к выводу сообщения (рис. 6.1).
Рис. 6.1. Главное окно приложения MOUSEXY Функция WinMain приложения MOUSEXY находится в файле mousexy.cpp (листинг 6.1). Листинг 6.1. Файл mousexy\mousexy.cpp // ---------------------------------------- // Обработка сообщений от мыши // ---------------------------------------- #define STRICT #include <windows.h> #include <mem.h> BOOL InitApp(HINSTANCE); LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM); char const szClassName[] = "MOUSEXYAppClass"; char const szWindowTitle[] = "MOUSEXY Application"; // ===================================== // Функция WinMain // ===================================== #pragma argsused int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; // структура для работы с сообщениями HWND hwnd; // идентификатор главного окна приложения if(!InitApp(hInstance)) return FALSE; hwnd = CreateWindow( szClassName, szWindowTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if(!hwnd) return FALSE; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg, 0, 0, 0)) { DispatchMessage(&msg); } return msg.wParam; } // ===================================== // Функция InitApp // ===================================== BOOL InitApp(HINSTANCE hInstance) { ATOM aWndClass; // атом для кода возврата WNDCLASS wc; // структура для регистрации // класса окна memset(&wc, 0, sizeof(wc)); // Задаем стиль класса окна, позволяющий // получать сообщения о двойных // щелчках мыши wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = (LPSTR)NULL; wc.lpszClassName = (LPSTR)szClassName; aWndClass = RegisterClass(&wc); return (aWndClass != 0); } При регистрации класса окна определяется стиль класса окна, разрешающий получение функцией окна сообщений о двойных щелчках мышью. Дополнительно указывается, что содержимое окна должно перерисовываться при изменении вертикального или горизонтального размера окна: wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; Функция окна (листинг 6.2) обрабатывает сообщения мыши WM_LBUTTONDOWN, WM_RBUTTONDOWN и WM_LBUTTONDBLCLK. Листинг 6.2. Файл mousexy\wndproc.cpp // ===================================== // Функция WndProc // ===================================== #define STRICT #include <windows.h> LRESULT CALLBACK _export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; switch (msg) { // Нажали левую клавишу мыши case WM_LBUTTONDOWN: { WORD xPos, yPos, nSize; BYTE szBuf[80]; // Сохраняем координаты курсора мыши xPos = LOWORD(lParam); yPos = HIWORD(lParam); hdc = GetDC(hwnd); // Подготавливаем текстовую строку, содержащую // координаты курсора мыши nSize = wsprintf(szBuf, "(%d, %d)", xPos, yPos); // Выводим координаты курсора мыши // в точке, соответствующей положению // курсора мыши TextOut(hdc, xPos, yPos, szBuf, nSize); ReleaseDC(hwnd, hdc); return 0; } // Нажали правую клавишу мыши case WM_RBUTTONDOWN: { // Перерисовываем все окно, стирая фон InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); return 0; } // Двойной щелчок левой клавишей мыши case WM_LBUTTONDBLCLK: { // Выдаем сообщение MessageBox(hwnd, "Двойной щелчок!", "MouseXY", MB_OK | MB_ICONINFORMATION); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } В ответ на сообщение WM_LBUTTONDOWN функция окна сохраняет координаты курсора в переменных xPos и yPos, затем она подготавливает текстовую строку, содержащую координаты курсора и выводит ее в позицию курсора мыши: nSize = wsprintf(szBuf, "(%d, %d)", xPos, yPos); TextOut(hdc, xPos, yPos, szBuf, nSize); По сообщению WM_RBUTTONDOWN функция окна перерисовывает окно: InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); На сообщение WM_LBUTTONDBLCLK функция окна реагирует выдачей диалоговой панели с сообщением. Файл определения модуля приложения MOUSEXY приведен в листинге 6.3. Листинг 6.3. Файл mousexy\mousexy.def ; ============================= ; Файл определения модуля ; ============================= NAME MOUSEXY DESCRIPTION 'Приложение MOUSEXY, (C) 1994, Frolov A.V.' EXETYPE windows STUB 'winstub.exe' STACKSIZE 5120 HEAPSIZE 1024 CODE preload moveable discardable DATA preload moveable multiple |