Операционная система 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 |

