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





Чтобы получить значения переменных, в исходном тексте программы, точнее,
в обработчике нажатия левой кнопки мыши WM_LBUTTONDOWN, ДОЛЖНЫ
присутствовать следующие строки:
invoke GetTextExtentPoint32, hdc, ADDR textOut, lenText, ADDR tsize
mov EAX, rect.right
sub EAX, rect.left
sub EAX, crx
shr EAX, 1 mov x, EAX
mov EAX, rect.bottom
sub EAX, rect.top
270 Гпава 5
sub ЕАХ, cry
shr ЕАХ, 1
mov у, ЕАХ
invoke TextOut, hdc, x, у, ADDR textOut, lenText

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

В Windows есть функция createFont для инициализации логических шрифтов с заданными характеристиками. Логический шрифт заменяет шрифт по умолчанию для любого устройства. Сама функция имеет синтаксис: HFONT CreateFont(int
int
int
nHeight,
nWidth,
nEscapement,
// высота шрифта
// средняя ширина шрифта
int nOrientation,
int fnWeight,
DWORD fdwltalic,
DWORD fdwUnderline,
DWORD fdwStrikeOut,
DWORD fdwCharSet,
DWORD fdwOutputPrecision,
DWORD fdwClipPrecision,
DWORD fdwQuality,
DWORD fdwPitchandFamily,
LPCTSTR IpszFace); // адрес строки с названием шрифта
В определении функции дана расшифровка тех параметров, которые наиболее
существенны и используются программистами наиболее часто.
Разработаем приложение, в котором при каждом нажатии на правую кнопку
В нашей оконной процедуре WndProc будут присутствовать обработчики сообщений
WM_PAINT, WM_LBUTTONDOWN И WM_RBUTTONDOWN. ИСХОДНЫЙ ТеКСТ Программы (назовем ее SELFONT) приведен в листинге 5.7.
Листинг 5.7. Программа SELFONT, демонстрирующая установку аттрибутов шрифта
. SELFONT.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
// "жирность" шрифта
// кодировка символов
// (ANSI или UNICODE)
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
data

szDisplayName DB "ВЫБОР ШРИФТОВ С ПОМОЩЬЮ SelectFont", О
CommandLine DD О
hWnd DD 0
hlnstance DD 0
szClassName DB "Demo_Class", 0
textOut DB Текст отображается функцией TextOut
lenText EQU $-textOut
tsize label DWORD
crx DD 0
cry DD 0
myf DB Arial Cyr 0
mypitch EQU DEFAULT_PITCH or FF_SWISS
myq EQU DE FAULT_QUALITY
myclip EQU CLIP_DEFAULT_PRECIS
myout EQU OUT_DEFAULT_PRECIS
myansi EQU ANSI_CHARSET
vHeight DD 0
. code
start:
invoke GetModuleHandle, NULL
mov hlnstance, EAX
invoke GetCommandLine
mov CommandLine, EAX
mov vHeight, 14
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+2
mov wc.IpszMenuName, 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,\
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\
CWJJSEDEFAULT, NULL, NULL, hlnst, NULL
mov hWnd, EAX
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
; Цикл обработки сообщений
StartLoop:
invoke GetMessage, ADDR msg, NULL, 0, 0
cmp EAX, 0
274 Гпава 5
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
WinMain endp
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
1Param :DWORD
; Локальные переменные
LOCAL hdc
LOCAL ps
LOCAL rect
HDC
PAINTSTRUCT
RECT
LOCAL myFont :HF0NT
LOCAL tx, ty :DWORD
LOCAL x, у :DWORD
cmp uMsg, WM_LBUTT0ND0WN
jne next_l
invoke GetciientRect, hWin, ADDR rect
cmp vHeight, 14
down
vHeight, 25
wtext 1
jge
mov
jmp
down:
dec
wtext_l:
invoke
ret
vHeight
InvalidateRect, hWin, ADDR rect, TRUE
uMsg, WM_RBUTTONDOWN
next_2
GetciientRect, hWin, ADDR rect
vHeight, 25
minHeight
vHeight
wtext 2
next_l:
cmp
jne
invoke
cmp
jge
inc
jmp
minHeight:
mov vHeight, 14
wtext_2:
ret
next_2:
cmp uMsg, WM_PAINT
jne next_3
lea EDX, ps
push EDX
push hWin
call BeginPaint
mov hdc, EAX
invoke GetciientRect, hWin, ADDR rect
mov myFont, EAX
invoke SelectObject, hdc,myFont
push myFont
push hdc
call SelectObject
invoke GetTextExtentPoint32, hdc, ADDR textOut, lenText, ADDR tsize
mov EAX, 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 у, ЕАХ
invoke TextOut, hdc, х, у, ADDR textOut, lenText
lea EDX, ps
push
push
EDX
hWin
call EndPaint ret
next 3:
cmp uMsg, WM_DESTROY
next 4
invoke PostQuitMessage, NULL
xor EAX, EAX
ret
next 4:
invoke DefWindowProc, hWin, uMsg, wParam, lParam
ret
WndProc endp
end start


 
 
 

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