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

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


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





Необходимо заметить, что параметры шрифта во многом зависят от характеристик дисплея, поэтому лучше не задавать никаких фиксированных значений, а использовать функцию GetTextMetrics.

Второй способ точного позиционирования текста — использование функции GetTextExtentPoint32. Эта функция WIN API выполняет подсчет ширины и высоты строк в логических единицах. Функция имеет синтаксис:
BOOL GetTextExtentPoint32(HDC hdc, // дескриптор контекста
LPCTSTR IpString, // указатель на строку
int cbString, // количество символов
/ / в строке IpString
LPSIZE IpSize //указатель на структуру SIZE
) ;

Важное замечание: строка символов IpString не обязательно должна завершаться нулем, т. к. размер строки все равно определен в параметре cbString.
Параметр IpSize указывает на структуру типа S I Z E , определяющую ширину и высоту прямоугольника, ограничивающего строку. Структура может быть представлена так:
struct tagSIZE {
LONG сх;
LONG су;
} SIZE, *PSIZE;

Поля сх и су определяют, соответственно, ширину и высоту прямоугольника.
Исходный текст программы (назовем ее ТЕХТР) представлен в листинге 5.6.
Листинг 5.6. Вывод текста посередине окна приложения с помощью функции 6etTextExtentPoint32
. TEXTP.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
. data
szDisplayName DB
Point32", 0
CommandLine
hWnd
hlnstance
szClassName
textOut
lenText
tsize
crx
cry
DD
DD
DD
DB
DB
Позиционирование текста с помощью GetTextExtent-
DD
Demo_Class", 0
Текст отображается функцией TextOut"
EQU $-textOut
label DWORD
DD 0
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,
CmdLine :DWORD,
CmdShow :DWORD
; Локальные переменные процедуры
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG

; Заполнение структуры WNDCLASSEX требуемыми параметрами
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
~>v wc. lpfnWndProc, offset WndProc
wc.cbClsExtra, NULL
wc.cbWndExtra, NULL
push hlnst
pop wc.hlnstance mov wc.hbrBackground, C0L0RJ3TNFACE+1
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
invoke Loadlcon, NULL, IDI_APPLJCATION
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, CWJJSEDEFAULT,\
CWJJSEDEFAULT, NULL, NULL, hlnst, NULL
mov hWnd, EAX
invoke ShowWindow, hWnd, SW_SHOWNORMAL
invoke Updatewindow, hWnd
;Цикл обработки сообщений
StartLoop:
invoke GetMessage, ADDR msg, NULL, 0,
cmp ЕАХ, О
je ExitLoop
invoke TranslateMessage,•ADDR msg
invoke DispatchMessage, ADDR msg
imp StartLoop
ExitLoop:
mov
ret
WinMain endp
EAX, msg.wParam
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hdc
LOCAL rect
LOCAL tm
LOCAL x, у
HDC
RECT
TEXTMETRIC
DWORD
cmp uMsg, WM_LBUTTONDOWN
jne next_l
invoke GetDC, hWnd
mov hdc, EAX
invoke GetClientRect, hWnd, ADDR rect 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 y, EAX
invoke TextOut, hdc, x, y, ADDR textOut, lenText
invoke ReleaseDC, hWnd, hdc
ret
next_l:
cmp uMsg, WM_DESTROY
jne next_2
invoke PostQuitMessage, NULL
xor EAX, EAX
ret
next_2:
invoke DefWindowProc,hWin, uMsg, wParam, lParam
ret
WndProc endp end start

Проанализируем исходный текст программы. Чтобы воспользоваться функцией
GetTextExtentPoint32, В секции .data определим аналог структуры
SIZE: .
.data
tsize label DWORD
crx DD 0
cry DD 0
Переменные crx и cry хранят размеры прямоугольника текста (ширину и высоту).


 
 
 

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