На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Drawing Text From Different Fonts on the Same Line



Different type styles within a font family can have different widths. For example, bold and italic styles of a family are always wider than the roman style for a given point size. When you display or print several type styles on a single line, you must keep track of the width of the line to avoid having characters displayed or printed on top of one another.

You can use two functions to retrieve the width (or extent) of text in the current font. The GetTabbedTextExtent function computes the width and height of a character string. If the string contains one or more tab characters, the width of the string is based upon a specified array of tab-stop positions. The GetTextExtentPoint32 function computes the width and height of a line of text.
When necessary, Windows synthesizes a font by changing the character bitmaps. To synthesize a character in a bold font, Windows draws the character twice: once at the starting point, and again one pixel to the right of the starting point. To synthesize a character in an italic font, Windows draws two rows of pixels at the bottom of the character cell, moves the starting point one pixel to the right, draws the next two rows, and continues until the character has been drawn. By shifting pixels, each character appears to be sheared to the right. The amount of shear is a function of the height of the character.

One way to write a line of text that contains multiple fonts is to use the GetTextExtentPoint32 function after each call to TextOut and add the length to a current position. The following example writes the line "This is a sample string." using bold characters for "This is a", switches to italic characters for "sample", then returns to bold characters for "string." After printing all the strings, it restores the system default characters.

int XIncrement;
int YStart;
TEXTMETRIC tm;
HFONT hfntDefault, hfntItalic, hfntBold;
SIZE sz;
LPSTR lpszString1 = "This is a ";
LPSTR lpszString2 = "sample ";
LPSTR lpszString3 = "string.";

/* Create a bold and an italic logical font. */

hfntItalic = MyCreateFont();
hfntBold = MyCreateFont();


/* Select the bold font and draw the first string */
/* beginning at the specified point (XIncrement, YStart). */

XIncrement = 10;
YStart = 50;

hfntDefault = SelectObject(hdc, hfntBold);
TextOut(hdc, XIncrement, YStart, lpszString1,
lstrlen(lpszString1));

/*
* Compute the length of the first string and add
* this value to the x-increment that is used for the
* text-output operation.
*/

GetTextExtentPoint32(hdc, lpszString1,
lstrlen(lpszString1), &sz);
XIncrement += sz.cx;

/*
* Retrieve the overhang value from the TEXTMETRIC
* structure and subtract it from the x-increment.

* (This is only necessary for non-TrueType raster
* fonts.)
*/

GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;

/*
* Select an italic font and draw the second string
* beginning at the point (XIncrement, YStart).
*/

hfntBold = SelectObject(hdc, hfntItalic);
GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;
TextOut(hdc, XIncrement, YStart, lpszString2,
lstrlen(lpszString2));

/*
* Compute the length of the second string and add

* this value to the x-increment that is used for the
* text-output operation.
*/

GetTextExtentPoint32(hdc, lpszString2, lstrlen(lpszString2), &sz);
XIncrement += sz.cx;

/*
* Reselect the bold font and draw the third string
* beginning at the point (XIncrement, YStart).
*/

SelectObject(hdc, hfntBold);
TextOut(hdc, XIncrement - tm.tmOverhang, YStart, lpszString3,
lstrlen(lpszString3));

/* Reselect the original font. */


SelectObject(hdc, hfntDefault);

/* Delete the bold and italic fonts. */

DeleteObject(hfntItalic);
DeleteObject(hfntBold);


In this example, the GetTextExtentPoint32 function initializes the members of a SIZE structure with the length and height of the specified string. The GetTextMetrics function retrieves the overhang for the current font. Because the overhang is zero if the font is a TrueType font, the overhang value does not change the string placement. For raster fonts, however, it is important to use the overhang value.
The overhang is subtracted from the bold string once, to bring subsequent characters closer to the end of the string if the font is a raster font. Because overhang affects both the beginning and end of the italic string in a raster font, the glyphs start at the right of the specified location and end at the left of the endpoint of the last character cell. (The GetTextExtentPoint32 function retrieves the extent of the character cells, not the extent of the glyphs.) To account for the overhang in the raster italic string, the example subtracts the overhang before placing the string and subtracts it again before placing subsequent characters.

The SetTextJustification function adds extra space to the break characters in a line of text. You can use the GetTextExtentPoint function to determine the extent of a string, then subtract that extent from the total amount of space the line should occupy, and use the SetTextJustification function to distribute the extra space among the break characters in the string. The SetTextCharacterExtra function adds extra space to every character cell in the selected font, including the break character. (You can use the GetTextCharacterExtra function to determine the current amount of extra space being added to the character cells; the default setting is zero.)

You can place characters with greater precision by using the GetCharWidth32 or GetCharABCWidths function to retrieve the widths of individual characters in a font. The GetCharABCWidths function is more accurate than the GetCharWidth32 function, but only when it is used with TrueType fonts; when you use GetCharABCWidths with non-TrueType fonts, it retrieves the same information as GetCharWidth32.
ABC spacing also allows an application to perform very accurate text alignment. For example, when the application right aligns a raster roman font without using ABC spacing, the advance width is calculated as the character width. This means the white space to the right of the glyph in the bitmap is aligned, not the glyph itself. By using ABC widths, applications have more flexibility in the placement and removal of white space when aligning text, because they have information that allows them to finely control intercharacter spacing.


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Чертеж Текста Из Других Шрифтов на той же Линии



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

Вы можете использовать две функции, чтобы извлекать ширину (или протяженность) текста в текущем шрифте. Функция GetTabbedTextExtent вычисляет ширину и высоту символьной строки. Если строка содержит один или более символов таб., ширина строки основана в определенном массиве таб.-стоповых позиций. Функция GetTextExtentPoint32 вычисляет ширину и высоту строки текста.
Когда необходимо, Окно синтезирует шрифт изменяя символьные побитовые отображения. Для того, чтобы синтезировать символ в смелый шрифт, Окно делает символом дважды: как только в отправном пункте, и снова один пиксель вправо от отправного пункта. Для того, чтобы синтезировать символ в шрифт курсива, Окно делает двумя колонки пикселей внизу символьной ячейки, перемещает отправному пункту один пиксель направо, делает следующими двумя колонки, и остается пока символ не сделан. Сдвигая пиксели, каждый символ оказывается стрижется направо. Сумма сдвига зависит от высоты символа.

Один путь писать строку текста, которая содержит многочисленные шрифты должно использовать GetTextExtentPoint32 функционирует после того, как каждый вызов на TextOut и добавит длину к текущей позиции. Следующий пример пишет линию "Эт - строка образца." смелые символы использования для "Этого -", ключи на символы курсива для "образца" затем возвращается в смелые символы для "строки." После печати всех строк, это восстанавливает системные встроенные символы.

int XIncrement;
int YStart;
tm TEXTMETRIC;
HFONT hfntDefault, hfntItalic, hfntBold;
РАЗМЕР sz;
LPSTR lpszString1 = "ЭТО - ";
LPSTR lpszString2 = "ОБРАЗЕЦ ";
LPSTR lpszString3 = "СТРОКА.";

/* Создайте жирный шрифт и логический font. курсива */

hfntItalic = MyCreateFont();
hfntBold = MyCreateFont();


/* Выберитесь смелый шрифт и делайте первой строкой */ /* начинаясь в определенной точке (XIncrement, YStart */

XIncrement = 10;
YStart = 50;

hfntDefault = SelectObject(hdc, hfntBold);
TextOut(hdc, XIncrement, YStart, lpszString1, lstrlen(lpszString1));

/*
* Вычислите длину первой строки и добавляйте
* эта величина на x-increment, которое использовано для the
* текстовое-выходное действие.
*/

GetTextExtentPoint32(hdc, lpszString1, lstrlen(lpszString1), &sz);
XIncrement += sz.cx;

/*
* Извлеките нависать над величиной из TEXTMETRIC
* структура и вычитает это из x-increment.

* ( Только необходимо для не-растра TrueType
* fonts.)
*/

GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;

/*
* Выберитесь шрифт курсива и делайте второй строкой
* начиная на данном этапе (XIncrement, YStart).
*/

hfntBold = SelectObject(hdc, hfntItalic);
GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;
TextOut(hdc, XIncrement, YStart, lpszString2, lstrlen(lpszString2));

/*
* Вычислите длину второй строки и добавляйте

* эта величина на x-increment, которое использовано для the
* текстовое-выходное действие.
*/

GetTextExtentPoint32(hdc, lpszString2, lstrlen(lpszString2), &sz);
XIncrement += sz.cx;

/*
* Reselect Смелый шрифт и делает третьей строкой
* начиная на данном этапе (XIncrement, YStart).
*/

SelectObject(hdc, hfntBold);
TextOut(hdc, XIncrement - tm.tmOverhang, YStart, lpszString3, lstrlen(lpszString3));

/* Reselect Подлинник font. */


SelectObject(hdc, hfntDefault);

/* Удалите смелые и шрифты курсива. */

DeleteObject(hfntItalic);
DeleteObject(hfntBold);


В этом примере, функция GetTextExtentPoint32 инициализирует участникам РАЗМЕРА структуры с длиной и высотой определенной строки. Функция GetTextMetrics извлекает нависать для текущего шрифта. Поскольку нависать над, - нуль если шрифт является шрифтом TrueType, нависать над величиной не изменяет размещение строки. Для растровых шрифтов, тем не менее, важно должно использовать нависать над величиной.
Нависать над, вычтен из смелой строки как только, чтобы приносить последующие символы ближе к концу строки если шрифт является растровым шрифтом. Поскольку нависать над влияет как на начало так и конец строки курсива в растровом шрифте, glyphs начало в праве определенной позиции и конца в left of конечная точка последней символьной ячейки. ( Функция GetTextExtentPoint32 извлекает протяженность символьных ячеек, не протяженность glyphs.) Чтобы принимать во внимание нависать в растровой строке курсива, пример вычитает нависать прежде, чем размещение строка и вычтет это снова перед последующими символами размещения.

Функция SetTextJustification добавляет дополнительное пространство к символам прерывания в строке текста. Вы можете использовать функцию GetTextExtentPoint, чтобы определять протяженность строки затем вычитать эту протяженность с общей суммы пространства линия должна занять, и использовать функцию SetTextJustification, чтобы распространять дополнительное пространство среди символов прерывания в строке. Функция SetTextCharacterExtra добавляет дополнительное пространство к каждой символьной ячейке в выбранном шрифте, включая символ прерывания. (Вы можете использовать функцию GetTextCharacterExtra, чтобы определять текущую сумму дополнительного пространства, добавлянного к символьным ячейкам; встроенная установка - zero.)

Вы можете установить символы с большей точностью используя GetCharWidth32 или функция GetCharABCWidths, чтобы извлекать ширину индивидуальных символов в шрифт. Функция GetCharABCWidths - точнее говоря чем функция GetCharWidth32, но только когда она использована шрифтами TrueType; когда Вы используете GetCharABCWidths с не-шрифтами TrueType, это извлекает ту же информацию как GetCharWidth32.
АЗБУКА, размещающая также позволяет приложение, чтобы выполнять очень точное текстовое выравнивание. Например, когда прикладное право выравнивает растровый римский шрифт не используя расстояние АЗБУКИ, авансовая ширина вычислена как символьная ширина. Это означает интервал вправо от glyph в побитовом отображении выровнен, не сам glyph. Используя ширину АЗБУКИ, приложения имеют более гибкость на размещении и удалении интервала при выравнивании текста, поскольку у них есть информация, которая позволяет им, чтобы тонко управлять расстоянием intercharacter.


Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz