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

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


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





Назначение и принцип работы функции CreateFont нам известны, а вот
зачем нужна функция SelectObject? Эта функция устанавливает вновь созданный
объект в контекст устройства, заменяя ранее установленный. Этим
объектом может быть шрифт, кисть или битовый образ. Рассмотрим еще один пример работы с текстом. Попробуем решить такую
задачу: вывести три строки текста в клиентскую область окна, причем размеры
шрифта для каждой строки будут отличаться. Строки необходимо отобразить
с определенным интервалом в клиентской области окна приложения.
Все эти операции выполним в обработчиках сообщений WM_LBUTTONDOWN, WM_RBUTTONDOWN и WM_PAINT оконной процедуры.

Исходный текст программы представлен в листинге 5.8.
Листинг 5.8. Программа, выводящая в клиентскую область окна три строки с
разными размерами шрифта
. SSTRJ..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", О
myStr label BYTE
si DB "СТРОКА 1", 0
s2 DB "СТРОКА 2", 0
s3 DB "СТРОКА 3", 0
Is DD 0
stepy DD 5
stepx DD 40
myf DB "Arial Cyr", 0
myq EQU DEFAULT_QUALITY
myclip EQU CLIP_DEFAULT_PRECIS
myout EQU OUT_DEFAULT_PRECIS
myansi EQU ANSI_CHARSET
vHeight DD 0
. code
start:
push NULL
call GetModuleHandle
mov hlnstance, EAX
call GetCommandLine
mov CommandLine, EAX
mov vHeight, 12
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
push IDI_APPLICATION
NULL
Loadlcon
wc.hlcon, EAX
push
call
mov
push IDC_ARROW
push NULL
call LoadCursor
mov wc.hCursor, EAX
mov wc.hlconSm, 0
push EAX
call RegisterClassEx
push NULL
push hlnst
push NULL
push NULL
push CWJJSEDEFAULT
push CWJJSEDE FAULT
push CWJJSEDEFAULT
push CWJJSEDEFAULT
push WSJDVERLAPPEDWINDOW
push offset szDisplayName
push offset szClassName
push WS_EX_OVERLAPPEDWINDOW
call CreateWindowEx
mov hWnd, EAX
push SW_SHOWNORMAL
push hWnd
call ShowWindow
push hWnd
call UpdateWindow

Цикл обработки сообщений
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 :HDC
LOCAL ps
LOCAL rect
LOCAL myFont
PAINTSTRUCT
RECT
HFONT
LOCAL tm
LOCAL ty
LOCAL cnt
LOCAL x, у
cmp
jne
lea
push
push
call
mov
mov
shl
mov
mov
sub
xor
mov
div
mov
:TEXTMETRIC
:DWORD
:DWORD
:DWORD
uMsg, WM_PAINT
next_l
EDX, ps
EDX
hWin
BeginPaint
hdc, EAX
invoke GetClientRect, hWin, ADDR rect
invoke GetTextMetrics, hdc, ADDR tm
EAX, tm.tmHeight
EAX, 1
ty, EAX
EAX, rect.right
EAX, rect.left
EDX, EDX
ECX, 3
ECX
x, EAX
mov EAX, rect.bottom
sub EAX, rect.top
xor EDX, EDX
mov ECX, 5
div ECX
add EAX, stepy
mov y, EAX
push vHeight •
mov cnt, 1
lea ESI, myStr
next_raw:
invoke CreateFont, vHeight, 0, 0, 0, 600, 0, 0, 0, myansi, myout,\
myclip, myq, mypitch, ADDR myf
mov myFont, EAX
invoke SelectObject, hdc,myFont
push ESI
call LenStr
mov Is, EAX push Is
push ESI
push у
push x
push hdc
call TextOut
add vHeight, 3
mov EAX, x
add EAX, stepx
mov x, EAX
mov EAX, ty
add y, EAX
add ESI, Is
inc ESI
cmp cnt, 3
je cont
inc cnt
mp next_raw
cont:
lea EDX, ps
push EDX
push hWin
call EndPaint
pop vHeight
ret
next_l:
cmp uMsg, WM_LBUTTONDOWN
jne next_2
invoke GetciientRect, hWin, ADDR rect
add stepy, 5
invoke InvalidateRect, hWin, ADDR rect, TRUE
ret
next_2:
cmp uMsg, WM_RBUTTONDOWN
jne next_3
invoke GetClientRect, hWin, ADDR rect
sub stepy, 5
invoke InvalidateRect, hWin, ADDR rect, TRUE
ret
next_3:
4 push NULL
call PostQuitMessage
xor EAX, EAX
ret
next_4:
push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret
WndProc endp
LenStr proc
push EBP
mov EBP, ESP
mov EDX, [EBP+8]
mov EDI, EDX
eld
mov AL, 0
next_check:
scasb
je ex
jmp next_check
ex:
sub EDI, EDX
mov EAX, EDI
dec
pop
ret
ЕАХ
ЕВР
4
LenStr endp
end start


 
 
 

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