![]() |
|
Модераторы: PILOT |
![]()
|
|
| Finder Adventuries |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 13.9.2002 Репутация: нет Всего: нет |
Очень нужно доделать лабу - вот оставш. задание -
Используя функцию sprintf ,создайте программу, которая выписывает координаты мыши в момент выполнения щелчков левой и правой кнопками мыши и печатает координаты мыши в момент нажатия клавиши !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! В эту программу (вывод окна) - #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; #pragma argsused int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "Лабораторная № 3" ; HWND hwnd ; MSG msg ; //-------------Процедура Register , сообщает Windows характеристики класса окна //-------------определяет общий класс окна --------------------------------- WNDCLASSEX wndclass ; wndclass.cbSize = sizeof (wndclass) ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; // Иконка wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //Курсор обычный wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; RegisterClassEx (&wndclass) ; //---------------------------------------------------------- //--------------создание окна ----------------------------- //----процедура Create определяет - конкретный экземпляр класса окна hwnd = CreateWindow (szAppName, "Лабораторная № 3", WS_OVERLAPPEDWINDOW, // window стиль CW_USEDEFAULT, // x position CW_USEDEFAULT, // y position CW_USEDEFAULT, // x size CW_USEDEFAULT, // y size NULL, //текущий window handle NULL, // меню handle hInstance, NULL) ; //параметр создания ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; //------------------------------------------------------- //-------Третья часть процедуры WinMain - цикл сообщения while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } //----------------------------------------------------------- LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (iMsg) { case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; // DrawText (hdc, "ТЕСТ", -1, &rect, // DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } Используя функцию sprintf ,создайте программу, которая выписывает координаты мыши в момент выполнения щелчков левой и правой кнопками мыши и печатает координаты мыши в момент нажатия клавиши !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //-------------------------------------------------------------------------- Для справки : Лабораторная работа №5 Тема: Мышь и клавиатура. Цель: Исследование управления мышью и клавиатурой в Windows программе. Теоретические сведения. С помощью системы сообщений можно установить немедленный и относительно полный контроль над мышью и клавиатурой. Рассмотрим функцию отклика на сообщение WM_MOUSEMOVE. // Эта функция вызывается при любом перемещении мыши void KeyMouse_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags) { char S[100]; HDC PaintDC = GetDC(hwnd) ; sprintf(S, "WM_MOUSEMOVE ==> x = %d y = %d keyFlags = %d ", x, y, keyFlags) ; SetBkColor(DC, GetSysColor(COLOR_HINDOW)); TextOut(PaintDC, XVal, YVal + 80, S, strlen(S)); ReleaseDC(hwnd, PaintDC); } Когда окно получает сообщение WM_MOUSEMOVE, информация прячется в параметры hwnd, wParam и lParam. Последний из этих параметров в своем младшем слове несет информацию о столбце, на котором находив курсор мыши, а в старшем — информацию о строке. Но благодаря взломщикам сообщений эта информация переводится в координаты х и y видимые в заголовке KeyMouse_OnMouseMove. Функция KeyMouse_OnMouseMove делает параметры х, у и keyFlags видимьми на экране, сначала транслируя их посредством функции sprintf в символьную строку, а затем визуально отображая их с помощью функции TextOut. Это та же самая система, с которой вы уже встречались при изучении отклика на нажатие клавиши. Всякий раз, когда на экране появляется новый набор координат мыши, очередное сообщение было обработано WndProc. Помимо координат мыши, с каждым сообщением WM_MOUSEMOVE посылается и другая информация, содержащаяся в аргументе keyFlags. Этот параметр может иметь одно из следующих значений: Константа Значение MK_CONTROL Нажата клавиша Control MK_LBUTTON Нажата левая кнопка мыши MK_RBUTTON Нажата правая кнопка мыши MK_MBUTTON Нажата средняя кнопка мыши MK_SHIFT Нажата клавиша Shift Эти константы являются битовыми флажками. Следовательно, вы должны использовать битовые операторы, чтобы проверить, установлены они или нет. Сделать это очень просто. Например, если вы хотите узнать, нажата ли клавиша Control во время движения мыши, то достаточно соединить keyFlags и MK_CONTROL логическим «И», а затем проверить результат: if ((keyFlag & MK_CONTROL) == MK_CONTROL) DOSOMETHING Что6ы увидеть, как именно происходит этот процесс, можно модифицировать функцию KeyMouseOnMouseMove введен вызов SetTextColor и RGB. Эти два вызова постоянно используются Windows-программах. Макрос RGB возвращает 4-байтное значение, определяющее цвет. Возвращаемый цвет определяется тремя параметрами, передаваемыми в макрос, каждый из которых может принимать значение от 0 до 255. Если третий параметр устанавливается равным 255, а остальные нулю, результирующий цвет будет темно-синим. Если первый параметр равен 255, а остальные нулю, то цвет будет красным. Средний параметр управляет интенсивностью зеленого в цвете, возвращаемом макросом RGB. В четвертом примере предыдущей функции синий и красный смешиваются в темно-бордовый. Чтобы получить серый цвет, то могли бы установить все значения, равными 127. Установка их всех в 0 дает густой черный, а в 255 — белый. Если одновременно включите зеленый и красный, то получите ярко-желтый. Функция SetTextColor легче для понимания, нежели макрос RGB, поскольку она делает не более того, что означает ее имя. То есть устанавливает цвет текста, который выводится в передаваемый ей контекст устройства. Иначе говоря, она «копирует» результат функции RGB в контекст устройства. Обработка одинарных и двойных щелчков кнопкой мыши Программа KeyMouse использует функции KeyMousе_OnLButtonDown и KeyMouse_OnLButtonUp для записи случаев нажатия кнопки. Работа этих функций очень похожа на работу всех остальных программ. Легче понять, что происходит, когда кнопку отпускают, нежели когда ее нажимают. Поэтому начнем с функции KeyMouse_OnLButtonUp. void KeyMouse_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags) { char S[100] ; HDC PaintDC = GetDC (hwnd) ; sprintf(S, "WM_LBUTTONUP ==> x = %d y = %d F = %d ",x, y, keyFlags) ; SetBkColor(DC, GetSysColor(COLOR_WINDOW)) ; Text0ut(PaintDC, XVal, YVal + 120, S, strlen(S)); ReleaseDC(hwnd, PaintDC); } Обрабатывать двойные щелчки левой или правой кнопки мыши, то необходимо начать с установки стиля окна в CS DBLCLKS. Это делается в методе Register. win. style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; В данном случае видно, что стиль, ассоциированный с оконным классом, содержит три флажка, последний из которых говорит Windows о том, что этот| класс хочет получать соответствующую информацию, когда пользователь дважды щелкает мышью в рабочей области окна. Сообщение, посылаемое при двойном щелчке левой кнопкой мыши, называется WM_LBUTTONDBLCLK, но соответствующий взломщик сообщения из WindowsX направляет эту информацию в ту же функцию, которая обрабатывает сообщения WM_LBUTTONDOWN. Рассмотрим, как именно работает функция KeyMouse_OnLButtonDown. void KeyMouse_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) { char S[100] ; HDC PaintDC = GetDC(hwnd) ; if (fDoubleClick) sprintf(S, "WM_LBUTTONDBLCLK ==> Db = %d x = %d y = %d Flags = %d ", fDoubleClick, x, у, keyFlags) ; else sprintf(S, "WM_LBUTTONDOWN ==> Db = %d x = %d у = %d Flags = %d ", fDoubleClick, x, y, keyFlags) ; SetBkColor(DC, GetSysColor(COLOR_WINDOW)) ; Text0ut(PaintDC, XVal, YVal + 100, S, strlen(S)); ReleaseDC(hwnd, PaintDC) ; } Завладев контекстом устройства, функция проверяет, был ли сделан двойной щелчок или одинарный. В первом случае параметр fDoubleClick будет равен TRUE. При этом функция печатает строку, сигнализирующую, что было послано сообщение WM_LBUTTONDBLCLK. Кроме того, функция информирует пользователя о текущем состоянии координат и об установках флажков. Разумеется, если двойного щелчка не было, пользователь извещается о приходе сообщения WM LBUTTONDOWN. Тогда функция отображает текущее состояние всех параметров, включая координаты мыши в момент нажатия левой кнопки кнопки. |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Во-первых, заголовок не отражает суть постинга.
Во-вторых, не вижу конкретного вопроса, вижу только желание, чтобы кто-то помог сделать. -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Klin |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1938 Регистрация: 7.10.2002 Где: Краснодар Репутация: нет Всего: 25 |
В форме или во всём экране?
-------------------- Я человек - попробуйте обвинить меня за это. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Обсуждение работы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |