Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Программа рисует набор линий при нажатии и удержании левой кнопки мыши (сообщение WM_LBUTTONDOWN). Если кнопка отпущена (сообщение WM_LBUTTONUP), рисование прекращается. Отображение линий выполняется при перемещении мыши по клиентской области окна (сообщение WM_MOUSEMOVE).
Очистка клиентской области окна выполняется при нажатии правой кнопки мыши (сообщение WMRBUTTONDOWN). При обработке этого сообщения восстанавливается и начальная точка рисования.

Если левая кнопка мыши была отпущена, то при повторном нажатии координаты начальной точки рисования меняются. Сам процесс рисования линий выполняется следующим фрагментом кода:
mov ЕАХ, lParam
mov cur_x, ЕАХ
and cur_x, OFFFFh
shr EAX, 16
mov cur_y, EAX
invoke MoveToEx, hdc, prev_x, prev_y, 0
invoke LineTo, hdc, cur_x, cur_y

5.6. Ввод данных с клавиатуры
Несмотря на то, что большинство приложений активно использует мышь, без ввода информации с клавиатуры не обходится ни одна программа. Далее мы рассмотрим несколько примеров работы с клавиатурой, но вначале коротко о том, как Windows обрабатывает клавиатурный ввод.
Программа узнает о нажатиях клавиш посредством сообщений, которые посылаются оконной процедуре. Операционная система передает сообщения клавиатуры, по одному за раз, в очередь сообщений программы, содержащей окно с фокусом ввода (input focus). После этого программа отправляет сообщения соответствующей оконной процедуре.

Чтобы отобразить события клавиатуры, Windows посылает восемь различных сообщений программе. Приложение может игнорировать многие из них. Обычно такие сообщения содержат намного больше информации, чем нужно приложению. Рассмотрим наиболее важные из них. Первое, что всегда интересует программиста — это как получить код нажатой клавиши.

Для нажатых символьных клавиш Windows генерирует сообщение WMCHAR. Разработаем простое приложение, отображающее в клиентской области окна введенный с клавиатуры символ. Исходный текст приложения (назовем его SHOWCH) приведен в листинге 5.19.
Листинг 5.19. Программа, выводящая в окно приложения введенный с клавиатуры символ
. . SHOWCH.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 О
szClassName DB "Demo_Class", 0
sTitle DB "Введенный символ", О
sMsg DB "Вы ввели символ "
cl DB ?, О
. 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
pop
hlnst
wc.hlnstance
. mov wc.hbrBackground, COLOR J3TNFACE+9
mov wc.lps zMenuName, 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_SHOWNORMAL
invoke Updatewindow,hWnd

Цикл; обработки сообщений
StartLoop:
push 0
push 0
push NULL
lea EAX, msg
push ЕАХ
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 :HDC
LOCAL ps :PAINTSTRUCT
cmp uMsg, WM_PAINT
jne next_l
invoke BeginPaint, hWnd, ADDR ps
mov hdc, EAX
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret
next_l:
cmp uMsg, WM_CHAR
jne next 2
mov EAX, wParam
mov cl, AL
push MB_OK
push offset sTitle
push offset sMsg
push 0
call MessageBox
ret
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 De fWindowProc
ret
WndProc endp
end start


 
 
 

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