Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Операционная система Windows обладает весьма мощным набором функций,
выполняющих рисование геометрических фигур. На основе приведенных
примеров при определенной фантазии можно достаточно легко создавать
весьма сложные фигуры и композиции.
5.5. Обработка сообщений мыши
В предыдущих примерах мы использовали два обработчика сообщений, поступающих
от мыши, — WMLBUTTONDOWN (нажата левая кнопка мыши) и
WM_RBUTTONDOWN (нажата правая кнопка мыши). От мыши может поступать
намного больше сообщений. Для программистов представляют интерес следующие
события:
• WM_LBUTTONDOWN — нажата левая кнопка мыши;
• WM_LBUTTONUP — отпущена левая кнопка мыши;
• WM_RBUTTONDOWN — нажата правая кнопка мыши;
• WM_RBUTTONUP — отпущена правая кнопка мыши;
• WM_LBUTTONDBLCLK — двойной щелчок левой кнопкой мыши;
• WMMOUSEMOVE — мышь перемещается по рабочей области окна.
Для всех этих сообщений в параметре lParam содержится положение курсора
мыши. Младшее слово — это координата х, а старшее слово — координата
у относительно верхнего левого угла рабочей области окна.
Рассмотрим пример программы, в которой текущие координаты курсора
мыши отображаются в окне приложения. Исходный текст приложения (назовем
его MPOINT) приведен далее в листинге 5.17.
Листинг 5.17. Программа/выводящая в окно приложения текущие координаты
MPOINT.ASM
.386
.model flat, stdcaii
option casemap :none
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\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
data
szDisplayName DB "ОТОБРАЖЕНИЕ КООРДИНАТ КУРСОРА МЫШИ", О
CommandLine DD О
hWnd DD О
hlnstance DD 0
szClassName DB "Demo Class", 0
Здесь сохраняем текущие координаты мыши
point_x DD О
point_y DD О
Параметры для функции wsprintf
sx DB " Х= ", О
sy DB " Y= ", О
buf DB 32 dup (0)
ibuf DD 0
lpFmt DB "%s%u%s%u", 0
. code
start:
push NULL
call GetModuleHandle
mov hlnstance, EAX
call GetCommandLine
mov CommandLine, EAX
push SW_SHOWDEFAULT
push CommandLine
push NULL
push hlnstance
call WinMain
push EAX
call ExitProcess
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
Локальные переменные процедуры
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
Заполнение структуры WNDCLASSEX требуемыми параметрами
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 hlnst
pop wc.hlnstance
mov wc.hbrBackground, C0L0R_BTNFACE+1
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
invoke Loadlcon, NULL, IDI_APPLICATION
mov wc.hlcon, EAX
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, EAX
mov wc.hlconSm, 0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx, WS_EX_OVERLAPPEDWINDOW, ADDR szClassName,\
ADDR szDisplayName, WS_OVERLAPPEDWINDOW,\
CWJJSEDEFAULT, CWJJSEDEFAULT, CWJJSEDEFAULT, \
CWJJSEDEFAULT, NULL, NULL, hlnst, NULL
mov hWnd, EAX
invoke ShowWindow, hWnd, SW_SHOWNORJMAL
invoke UpdateWindow, hWnd
Цикл обработки сообщений
StartLoop:
push 0
push 0
push NULL
lea EAX, msg
push EAX
call GetMessage
cmp EAX, 0
je ExitLoop
lea EAX, msg
push EAX
call TranslateMessage
lea EAX, msg
push EAX
call DispatchMessage
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
WinMain endp
Оконная процедура
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hdc
LOCAL ps
LOCAL rect
HDC
PAINTSTRUCT
RECT
cmp uMsg, WM_PAINT
jne next_l
invoke BeginPaint, hWnd, ADDR ps
mov hdc, EAX
invoke TextOut, hdc, point_x, point^_y, ADDR buf, ibuf
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret
next_l:
cmp
jne
uMsg, WM_MOUSEMOVE
next 2
invoke GetDC, hWin
mov hdc, EAX
invoke GetciientRect, hWin, ADDR rect
mov EAX, lParam
mov point_x, EAX
and point_x, OFFFFh
shr EAX, 16
mov point_y, EAX
push point_y
push offset sy
push point_x
push offset sx
push offset lpFmt
push
call
offset buf
wsprintf
338 Гпава 5
add ESP, 24
mov ibuf, EAX
invoke InvalidateRect,
push hdc
push hWin
call ReleaseDC
ret
hWin, ADDR rect, TRUE
next 2:
cmp uMsg, WM_DESTROY
jne next 3
push NULL
call PostQuitMessage
xor EAX, EAX
ret
next_3:
push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret
WndProc endp
end start
<< Назад В начало Далее >> |
|