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





До сих пор мы уделяли внимание работе с основными атрибутами текстовых
строк, такими как цвет и шрифт, а также рассмотрели вопросы позиционирования
текста в окне приложения. Однако не все данные могут быть
выведены на экран с помощью функции Text out. К примеру, вывести целое
число без преобразования его в текстовую строку невозможно. Как решить
задачу конверсии числа в текст? Здесь на помощь приходит уже известная
нам из главе 2функция WIN API wsprintf. Напомню ее синтаксис:
// выходной буфер
// строка форматирования
// аргументы
Функция wsprintf выполняет форматирование и запись последовательности
символов и чисел в буфер. Все аргументы функции преобразуются и
копируются в выходной буфер в соответствии со спецификацией, записанной
в строке форматирования.
Функция добавляет завершающий ноль для записанных строк, однако возвращаемый
результат (размер строки) не учитывает его. Должен заметить,
что в Windows, к сожалению, нет функций для преобразования вещественных
ЧИСеЛ В СТРОКУ СИМВОЛОВ, ПОДОбнЫХ wsprintf.
Разработаем приложение, демонстрирующее преобразование целочисленного
значения в строку и вывод ее в окно приложения. Пусть наша программа
отображает количество щелчков правой кнопки мыши в окне приложения.
Исходный текст приложения (назовем его CLICKS) приведен в листинге 5.11.

Листинг 5.11 Программа, отображающая количество щелчков правой кнопки мыши
. CLICKS. 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
int wsprintf(LPTSTR lpOut,
LPCTSTR lpFmt,
);
includelib \masm32\lib\gdi32.lib
; WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
data
szDisplayName DB "ПРИМЕР ИСПОЛЬЗОВАНИЯ ФУНКЦИИ wsprintf", О
CommandLine DD 0
hWnd DD 0
hlnstance' DD 0
szClassName DB "Demo_Class", 0
si DB "Вы нажали правую кнопку мыши ", О
s2 DB " раз!", О
; wsprintf
lpFmt DB "%s%d%s", О
buf DB 128 dup (0)
ibuf DD 0
cnt DD 0
tsize label DWORD
crx DD 0
cry DD 0
. code
start:
invoke GetModuleHandle, NULL
mov hlnstance, EAX
invoke GetCommandLine
mov CommandLine, EAX
invoke WinMain, hlnstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, 0
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+7
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
invoke Loadlcon, NULL, IDI_APPLICATION
mov wc.hlcon, EAX
invoke LoadCursor, NULL, IDC_ARR0W
mov wc.hCursor, EAX
mov wc.hlconSm, 0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx, WS_EX_0VERLAPPEDWIND0W, ADDR szClassName,\
ADDR szDisplayName, WSJDVERLAPPEDWINDOW,\
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\
CWJJSEDEFAULT, NULL, NULL, hlnst, NULL
mov hWnd, EAX
invoke ShowWindow, hWnd, SW_SH0WN0RMAL
invoke ' Updatewindow, hWnd

Цикл обработки сообщений
StartLoop:
invoke GetMessage, ADDR msg, NULL, 0, 0
cmp EAX, 0
je ExitLoop
306 Гпава 5
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
WinMain endp
WndProc proc hWin
uMsg
wParam
lParam
LOCAL hdc :HDC
LOCAL rect :RECT
LOCAL ps :PAINTSTRUCT
LOCAL tx, ty :DWORD
LOCAL x, у :DWORD
cmp uMsg, WM_PAINT
jne next_0
lea EDX, ps
push EDX
push hWin
call BeginPaint
mov hdc, EAX
push PRF_CLIENT
push hdc
push WM_PRINT
push hWin
call SendMessage lea EDX, ps
push EDX
push hWin
call EndPaint
ret
next_0:
PRINT
lea ESI, s2
:DWORD,
:DWORD,
:DWORD,
:DWORD
push
push
lea
push
lea
push
lea
push
call
add
mov
invoke
mov
sub
sub
shr
mov
mov
sub
sub
shr
mov
invoke
ret
next_l:
cmp
jne
inc
push
push
push
push
call
ret
ESI
cnt
ESI, si
ESI
ESI, lpFmt
ESI
ESI, buf
ESI
wsprintf
ESP, 20
ibuf, EAX
GetTextExtentPoint32, hdc, ADDR buf, ibuf, ADDR tsize
EAX, rect.right
EAX, rect.left
EAX, crx
EAX, 1
x, EAX
EAX, rect.bottom
EAX, rect.top
EAX, cry
EAX, 1
y, EAX invoke TextOut, hdc, x, y, ADDR buf, ibuf
ReleaseDC, hWnd, hdc
uMsg, WM_RBUTTONDOWN
next_2
cnt
PRF_CLIENT
hdc
WM_PRINT
hWin
SendMessage
next 2:
cmp uMsg, WM_DESTROY
next 3
invoke PostQuitMessage, NULL
xor EAX, EAX
ret
next_3:
invoke DefWindowProc, hWin, uMsg, wParam, lParam
ret
end start


 
 
 

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