Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru