Главная » Win32 API » Примеры программ по обработке сообщений от клавиатуры и мыши

0

Пример 1. Реализовать изменение текста заголовка окна на за­данный текст по двойному щелчку правой кнопки в клиентской облас­ти окна Обратную замену заголовка осуществить по нажатию клавиши F1.

.model flat,stdcall

option casemap:none

include с:\masm32\include\windows.inc include с:\masm32\include\user32.inc include с:\masm32\include\kernel32.inc includelib с:\masm32\lib\user32.lib includelib с:\masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .data

AppName db "Мое приложение",0 NewName db "Новое название!!!",0 hlnstance  HINSTANCE ? CommandLine LPSTR ? . code start:

invoke GetModuleHandle, NULL

mov   hlnstance,eax

invoke GetCommandLine

mov   CommandLine,eax

invoke WinMain, hlnstance,NULL,CommandLine, SW_SHOWDEFAULT ;запуск WinMain и после ее завершения остановка ;процесса

invoke ExitProcess,eax WinMain proc hlnst:HINSTANCE,hPrevInst:HINSTANCE, CmdLine:LPSTR,CmdShow:DWORD

LOCAL wc:WNDCLASSEX ; WNDCLASSEX аналогична WNDCLASS За исключением 2 ;полей cbSize размера структуры в байтах и hlconSm -;дескриптора пиктограммы приложения размером 16×16, ;используемой в заголовке окна данного класса

LOCAL msg:MSG

LOCAL hwnd:HWND

LOCAL X:DWORD

LOCAL Y:DWORD

mov X,500

mov Y,350

mov   wc.cbSize,SIZEOF WNDCLASSEX

mov   wc.style, CS_HREDRAW or CS_VREDRAW OR CS_DBLCLKS ; стиль класса обеспечивает реакцию на двойные щелчки

mov   wc.lpfnWndProc, OFFSET WndProc

mov   wc.cbClsExtra,NULL

mov   wc.cbWndExtra,NULL

push hlnstance

pop  wc.hlnstance

mov   wc.hbrBackground,COLOR_BTNFACE+1

mov  wc.lps zMenuName,NULL

mov  wc.lpszClassName,OFFSET AppName

invoke LoadIcon,NULL,IDI_APPLICATION

mov  wc.hIcon,eax

mov  wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_ARROW

mov  wc.hCurs or,eax

invoke RegisterClassEx, addr wc

INVOKE CreateWindowEx,NULL,ADDR AppName,

ADDR AppName, WS_OVERLAPPEDWINDOW,200, 200, X,Y,NULL, NULL,hinst,NULL mov  hwnd,eax

invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE

begin:  invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax)

invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW

mov eax,msg.wParam ret WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg=WM_DESTROY

invoke PostQuitMessage,NULL .ELSEIF uMsg=WM_RBUTTONDBLCLK ;заменяем текст заголовка окна

invoke SetWindowText,hWnd,ADDR NewName .ELSEIF uMsg=WM_KEYDOWN

;восстанавливаем текст .IF wParam == VK_F1

invoke SetWindowText,hWnd,ADDR AppName .endif .ELSE

invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start

Пример 2. Двойной щелчок левой кнопки в клиентской области окна приводит к циклическому перемещению окна по экрану. Отме­нить эти действия можно нажатием клавиши на клавиатуре.

Рассмотрим только оконную функцию и макросы, осуществляю­щие сложение и вычитание параметров, возвращающие результат опе­рации через первый операнд:

plus MACRO mem,vl                   ;   mem=mem+vl

push eax

mov eax,mem

add eax,vl

mov mem, eax

pop eax
ENDM
minus MACRO mem,vl                ;   mem=mem-vl

push eax

mov eax,mem

sub eax,vl

mov mem, eax

pop eax ENDM

Так как перемещение окна должно быть циклическим, то целесооб­разно использовать сообщение от таймера WMTIMER, при обработке которого осуществлять перемещение окна в новую позицию. Создание таймера будем осуществлять при обработке сообщения о двойном щелчке левой кнопки мыши. Уничтожение таймера реализуем при об­работке сообщения о нажатии любой клавиши.

WndProc proc hWin   :DWORD, uMsg   :DWORD, wParam :DWORD, lParam :DWORD ; начальные значения координат левого верхнего угла ; (Left,Top) окна задаются как глобальные переменные .if uMsg == WM_TIMER .if Left == 50

.if Top < 350

plus Top,10 .else

plus Left,10 .endif .endif .if Top = 350

.if Left < 350

plus Left,10 .else

minus Top,10 .endif .endif .if Left == 350

.if Top > 50

minus Top,10 .else

minus Left,10 .endif .endif .if Top = 50

.if Left > 50

minus Left,10 .else

plus Top,10 .endif .endif ; вывод окна с измененными координатами левого ; верхнего угла

invoke SetWindowPos,hWnd, HWND_TOP,

Left,Top,200,100,SWP_SHOWWINDOW .elseif uMsg == WM_KEYDOWN ; при нажатии любой клавиши таймер уничтожается invoke KillTimer, hWin, NULL .else

.if uMsg == WM_LBUTTONDBLCLK ; инициализируем таймер

invoke SetTimer, hWin, NULL, 500, NULL ; 500 мс = 0,5 секунды .else

.if uMsg == WM_CLOSE .elseif uMsg == WM_DESTROY

invoke PostQuitMessage,NULL return 0 .endif .endif .endif

invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp

1.9 Упражнения

С использованием API-функций AnimateWindow, CloseWindow, Find-Window, FlashWindow, FlashWindowEx, GetClientRect, GetParent, Get-DesktopWindow, GetTitleBarlnfo, GetWindowPlacement, IsChild,    GetWindowTextLength, IsWindow, IsWindowVisible, MoveWindow, CloseWindow, Openlcon, SetWindowPlacement, SetWindowText, ShowWindow, Window-FromPoint реализовать предложенные задания.

1.                    После двойного щелчка левой кнопки в клиентской области окна окно начинает перемещаться по вертикали. Нажатие любой кла­виши прекращает движение.

2.                    Щелчок правой кнопкой на клиентской области окна приводит к изменению его размеров (уменьшению в 2 раза). Нажатие любой клавиши возвращает исходные размеры.

3.                    Щелчок правой кнопкой на клиентской области окна приводит к изменению реакции на нажатие цифр. Каждое следующее нажатие цифры изменяет размер окна. Нажатие любой другой клавиши воз­вращает исходные размеры.

4.                    Щелчок правой кнопкой в верхней половине окна приводит к его свертке. Развертка окна по нажатию любой функциональной кла­виши.

5.                    Перемещение мыши в верхней половине окна приводит к по­явлению периодического мерцания заголовка окна. Нажатие любой буквы из линейки «QWER..» перемещает окно в правый верхний угол экрана.

6.                    Создать два окна, одно из которых родительское для друго­го. Перемещение мыши в неклиентской области дочернего окна при­водит к его свертке. Нажатие клавиши «пробел» при установке фокуса ввода на родительское окна приводит также к его свертке.

7.                    Щелчок левой кнопкой в неклиентской области окна переме­щает окно вправо на заданное количество пикселов. Нажатие клавиши Alt вместе с цифровой клавишей возвращает окно на место.

8.                    Щелчок правой кнопкой в неклиентской области окна приво­дит к тому, что последующее нажатие любой буквенной клавиши сдвигает окно на заданное число пикселов вправо.

9.                    Двойной щелчок левой кнопки в рабочей области окна приво­дит к тому, что при нажатии цифровых клавиш окно сдвигается вниз на количество пикселов, соответствующее нажатой цифре.

10.              Двойной щелчок правой кнопки в клиентской области окна приводит к тому, что при нажатии клавиш стрелок впоследствии реа­лизуется перемещение окна по экрану.

11.              Щелчок правой кнопкой в нижней половине окна разрешает изменение текста в заголовке окна. Дальнейшее нажатие букв приво­дит к изменению текста заголовка окна на нажатую букву.

12.              Перемещение мыши в нижней половине окна максимизирует окно. Нажатие ESC возврат окна к прежнему виду.

13.              Двойной щелчок левой кнопкой в неклиентской области окна максимизирует окно. Нажатие любой буквы возврат к прежним раз­мерам.

14.              Двойной щелчок правой кнопкой в не клиентской области окна приводит к его перемещению в цикле из его исходного состояния в го­ризонтальном направлении влево и вправо до тех пор, пока не будет нажата любая клавиша из нижней линейки.

15.              Одновременное нажатие кнопок в неклиентской области окна приводит к его перемещению по экрану в вертикальном направлении после нажатия клавиш из линейки «ASD..».

16.              Перемещение мыши в неклиентской области окна приводит к изменению его размеров. Нажатие клавиши ESC запрещает подобное изменение.

17.              Двойной щелчок правой кнопки в клиентской области окна изменяет текст заголовка окна на заданный текст. Обратная замена -клавиша F1.

18.              Создать два окна, одно из которых частично перекрывает дру­гой. Щелчок правой кнопкой в левой половине верхнего окна активи­зирует перекрытое окно. Если до щелчка нажать клавишу «пробел», то перекрытое окно не активизируется.

19.              Перемещение мыши в левой половине окна изменяет цвет фо­на окна (SetClassLongPtr). Нажатие клавиши F1 отменяет изменение.

20.              Двойной щелчок левой кнопкой в неклиентской области окна свертывает его в пиктограмму. Нажатие любой функциональной кла­виши разворачивает окно.

21.              Создать три окна, одно из них показать. Двойной щелчок пра­вой кнопкой в неклиентской области окна приводит к выводу на экран остальных окон, если они еще не показывались. Вывод созданных, но не показанных окон разрешен только в случае, если не нажата клавиша Enter.

22.              Перемещение мыши в неклиентской области окна приводит к перемещению окна в левый верхний угол экрана. Нажатие клавиш PgUp и PgDn приводит к перемещению окна из левого верхнего угла в левый нижний угол и обратно.

23.              Щелчок правой кнопкой в неклиентской области окна отменя­ет реакцию на нажатие клавиш End и Ноте, которые перемещают вы­веденное окно соответственно между левым верхним и правым ниж­ним углом экрана.

Двойной щелчок левой кнопки в клиентской области окна приводит к смене заголовка окна. Выбор текущего заголовка окна за­висит от количества нажатий клавиши Insert. Каждое следующее нажатие делает активным следующий по прядку заголовок из некоторого массива заголовков (циклически).

25.              Вывести на экран два окна. Двойной щелчок правой кнопки в клиентской области любого из окон меняет их местами. Обратный об­мен по нажатию клавиши Delete.

26.              Вывести на экран два окна. Щелчок правой кнопкой в правой половине второго окна изменяет заголовок первого. Обратный обмен -по нажатию клавиши Insert.

27.              Вывести на экран три окна. Щелчок левой кнопкой в правой половине любого окна приводит к свертке в пиктограмму остальных. Обратное разворачивание, если они уже свернуты, осуществить при нажатии любой цифровой клавиши.

28.              Двойной щелчок левой кнопкой в неклиентской области окна приводит к выводу на экран дочернего окна. Свернуть в пиктограмму оба окна можно при нажатии клавиш F1-F5.

29.              Создать два окна, одно из них показать. Двойной щелчок пра­вой кнопкой в неклиентской области показанного окна приводит сна­чала к показу второго окна, потом к его сворачиванию, потом к его разворачиванию, потом к его закрытию.

30.              Создать два окна. Щелчок левой кнопкой в неклиентской об­ласти любого окна приводит к перемещению их в левый верхний угол экрана так, чтобы меньшее было сверху. Нажатие любой гласной бук­вы закрывает оба окна.

31.              Создать два окна. Перемещение мыши в неклиентской области первого окна вызывает перемещение второго окна по горизонтали от левого к правому краю экрана и обратно. Нажатие любой цифры за­крывает оба окна.

32.              Двойной щелчок левой кнопки в клиентской области окна приводит к выводу на экран двух дочерних окон. По нажатию клавиши Esc заголовки дочерних окон меняются местами.

33.              Вывести на экран два окна. Двойной щелчок правой кнопки в клиентской области первого окна приводит к последовательной сверт­ке и развертке второго окна до тех пор, пока не нажата клавиша «про­бел».

34.              Отпускание левой кнопки мыши в верхнем левом квадранте окна изменяет текст заголовка окна на одну из нескольких строк текста в зависимости от координаты отпускания. Этот режим активен только после нажатия одной из клавиш-стрелок.

Щелчок левой кнопкой в верхнем левом квадранте окна при­водит к его перемещению на столько пикселов влево, каков порядковый номер щелчка. Максимизация окна нажатие клавиши «стрелка вверх».

36.              Двойной щелчок левой кнопкой в неклиентской области окна приводит к созданию другого окна, цвет фона которого зависит от ко­ординаты щелчка. Нажатие любой цифры закрывает созданное окно.

37.              Вывести окно в правой половине экрана. Двойной щелчок правой кнопкой в неклиентской области окна приводит к тому, что каждое последующее нажатие клавиши «пробел» сдвигает окно влево.

38.              Щелчок левой кнопкой в области заголовка окна изменяет этот заголовок и выводит на экран второе окно. Закрытие обоих окон происходит при нажатии любой функциональной клавиши.

39.              Нажатие клавиши Insert запрещает реакцию на щелчок правой кнопкой в неклиентской области окна. Реакция на такой щелчок за­ключается в перемещении окна по экрану из левого нижнего в правый верхний угол.

40.              Одновременный щелчок кнопок в клиентской области окна приводит к выводу на экран дочернего окна. По нажатию клавиши Ноте оба эти окна перемещаются к правой границе экрана.

41.              Вывести на экран три окна с различными цветами фона. Двой­ной щелчок правой кнопки в клиентской области любого окна свора­чивает в пиктограмму остальные окна. Их разворачивание по нажа­тию цифр на дополнительной клавиатуре.

42.              Щелчок правой кнопкой в верхнем правом квадранте окна вы­водит новое окно, цвет фона которого зависит от места щелчка (преду­смотреть не менее 3 вариантов). Нажатие функциональной клавиши закрывает созданные окна.

43.              Вывести на экран три окна, одно из которых родительское для двух других. Щелчок левой кнопкой в верхнем правом квадранте родительского окна закрывает дочерние окна. Нажатие любой буквен­ной клавиши закрывает и родительское окно.

44.              Вывести на экран три окна. Одновременный щелчок кнопок в неклиентской области любого окна закрывает два из них, и третье ок­но получает возможность перемещаться к левой границе экрана при нажатии клавиши End.

45.              Двойной щелчок правой кнопкой в неклиентской области окна разрешает следующую реакцию на нажатие цифр на дополнительной клавиатуре. Каждое нажатие цифры уменьшает ширину окна на столь­ко пикселов, какова цифра.

Щелчок левой кнопкой в неклиентской области окна приводит к изменению заголовка окна на новую строку в зависимости от предварительного нажатия буквенных клавиш. По номеру линейки выби­рается новый заголовок.

47.              Щелчок правой кнопкой в неклиентской области окна вызыва­ет его циклическое перемещение по экрану. Эта реакция на кнопку разрешается при предварительном нажатии не менее 5 буквенных кла­виш.

48.              Двойной щелчок левой кнопки в клиентской области окна вы­зывает смену заголовка окна на букву, клавиша которой была нажата перед щелчком.

49.              Двойной щелчок правой кнопки в клиентской области окна выводит на экран дочернее окно, цвет фона которого зависит от коор­динаты щелчка. Реализовать не менее 4 вариантов.

50.              Щелчок правой кнопкой в нижнем левом квадранте окна сво­рачивает его в пиктограмму, а нажатие клавиши F8 разворачивает окно при условии, что перед этим была нажата хотя бы одна цифра.

51.              Щелчок левой кнопкой в нижнем левом квадранте окна раз­решает перемещение окна по экрану с помощью клавиш-стрелок, PgUp, PgDn.

52.              Двойной щелчок левой кнопкой в неклиентской области окна позволяет в дальнейшем при нажатии клавиш 1-4 двигать окно по эк­рану в четырех направлениях.

53.              Двойной щелчок правой кнопкой в не клиентской области окна выводит на экран два дочерних окна с разными стилями. Нажатие лю­бой функциональной клавиши закрывает одно из дочерних окон.

54.              Щелчок левой кнопкой в неклиентской области окна выводит длину заголовка окна. Нажатие любой буквы меняет заголовок на эту букву.

55.              Щелчок правой кнопкой в неклиентской области окна разре­шает перемещение окна в левый верхний угол (по нажатии F1), левый нижний угол (F2), правый верхний (F3), правый нижний (F4).

56.              Двойной щелчок левой кнопки в клиентской области окна раз­решает создание дочернего окна по нажатию цифры. Заголовком до­чернего окна должна стать эта цифра.

57.              Двойной щелчок правой кнопки в клиентской области окна за­крывает все дочерние окна, созданные по нажатии клавиш F1-F4.

58.              Щелчок правой кнопкой в нижнем правом квадранте окна раз­решает перемещение окна при нажатии стрелок на дополнительной клавиатуре.

59.              Щелчок левой кнопкой в нижнем правом квадранте окна при­водит к созданию дочернего окна, заголовок которого буква, нажатая перед щелчком.

60.              Двойной щелчок левой кнопкой в неклиентской области окна выводит на экран другое окно. Щелчок правой кнопки в его клиент­ской области разрешает его перемещение вверх-вниз по нажатии F4.

61.              Двойной щелчок правой кнопкой в неклиентской области окна разрешает перемещение окна по экрану с помощью клавиш: Т вверх, В вниз, L влево, R вправо.

62.              Щелчок левой кнопкой в неклиентской области окна приводит к созданию двух окон с разными стилями класса. Нажатие клавиш-стрелок позволяет перемещать любое окно, если при активном 1 окне нажата любая гласная буква.

63.              Вывести на экран 2 окна. Щелчок левой кнопкой в неклиент­ской области любого окна изменяет заголовок второго окна. Нажатие любой цифры возвращает исходный заголовок.

64.              Щелчок правой кнопкой в неклиентской области окна разре­шает вывод двух дочерних окон. Первое окно выводится га экран при нажатии буквы «А», второе при нажатии буквы «В».Закрытие всех окон по нажатию «ESC».

65.              Двойной щелчок левой кнопки в клиентской области окна вы­водит дочернее окно. Закрытие дочернего окна нажатие F1, повтор­ный вывод нажатие F2.

66.              Двойной щелчок правой кнопки в клиентской области окна разрешает перемещение окна влево, вправо, вверх и вниз соответст­венно при нажатии Fl, F2, F8, F9.

67.              Двойной щелчок левой кнопки в неклиентской области окна выводит на экран два дочерних окна. Нажатие любой цифры закрывает дочерние окна.

68.              Двойной щелчок левой кнопки в неклиентской области окна приводит к появлению на экране дочернего окна. Заголовок этого окна может изменяться на букву в зависимости от места щелчка.

69.              Щелчок правой кнопки в клиентской области окна разрешает перемещать окно по экрану при нажатии клавиш-стрелок. Двойной щелчок левой кнопки запрещает такое перемещение.

70.              Вывести на экран родительское окно и два дочерних. Щелчок левой кнопкой в клиентской области любого дочернего окна разреша­ет их перемещение по экрану вверх и вниз при нажатии букв Н и D со­ответственно.

71.              Двойной щелчок правой кнопкой в неклиентской области окна разрешает создание дочернего окна при нажатии цифр 0 или 1. Нажа­тие любой буквы уменьшает размеры дочернего окна в 2 раза.

72.              В левом верхнем углу клиентской области окна создать дочер­нее окно. После нажатия левой клавиши мыши 4 раза «мигает» вре­менное окно, а после нажатия правой 3 раза «мигает» дочернее окно.

73.              Создать окно приложения размером в одну шестнадцатую площади экрана с заголовком «Идет форматирование диска» без кно­пок изменения размеров, закрытия и сворачивания в пиктограмму и без кнопки системного меню. При перемещении курсора мыши над клиентской областью окно должно «убегать» от курсора мыши в слу­чайном образом выбранном направлении, оставаясь в пределах экрана.

74.              В левом верхнем углу клиентской области окна создать вре­менное окно площадью в одну шестнадцатую площади это области. При нажатии на левую (правую) клавишу мыши временное окно пере­местить в соседний по ходу (против хода) часовой стрелки угол кли­ентской области.

75.              При запуске 2-го экземпляра приложения спросить пользова­теля, нужно ли его запустить. Если пользователь ответит «Да», то за­пустить его. Иначе изменить заголовок 1-го экземпляра.

76.              Окно приложения без заголовка занимает весь экран фоном рабочего стола. Закрытие окна по щелчку правой кнопки мыши.

77.              В центре клиентской области окна располагается невидимое окно без заголовка размером в четверть площади клиентской области. После нажатия левой клавиши мыши над клиентской областью любого из окон окно без заголовка должно стать видимым, а после нажатия правой невидимым.

78.              Создать окно размером в четверть площади экрана. После двойного щелчка мыши окно перемещается так, что его центр совпа­дает с координатами курсора мыши в момент щелчка.

79.              Дочернее окно размером в 1А родительского окна при переме­щении курсора мыши над ним «убегает» от курсора мыши в произ­вольном направлении, оставаясь в пределах клиентской области роди­тельского окна.

80.              При запуске не первого экземпляра приложения выдать пре­дупреждающее сообщение о количестве уже работающих копий этого приложения. Запустить экземпляр, только если согласен пользователь.

1.10 Контрольные вопросы

1.     Какая информация содержится в одном сообщении?

2.     Приведите пример предварительной обработки сообщения Windows.

3.   Какие функции используются для получения дескрипторов стан­
дартных ресурсов?

4.     Какая информация указывается в структуре WNDCLASS?

5.     Что такое стиль класса окна?

6.     Поясните назначение стиля окна.

7.     Зачем регистрировать класс окна?

8.     Какие параметры имеет функция CreateWindow?

9.     Поясните назначение функции GetMessage.

10.     Какие параметры имеет функция GetMessage?

11.     Зачем нужна функция PeekMessage?

12.     При каком условии завершается цикл обработки сообщений?

13.      Какие функции вызываются в теле цикла обработки сообщений минимального приложения?

14.      В чем заключается отличие между функциями PostMessage и SendMessage?

15.      Какие параметры имеет оконная функция?

16.    Какие сообщения должна обрабатывать минимальная оконная
функция?

17.      Поясните структуру оконной функции.

18.      Какое назначение имеет функция DefWindowProc?

19.      Чем различаются аппаратные и символьные сообщения клавиату­ры?

20.  Какие системные и несистемные сообщения Вам известны?

21.  Что передается в параметрах сообщений от мыши?

22.  Что такое не клиентская область?

23.  Какие макросредства MASM32 Вам известны?

24.  Как выполнить захват и освобождение мыши?

25.  Что такое время Windows?

26.  Как организовать в программе выполнение действий с некоторой периодичностью?

Источник: Сучкова, Л.И. Win32 API: основы программирования: учебное пособие/ Л.И. Сучкова; АлтГТУ им. ИИ. Ползунова. -Барнаул, АлтГТУ, 2010. 138 с, ил.

По теме:

  • Комментарии