структура GCP_RESULTSA (wingdi.h)
Структура GCP_RESULTS содержит сведения о символах в строке. Эта структура получает результаты функции GetCharacterPlacement. Для некоторых языков первый элемент в массивах может содержать дополнительные сведения, зависящие от языка.
Синтаксис
typedef struct tagGCP_RESULTSA {
DWORD lStructSize;
LPSTR lpOutString;
UINT *lpOrder;
int *lpDx;
int *lpCaretPos;
LPSTR lpClass;
LPWSTR lpGlyphs;
UINT nGlyphs;
int nMaxFit;
} GCP_RESULTSA, *LPGCP_RESULTSA;
Члены
lStructSize
Размер структуры в байтах.
lpOutString
Указатель на буфер, который получает выходную строку или NULL, если выходная строка не нужна. Выходная строка — это версия исходной строки, которая будет отображаться на указанном устройстве. Как правило, выходная строка идентична исходной строке, но может отличаться, если строка нуждается в переупорядочении, а флаг GCP_REORDER задан или если исходная строка превышает максимальную степень, а флаг GCP_MAXEXTENT задан.
lpOrder
Указатель на массив, который получает индексы упорядочивания или NULL, если индексы упорядочивания не нужны. Однако его значение зависит от других элементов GCP_RESULTS. Если должны быть возвращены индексы глифов, индексы предназначены для массива lpGlyphs; Если индексы глифов не возвращаются и запрашиваются lpOrder, индексы предназначены для lpOutString. Например, в последнем случае значение lpOrder[i] — это позиция lpString[i] в выходной строке lpOutString.
Обычно это используется, если GetFontLanguageInfo возвращает флаг GCP_REORDER, указывающий на необходимость переупорядочения исходной строки. Например, на иврите, в котором текст выполняется справа налево, массив lpOrder предоставляет точные расположения каждого элемента в исходной строке.
lpDx
Указатель на массив, который получает расстояние между смежными ячейками символов или значение NULL, если эти расстояния не нужны. Если выполняется отрисовка глифов, расстояние для глифов не символов, поэтому результирующий массив можно использовать с функцией ExtTextOut.
Расстояния в этом массиве находятся в порядке отображения. Чтобы найти расстояние для символа в исходной строке, используйте массив lpOrder следующим образом:
width = lpDx[lpOrder[i]];
lpCaretPos
Указатель на массив, который получает значения позиции в виде курсора или значение NULL, если не требуются позиции курсора. Каждое значение указывает позицию курсора непосредственно перед соответствующим символом. На некоторых языках положение курсора для каждого символа может быть не сразу слева от символа. Например, на иврите, в котором текст выполняется справа налево, курсор находится справа от символа. Если выполняется упорядочение глифов, lpCaretPos соответствует исходной строке, а не выходной строке. Это означает, что некоторые смежные значения могут совпадать.
Значения в этом массиве находятся в порядке ввода. Чтобы найти значение позиции курсора для iсимвол в исходной строке, используйте массив следующим образом:
position = lpCaretPos[i];
lpClass
Указатель на массив, содержащий и/или получающий классификации символов. Значения указывают, как выложить символы в строке и аналогичны (но не идентичны) значениям CT_CTYPE2, возвращаемым функцией GetStringTypeEx
Кроме того, при предоставлении значений в массиве lpClass с флагом GCP_CLASSIN можно использовать следующее.
Для языков, использующих флаг GCP_REORDER, можно также использовать следующие значения с флагом GCP_CLASSIN. В отличие от предыдущих значений, которые можно использовать в любом месте массива lpClass, все следующие значения используются только в первом расположении в массиве. Все объединяются с другими классификациями.
Обратите внимание, что GCPCLASS_PREBOUNDLTR и GCPCLASS_PREBOUNDRTL являются взаимоисключающими, как GCPCLASSPOSTBOUNDLTR и GCPCLASSPOSTBOUNDRTL.
Чтобы принудительно выполнить макет символа определенным образом, предустановите классификацию соответствующего элемента массива; Функция оставляет такие предустановленные классификации без изменений и вычисляет классификации только для элементов массива, которые были заданы равным нулю. Предустановленные классификации используются только в том случае, если установлен флаг GCP_CLASSIN и предоставляется массив lpClass.
Если GetFontLanguageInfo не возвращает GCP_REORDER для текущего шрифта, значение GCPCLASS_LATIN имеет смысл.
lpGlyphs
Указатель на массив, получающий значения, определяющие глифы, используемые для отрисовки строки или null, если отрисовка глифа не требуется. Число глифов в массиве может быть меньше числа символов в исходной строке, если строка содержит лигированные глифы. Кроме того, если требуется переупорядочение, порядок глифов может не быть последовательным.
Этот массив полезен, если выполняется несколько операций в строке с любой формой лигирования, кернинга или переключения порядка. Использование значений в этом массиве для последующих операций экономит время, необходимое для создания индексов глифов каждый раз.
Этот массив всегда содержит индексы глифов, а значение ETO_GLYPH_INDEX всегда должно использоваться при использовании этого массива с функцией ExtTextOut.
При использовании GCP_LIGATE можно ограничить количество символов, которые будут объединены. (Например, на арабском языке распространенным являются три символьные лигаций. Это делается путем установки максимального необходимого значения в lpGcpResults->lpGlyphs[0]. Если максимальное значение не требуется, это поле должно быть равно нулю.
Для языков, таких как арабский, где GetFontLanguageInfo возвращает флаг GCP_GLYPHSHAPE, глифы для символа будут отличаться в зависимости от того, находится ли символ в начале, середине или конце слова. Как правило, первый символ в входной строке также будет первым символом в слове, а последний символ в входной строке будет рассматриваться как последний символ в слове. Однако если отображаемая строка является подмножеством полной строки, например при отображении раздела прокручиваемого текста, это может быть не так. В таких случаях желательно принудительно создать первые или последние символы как не начальные или окончательные формы. Для этого, опять же, первое расположение в массиве lpGlyphs используется путем выполнения операции OR значения лигаций выше со значениями GCPGLYPH_LINKBEFORE и /или GCPGLYPH_LINKAFTER. Например, значение GCPGLYPH_LINKBEFORE | 2 означает, что двухзначные лигатуры являются максимальными обязательными, и первый символ в строке должен рассматриваться как если бы он находится в середине слова.
nGlyphs
Для входных данных этот элемент должен иметь размер массивов, на которые указывают члены указателя массива. В выходных данных это значение равно количеству глифов, заполненных в выходных массивах. Если подстановка глифа не требуется (то есть каждый входной символ сопоставляется ровно с одним глифом), этот элемент совпадает с входным значением.
nMaxFit
Число символов, которые соответствуют экстентам, указанным параметром
Замечания
Независимо от того, lpGlyphs, lpOutStringили не требуется, зависит от результатов вызова GetFontLanguageInfo.
В случае шрифта для такого языка, как английский, в котором ни один из GCP_DBCS, GCP_REORDER, GCP_GLYPHSHAPE, GCP_LIGATE, GCP_DIACRITIC или GCP_KASHIDA флаги возвращаются, ни один из массивов не требуется для правильной работы. (Хотя и не требуется, они по-прежнему могут использоваться. Если используется массив lpOutString, он будет точно таким же, как и lpInputString передан в GetCharacterPlacement.) Обратите внимание, что если используется GCP_MAXEXTENT, то lpOutString будет содержать усеченную строку, если она используется, а не точную копию исходного.
В случае шрифтов для таких языков, как иврит, которые имеют переупорядочение, но обычно не имеют дополнительных глифов, lpOutString следует использовать. Это даст строку в порядке для чтения с экрана. Однако lpGlyphs массив обычно не нужен. (Иврит может иметь дополнительные глифы, если шрифт является шрифтом TrueType/Open.)
В случае языков, таких как тайский или арабский, в которых GetFontLanguageInfo возвращает флаг GCP_GLYPHSHAPE, lpOutString даст отображаемый порядок строки, передаваемой GetCharacterPlacement, но значения по-прежнему будут неуправляемыми символами. Для правильного отображения необходимо использовать lpGlyphs массив.
Заметка
Заголовок wingdi.h определяет GCP_RESULTS как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 2000 Профессиональный [только классические приложения] |
минимальный поддерживаемый сервер | Windows 2000 Server [только классические приложения] |
заголовка | wingdi.h (включая Windows.h) |
См. также
шрифтов и текста