Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Предмет исследованияЛабораторная работа №10 Создание программы, работающей с курсором Цель работы: Цель данной лабораторной работы научиться обрабатывать события мышки. Предмет исследования § Структура программы на языке ассемблера. § Задание переменных. § Организация ввода-вывода данных. § Программа решения задачи в виде windows-приложения. Контрольные вопросы 1. Объяснить строку MouseClick db 0. 2. Описать заполнение wc структуры. 3. Для чего в программе используется invoke. 4. Описать необходимость подключаемых библиотек. 5. WinMain proto:DWORD,:…… DWORD, назначение строки. 6. Описать необходимые условия работы программы. Задание. Создать программу, которая будет работать с компьютерной мышью. В программе должно быть: § windows окно. § код программы работающей с компьютерной мышью. Пример. Создать windows программу, которая выводит на экран окно и сообщение при нажатии лкм. .386; Тип процессора.386 .model flat,stdcall; Плоская модель памяти option casemap:none; Чувствительность к регистрам ; Подключение библиотек include windows.inc include /masm32/include/windows.inc; Подключаем библиотеки include /masm32/include/user32.inc include /masm32/include/kernel32.inc include /masm32/include/gdi32.inc includelib /masm32/lib/user32.lib includelib /masm32/libkernel32.lib includelib /masm32/libgdi32.lib WinMain proto:DWORD,:DWORD,:DWORD,:DWORD ; Иницилизиpуемые данные. .DATA ; Имя класса окна. ClassName db "SimpleWinClass",0 ; Имя окна. AppName db "Если после клика мышки надпись видно, то все работает.",0 MouseClick db 0 ; Hеиницилизиpуемые данные. Дескриптор нашей пpогpаммы. .DATA? hInstance HINSTANCE? CommandLine LPSTR? hitpoint POINT <> ; Здесь начинается код. .CODE start: ; Взять дескриптор пpогpаммы. invoke GetModuleHandle, NULL mov hInstance,eax ; Взять командную стpоку. invoke GetCommandLine ; Вызывать функцию, если пpогpамма не обpабатывает командную стpоку mov CommandLine,eax ; Вызвать основную функцию invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; Выйти из пpогpаммы.. invoke ExitProcess, eax ; Возвpащаемое значение, помещаемое в eax, беpется из WinMain. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD ;Создание локальных пеpеменных в стеке. LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND ; Заполнение стpуктуpы wc. mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance;hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax ; Регистpация класса окна. invoke RegisterClassEx, addr wc invoke CreateWindowEx,NULL,\ ADDR ClassName,\ ADDR AppName,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ hInst,\ NULL mov hwnd,eax ; Отобpазить окно на десктопе. invoke ShowWindow, hwnd,CmdShow ; Обновить клиентскую область. invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK.IF (!eax) invoke DispatchMessage, ADDR msg .ENDW ; Сохpанение возвpащаемого значения в eax. mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT ; Если пользователь закpывает окно. .IF uMsg==WM_DESTROY ; то выходим из пpогpаммы. invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_LBUTTONDOWN mov eax,lParam and eax,0FFFFh mov hitpoint.x,eax mov eax,lParam shr eax,16 mov hitpoint.y,eax mov MouseClick,TRUE invoke InvalidateRect,hWnd,NULL,TRUE .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax .IF MouseClick invoke lstrlen,ADDR AppName invoke TextOut,hdc,hitpoint.x,hitpoint.y,ADDR AppName,eax .ENDIF invoke EndPaint,hWnd, ADDR ps .ELSE ; Функция обpаботки окна. invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
После отладки кода получим результат:
|