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





Вывод текста в клиентскую область окна выполняется в обработчике WM_PAINT с помощью функции TextOut. Строки выводимого текста находятся
по вертикали на расстоянии, определяемом переменной ty, которая вычисляется
как удвоенная высота шрифта, полученного при помощи функции
GetTextMetrics:
invoke GetTextMetrics, hdc, ADDR tm
mov EAX, tm.tmHeight
shl EAX, 1
mov ty, EAX

Для каждой из строк вычисляется свой размер шрифта (переменная vHeight). Для каждой следующей строки высота увеличивается на 3. В обработчике
WMPAINT установка шрифта выполняется следующим фрагментом кода:
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

Кроме высоты шрифта, для каждой строки определяется смещение по горизонтали
(координата х) и по вертикали (координата у). Это осуществляется
двумя фрагментами кода в обработчике W M P A I N T :
add vHeight, 3
mov ЕАХ, x
add EAX, stepx
mov x, EAX
mov EAX, ty
add y, EAX

При выводе каждой последующей строки к координате х добавляется смещение,
заданное в переменной stepx. Координата у также меняется:
add ЕАХ, stepy
mov у, ЕАХ

В обработчиках нажатия кнопок мыши выполняется приращение переменных
stepx и stepy, причем приращение stepy в обработчике
WMLBUTTONDOWN имеет положительный знак (строки текста сдвигаются
вниз), а в обработчике WMRBUTTONDOWN — отрицательный (строки текста
сдвигаются вверх). Визуально это отображается синхронным перемещением
всех трех строк по вертикали.
Для вывода строки текста на экран необходимо знать ее размер. Он вычисляется
при помощи процедуры LenStr, принимающей в качестве единственного
параметра адрес строки с завершающим нулем. Исходный текст
процедуры понятен, поэтому останавливаться на его анализе я не буду.
До сих пор мы рассматривали геометрические параметры шрифтов. Для
многих программ этого, однако, недостаточно. Помимо таких атрибутов как
высота шрифта, его тип, толщина, хотелось бы устанавливать и его цветовые
параметры. В операционной системе Windows имеется несколько функ-
Программирование на ассемблере в Windows: от простого к сложному 289
ций для установки цветовых атрибутов шрифта. Мы воспользуемся одной
из таких функций — SetTextcoior. При помощи этой функции можно установить
цвет шрифта, определенного в контексте устройства рисования.

Функция имеет синтаксис:
Первый параметр функции — дескриптор контекста устройства, а о втором
параметре следует рассказать более подробно. Переменная COLORREF может
быть представлена в 16-ричном формате как OxOObbggrr, где младший байт
содержит величину, характеризующую относительную интенсивность красного
цвета, второй байт определяет относительную интенсивность зеленого,
а старший байт характеризует интенсивность синего цвета. Самый старший
байт должен равняться 0. Максимальная величина для одного байта равна
OxFF.

Модифицируем только что рассмотренный пример для вывода строк текста
на экран разными шрифтами. Будем по-прежнему отображать те же три
строки текста, но разными цветами. Цвет шрифта будет меняться при нажатии
правой кнопки мыши в окне приложения, а также при изменении размеров
окна.

Кроме демонстрации работы с текстом и шрифтами, в этом примере мы
увидим дополнительные аспекты программирования Windows-приложений.
Исходный текст программы (назовем ее SCOL) представлен в листинге 5.9.
Листинг 5.9. Программа SCOL, изменяющая цвет шрифта текста
в окне приложения
.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
COLORREF SetTextColor(HHDDCC hdc,
COLORREF crColor);
// дескриптор контекста
// цвет текста
SCOL.ASM
; WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
szDisplayName DB "ВЫВОД СТРОК ТЕКСТА
CommandLine DD 0
hWnd DD 0
hlnstance DD 0
szClassName DB "Demo_Class", 0
myStr label BYTE
si DB " STRING 1", 0
s2 DB " STRING 2", 0
s3 DB STRING 3", 0
Is DD 0
; Атрибуты шрифта
myf DB "Arial Cyr", 0
mypitch EQU DEFAULT_PITCH or FF_
myq EQU DEFAULT_QUALITY
myclip EQU CLIP_DEFAULT_PRECIS
myout EQU OUT_DEFAULT_PRECIS
myans i EQU ANSI_CHARSET
vHeight DD 0 ; переменная, хранящая высоту шрифта
colorRef DD 0FlAA7Ch ; начальное значение цвета шрифта
. code
start:
push
call
mov
call
mov
NULL
GetModuleHandle
hlnstance, EAX
GetCommandLine
CommandLine, EAX


 
 
 

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