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





Проанализируем обработчик сообщения WMCHAR. Если необходимо получить символ, соответствующий нажатой клавише, то наличие такого обработчика в оконной процедуре обязательно.
При отправлении приложению такого сообщения операционная система Windows помещает в переменную wParam код нажатой клавиши, который может быть использован в дальнейшем. В данном случае программа помещает код символа в регистр AL и затем сохраняет его в переменной cl, после чего выводит сообщение.
Фрагмент кода, выполняющий эти операции, несложен и выглядит так:
mov ЕАХ, wParam
mov cl, AL
push MB_OK
push offset sTitle
push offset sMsg
push 0
call MessageBox

Следующий пример более сложный. Проанализируем регистр введенных с клавиатуры символов, и строчные символы преобразуем в прописные. Вводимые символы отобразим в окне приложения. Для анализа и преобразования символов будем использовать две функции WIN API, с которыми мы еще не встречались — charupper и ischarupper. Функция charupper имеет следующий синтаксис:
LPTSTR CharUpper(LPTSTR lpsz // указатель на символ или ' 11 строку с завершающим нулем
);
Функция ischarupper определяет, принадлежит ли символ верхнему регистру. Анализ основывается на семантике выбранного пользователем языка во время инсталляции системы или через панель управления Windows.
Функция ischarupper имеет синтаксис:
BOOL IsCharUpper(TCHAR ch // проверяемый символ
) ;
Если символ оказывается прописной буквой, функция возвращает TRUE, В противном случае — FALSE.
Исходный текст программы (назовем ее SHOWC) приведен далее в листинге 5.20.
Листинг 5.20. Программа, преобразующая строчные символы в прописные .
. SHOWC.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 0
hWnd DD 0
hlnstance DD 0
szClassName DB II
si DB II
Is EQU $

Введенный символ:
354 Глава 5
start:
push NULL
call GetModuleHandle
mov hlnstance, EAX
call GetCommandLine
mov CommandLine, EAX push SW_SHOWDEFAULT
push CommandLine
push NULL
push hlnatance
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
dl DB "Преобразованный символ: ", О
Id EQU $-dl-l .code
lea EAX, msg
mov wc.hbrBackground, COLORJ3TNFACE+5
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
invoke Loadlcon, NULL, IDI_APPLICATTON
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, \
CW_USEDEFAULT, 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 EAX
call GetMessage
cmp EAX, 0
je ExitLoop
lea EAX, msg
push EAX
call TranslateMessage
push ЕАХ
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
LOCAL x, у
HDC
PAINTSTRUCT
RECT
DWORD
cmp uMsg, WM_PAINT
jne next_l
invoke BeginPaint, hWnd, ADDR ps
mov hdc, EAX
invoke GetClientRect, hWin, ADDR rect
mov EAX, rect.right
sub EAX, rect.left
shr EAX, 2
mov x, EAX
mov EAX, rect.bottom
sub EAX, rect. top
shr EAX, 1
mov y, EAX
invoke TextOut, hdc, x, y, ADDR si,Is
add
invoke
lea
push
push
call
ret
next_l:
cmp
jne
invoke
mov
invoke
lea
add
sub
mov
lea
add
sub
mov
push
call
je
push
call
invoke
invoke
ret
next_2:
cmp
jne
push
У, 20
TextOut, hdc, x, y, ADDR dl,ld
EDX, ps
EDX
hWnd
EndPaint
uMsg, WM_CHAR
next_2
GetDC, hWin
hdc, EAX
GetciientRect, hWin, ADDR rect mov EAX, wParam
EDI, si
EDI, Is
EDI, 2
[EDI], AL
EDI, dl
EDI, Id
EDI, 2
[EDI], AL
DWORD PTR [EDI]
IsCharUpper cmp EAX, 1
next
EDI
CharUpper next:
InvalidateRect, hWin, ADDR rect, TRUE
ReleaseDC, hWin, hdc
uMsg, WM_DESTROY
next_3
NULL
358 Гпава 5
call PostQuitMessage
xor EAX, EAX
ret
next 3:
push
push
push
push
wParam
uMsg
hWin
lParam
call DefWindowProc
ret
WndProc endp
end start


 
 
 

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