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

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


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





Вначале рассмотрим, как формируется строка текста для отображения в окне
приложения. Формирование строки выпоняется функцией wsprintf. Вот
фрагмент программного кода такого преобразования:
si DB "Вы нажали правую кнопку мыши ", О
s2 . DB " раз!", О
lpFmt DB "%s%d%s", О
buf DB 128 dup (0)
ibuf DD 0
cnt DD 0
lea ESI, s2
push ESI
push cnt
lea ESI, si
push ESI
lea ESI, lpFmt
push ESI
lea ESI, buf
push ESI
call wsprintf
add ESP, 20
mov ibuf, EAX

Функция wsprintf в качестве первого параметра принимает адрес буфера для хранения результата преобразования. Буфер buf должен иметь достаточный размер для размещения в нем результата преобразования. Вторым параметром функции является адрес строки форматирования lpFmt. Строка форматирования представляет собой последовательность управляющих символов для определения способа преобразования и вывода аргументов, которые представляют собой третий и последующие параметры. Очень важно запомнить, что в отличие от подавляющего большинства функций WIN API, использующих соглашение stdcaii передачи параметров, wsprintf обрабатывает параметры в соответствии с директивой cdecl! Поскольку освобождать стек в этом случае должна вызывающая программа, то необходима последующая команда:
add ESP, 20

Так как функция принимает пять параметров по четыре байта, то вызывающая программа должна освободить 20 байт.
В нашем случае строка форматирования имеет вид "%s%d%s", в качестве параметров передаются строка si, целое число cnt и строка s2. В качестве результата ibuf функция возвращает фактическое количество символов, записанное в буфер без учета завершающего нуля, который всегда добавляется в конец строки.
После того, как буфер символов сформирован, остается только вывести его посередине окна приложения. Вычисление координат х и у начала вывода текста выполняется функцией GetText.ExtentPoint32, а сам вывод осуществляется при помощи функции TextOut. Все операции преобразования и отображения строки текста выполняются в обработчике WMPRINT ОКОННОЙ процедуры.
Полностью ассемблерный вариант обработчиков WMPAINT, WMPRINT И WMRBUTTONDOWN оконной процедуры приведен в листинге 5.12.
Листинг 5.12. Обработчики событий WMJPAINT, WMJPRINT И WM_RBUTTONDOWN, написанные полностью на ассемблере
cmp DWORD PTR [ЕВР+12] , WM_PAINT
jne next_0
lea EDX, ps
push EDX
push [EBP+8]
call BeginPaint
mov
push
push
push
push
call
push
push
call
ret
next_0:
cmp
jne
push
call
mov
lea
push
push
call
push
push
push
push
push
call
add
mov
push
push
push
push
hdc, EAX
PRF_CLIENT
hdc
WM_PRINT
[EBP+8]
SendMessage lea EDX, ps
EDX
[EBP+8]
EndPaint
DWORD PTR [EBP+12], WM_PRINT
next_l
[EBP+8]
GetDC
hdc, EAX
ESI, rect
ESI
[EBP+8]
GetClientRect
offset s2
cnt
offset si
offset lpFmt
offset buf
wsprintf
ESP, 20
ibuf, EAX
offset tsize
ibuf
offset buf
hdc
call GetTextExtentPoint32
mov ЕАХ, rect.right
sub EAX, rect.left
sub EAX, crx
shr EAX, 1
mov x, EAX
mov EAX, rect.bottom
sub EAX, rect.top
sub EAX, cry
shr EAX, 1
mov y, EAX push ibuf push offset buf
push у
push x
push hdc
call TextOut
push hdc i
push [EBP+8]
call ReleaseDC next_l:
cmp DWORD PTR [EBP+12], WM_RBUTTONDOWN
jne next_2 inc cnt push PRF_CLIENT
push hdc push WM_PRINT
push [EBP+8]
call SendMessage
ret


 
 
 

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