Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
каркас.doc
Скачиваний:
59
Добавлен:
03.06.2015
Размер:
1.6 Mб
Скачать

3.4. Обработка сообщений «мыши»

Поскольку Windows широко использует ввод мыши, все Windows-программы должны обрабатывать сообщения мыши. Имеется несколько типов таких сообщений.

В этом разделе используются два наиболее часто употребляемых сообщения мыши – WM_LBUTTONDOWN и WM_RBUTTONDOWN, которые поступают при нажатии соответственно левой и правой кнопок мыши.

Для начала в оператор switch оконной функции необходимо добавить обработку этих сообщений так, как показано ниже:

case WM_RBUTTONDOWN: // Нажата правая кнопка мыши

hdc = GetDC(hwnd); // Получить DC

strcpy(str,"Нажата ПРАВАЯ кнопка");

TextOut(hdc,

LOWORD(lParam), HIWORD(lParam),

str, strlen(str));

ReleaseDC(hwnd,hdc); // Освободить DC

break;

case WM_LBUTTONDOWN: // Нажата левая кнопка мыши

hdc = GetDC(hwnd); // Получить DC

strcpy(str,"Нажата ЛЕВАЯ кнопка");

TextOut(hdc,

LOWORD(lParam), HIWORD(lParam),

str, strlen(str));

ReleaseDC(hwnd,hdc); // Освободить DC

break;

При нажатии кнопки мыши координаты текущей позиции курсора x и y передаются соответственно в LOWORD(lParam) и HIWORD(lParam). Программа, обрабаты­вающая сообщения мыши, использует эти координаты для вывода на экран соответ­ствующей текстовой строки. То есть каждый раз при нажатии кнопки мыши сообщение об этом будет выведено в текущей позиции курсора.

Пример 3-3. Далее следует полная программа обработки сообщений мыши.

// Обработка сообщений мыши

#include <Windows.h>

#include <String.h>

#include <Stdio.h>

LRESULT CALLBACK WindowFunc(HWND, UINT,

WPARAM, LPARAM);

char szWinName[]="МоеОкно"; // Имя класса окна

char str[80]="Пример"; // Буфер для строки вывода

int WINAPI WinMain(HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

{

HWND hwnd;

MSG msg;

WNDCLASS wcl; // Определить класс окна

wcl.hInstance=hThisInst; // Дескриптор приложения

wcl.lpszClassName=szWinName; // Имя класса окна

wcl.lpfnWndProc=WindowFunc; // Функция окна

wcl.style=0; // Стиль по умолчанию

wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);// Иконка

wcl.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор

wcl.lpszMenuName=NULL; // Без меню

wcl.cbClsExtra=0; // Без дополнительной информации

wcl.cbWndExtra=0;

wcl.hbrBackground=

(HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон

if(!RegisterClass(&wcl)) // Регистрируем класс окна

return 0;

hwnd=CreateWindow(szWinName, // Создать окно

"Обработка сообщений мыши",

WS_OVERLAPPEDWINDOW, // Стиль окна

CW_USEDEFAULT, // x-координата

CW_USEDEFAULT, // y-координата

CW_USEDEFAULT, // Ширина

CW_USEDEFAULT, // Высота

HWND_DESKTOP, // Нет родител. окна

NULL, // Нет меню

hThisInst,// Дескриптор приложения

NULL); // Нет дополнит. аргументов

ShowWindow (hwnd, nWinMode); // Показать окно

UpdateWindow (hwnd); // и перерисовать

while(GetMessage(&msg,NULL,0,0)) // Запустить цикл

{ // обработки сообщений

TranslateMessage(&msg); // Разреш. исп. клавиатуры

DispatchMessage (&msg); // Вернуть управл. Windows

}

return msg.wParam;

}

// Следующая функция вызывается операционной

// системой Windows и получает в качестве

// параметров сообщения из очереди сообщений

// данного приложения

LRESULT CALLBACK WindowFunc(HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT paintstruct;

switch(message)

{

case WM_CHAR: // Обработка нажатия клавиши

hdc=GetDC(hwnd); // Для получ. контекста устр-ва

TextOut(hdc, 1, 1, " ", 4); // Стереть символ

sprintf(str,"%c",(char)wParam); // Запись симв.

TextOut(hdc, 1, 1, str, strlen(str)); // Вывод

ReleaseDC(hwnd, hdc); // Освободить контекст

break;

case WM_PAINT: // Перерисовка рабочей области

hdc=BeginPaint(hwnd,&paintstruct);// Получить DC

TextOut(hdc,1,1,str,strlen(str));//Вывести буфер

EndPaint(hwnd, &paintstruct); // Освободить DC

break;

case WM_RBUTTONDOWN: // Нажата правая кнопка мыши

hdc = GetDC(hwnd); // Получить DC

strcpy(str,"Нажата ПРАВАЯ кнопка");

TextOut(hdc,

LOWORD(lParam), HIWORD(lParam),

str, strlen(str));

ReleaseDC(hwnd,hdc); // Освободить DC

break;

case WM_LBUTTONDOWN: // Нажата левая кнопка мыши

hdc = GetDC(hwnd); // Получить DC

strcpy(str,"Нажата ЛЕВАЯ кнопка");

TextOut(hdc,

LOWORD(lParam), HIWORD(lParam),

str, strlen(str));

ReleaseDC(hwnd,hdc); // Освободить DC

break;

case WM_DESTROY: // Завершение программы

PostQuitMessage(0);

break;

default:

// Все сообщения, не обрабатываемые в

// данной функции, направляются на обработку

// по умолчанию

return DefWindowProc(hwnd,message,

wParam,lParam);

}

return 0;

}

Результаты работы этой программы показаны на рис. 3.2.

Более подробно о сообщениях «мыши». Параметр wParam сообщений WM_LBUTTONDOWN и WM_RBUTTONDOWN содержит дополнительную информацию, представляющую собой комбинацию сле­дующих флагов:

MK_CONTROL

MK_SHIFT

MK_RBUTTON

MK_LBUTTON

MK_MBUTTON

Если в момент нажатия кнопки мыши была нажата клавиша [Ctrl], wParam будет содержать флаг MK_CONTROL. Если же в этот момент была нажата клавиша [Shift], wParam будет содержать флаг MK_SHIFT. Флаги MK_LBUTTON, MK_RBUTTON и MK_MBUTTON устанавливаются, если были нажаты соответственно левая, правая и средняя кнопки мыши. Параметр wParam может содержать комбинацию (т.е. одновременно более одного) этих флагов. Вы можете поэкспери­ментировать с сообщениями мыши и убедиться в этом.