Ассемблер для Windows

       

Рассмотрим теперь вопрос о том как выводить текстовую информацию



II

Рассмотрим теперь вопрос о том, как выводить текстовую информацию с различными типами шрифтов. Удобнее всего задать параметры шрифта при помощи функции CreateFontIndirect, параметром которой является указатель на структуру LOGFONT. Хотя название функции и начинается со слова Create, речь идет не о создании, а скорее изменении существующего шрифта согласно заданным параметрам. Существует и другая функция CreateFont, которая, на мой взгляд, менее удобна при использовании на ассемблере — поработайте с ней сами, если хотите. Выбор нужного шрифта осуществляется функцией SelectObject. Начнем с того, что разберем поля этой структуры.

LOGFONT STRUC LfHeight DWORD ? LfWidth DWORD ? LfEscapement DWORD ? LfOrientation DWORD ? LfWeight DWORD ? Lfitalic DB ? LfUnderline DB ? LfStrikeOut DB ? LfCharSet DB ? LfOutPrecision DB ? LfClipPrecision DB ? LfQuality DB ? LfPitchAndFamily DB ? LfFaceName DB 32 DUP(0) LOGFONT ENDS

LfHeight - определяет высоту шрифта в логических единицах; если 0, то высота берется по умолчанию.

LfWidth - определяет ширину шрифта в логических единицах; если 0, то ширина по умолчанию.

LfEscapement - угол наклона текста в десятых долях градуса по отношению к горизонтальной оси в направлении против часовой стрелки.
LfOrientation - тоже, что и предыдущий параметр, но по отношению к отдельному символу (игнорируется в Windows 9х).

LfWeight - задает жирность шрифта (0-900).

Lfitalic - если 1, то курсив.

LfUnderline — если 1, то символы подчеркнуты.

LfStrikeOut — если 1, то символы перечеркнуты.

LfCharSet - задает множество символов шрифта, обычно определяется константой ANSI_CHARSET (=0).

LfOutPrecision - флаг точности шрифта; определяет, насколько точно созданный шрифт отвечает заданным параметрам. Возможные значения:

OUT_DEFAULT_PRECIS = 0 OUT_STRING_PRECIS = 1 OUT_CHARACTER_PRECIS = 2 OUT_STROKE_PRECIS = 3 OUT_TT_PRECIS = 4 OUT_DEVICE__PRECIS = 5 OUT_RASTER_PRECIS = 6 OUT_TT_ONLY_PRECIS = 7 OUT_OUTLINE_PRECIS = 8 OUT_SCREEN_OUTLINE_PRECIS = 9




LfClipPrecision - флаг точности прилегания шрифта; определяет, как будут отсекаться части шрифта, не попадающие в видимую область. Возможные значения:

CLIP_DEFAULT_PRECIS = 0 CLIP_CHARACTER_PRECIS = 1 CLIP_STROKE_PRECIS = 2 CLIP_MASK = 0FH CLIP_LH_ANGLES = (1 SHL 4) CLIP_TT_ALWAYS = (2 SHL 4) CLIP_EMBEDDED = (8 SHL 4)

LfQuality - флаг качества шрифта; определяет соответствие логического шрифта и шрифта, допустимого данным устройством. Возможные значения:

DEFAULT_QUALITY = 0 DRAFT_QUALITY = 1 PROOF_QUALITY = 2

LfPitchAndFamily - определяет тип и семейство шрифта. Возможные значения определяются комбинацией (ИЛИ) двух групп констант:

DEFAULT_PITCH = 0 FIXED_PITCH = 1 VARIABLE_PITCH = 2

и

FF_DONTCARE = 0 FF_ROMAN = (1 SHL 4) FF_SWISS = (2 SHL 4) FF_MODERN = (3 SHL 4) FF_SCRIPT = (4 SHL 4) FF_DECORATIVE = (5 SHL 4)

LfFaceName - содержит название шрифта. Длина имени не может превосходить 32 символа.

Обратимся к примеру задания своего шрифта (результат работы программы - на Рисунок 2.1.5). Однако поскольку большая часть программы будет совпадать с аналогичной частью предыдущих программ, я приведу здесь только необходимые фрагменты. Рассмотрим сначала фрагмент, выполняющийся при получении сообщения WM_PAINT (Рисунок 2.1.3).

WMPAINT: ;------- определить контекст PUSH OFFSET PNT PUSH DWORD PTR [EBP+08H] CALL BeginPaint@8 MOV CONT,EAX ; сохранить контекст (дескриптор) ;------- цвет фона = цвет окна PUSH RGBW PUSH EAX CALL SetBkColor@8 ;------- цвет текста (красный) PUSH RGBT PUSH CONT CALL SetTextColor@8 ;------ здесь определение координат MOV XT, 120 MOV YT, 140 ;------ задать (создать) шрифт MOV lg.LfHeight,12 ; высота фонта MOV lg.LfWidth, 9 ; ширина фонта MOV lg.LfEscapement,900 ; ориентация MOV lg.LfOrientation, 0 ; вертикальная MOV lg.LfWeight,400 ; толщина линий шрифта MOV lg.LfItalic, 0 ; курсив MOV lg.LfUnderline, 0 ; подчеркивание MOV lg.LfStrikeOut, 0 ; перечеркивание MOV lg.LfCharSet, 0 ; набор шрифтов MOV lg.LfOutPrecision, 0 MOV lg.LfClipPrecision, 0 MOV lg.LfQuality,2 MOV lg.LfPitchAndFamily,0 PUSH OFFSET lg ; задать название шрифта PUSH OFFSET NFONT PUSH OFFSET lg.LfFaceName CALL COPYSTR CALL CreateFontIndirectA@4 ;------ выбрать созданный объект PUSH EAX PUSH CONT CALL SelectObject@8 PUSH EAX ;------ вычислить длину текста в пикселях текста PUSH OFFSET TEXT CALL LENSTR ;---------- вывести текст ---------------- PUSH EBX PUSH OFFSET TEXT PUSH YT PUSH XT PUSH CONT CALL TextOutA@20 ; удалить объект "FONT" ; идентификатор уже в стеке CALL DeleteObject@4 ;---------------- закрыть контекст PUSH OFFSET PNT PUSH DWORD PTR [EBP+08H] CALL EndPaint@8 MOV EAX, 0 JMP FINISH


Содержание раздела