Операционная система Microsoft Windows 3.1 для программиста -том 1

         

Приложение 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


Содержание раздела







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий