Поделиться через


структура GCP_RESULTSW (wingdi.h)

Структура GCP_RESULTS содержит сведения о символах в строке. Эта структура получает результаты функции GetCharacterPlacement. Для некоторых языков первый элемент в массивах может содержать дополнительные сведения, зависящие от языка.

Синтаксис

typedef struct tagGCP_RESULTSW {
  DWORD  lStructSize;
  LPWSTR lpOutString;
  UINT   *lpOrder;
  int    *lpDx;
  int    *lpCaretPos;
  LPSTR  lpClass;
  LPWSTR lpGlyphs;
  UINT   nGlyphs;
  int    nMaxFit;
} GCP_RESULTSW, *LPGCP_RESULTSW;

Члены

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 . Каждый элемент массива может быть равен нулю или одному из следующих значений.

Ценность Значение
GCPCLASS_ARABIC
Арабский символ.
GCPCLASS_HEBREW
Ивритский символ.
GCPCLASS_LATIN
Символ из латинской или другой однобайтовой кодировки для языка слева направо.
GCPCLASS_LATINNUMBER
Цифры из латинской или другой однобайтовой кодировки для языка слева направо.
GCPCLASS_LOCALNUMBER
Цифра из набора символов, связанного с текущим шрифтом.
 

Кроме того, при предоставлении значений в массиве lpClass с флагом GCP_CLASSIN можно использовать следующее.

Ценность Значение
GCPCLASS_LATINNUMERICSEPARATOR
Только входные данные. Символ, используемый для разделения латинских цифр, таких как запятая или десятичная точка.
GCPCLASS_LATINNUMERICTERMINATOR
Только входные данные. Символ, используемый для завершения латинских цифр, таких как знак плюса или минуса.
GCPCLASS_NEUTRAL
Только входные данные. Символ не имеет определенной классификации.
GCPCLASS_NUMERICSEPARATOR
Только входные данные. Символ, используемый для разделения цифр, таких как запятая или десятичная точка.
 

Для языков, использующих флаг GCP_REORDER, можно также использовать следующие значения с флагом GCP_CLASSIN. В отличие от предыдущих значений, которые можно использовать в любом месте массива lpClass, все следующие значения используются только в первом расположении в массиве. Все объединяются с другими классификациями.

Обратите внимание, что GCPCLASS_PREBOUNDLTR и GCPCLASS_PREBOUNDRTL являются взаимоисключающими, как GCPCLASSPOSTBOUNDLTR и GCPCLASSPOSTBOUNDRTL.

Ценность Значение
GCPCLASS_PREBOUNDLTR
Задайте для lpClass[0] значение GCPCLASS_PREBOUNDLTR, чтобы привязать строку к левому к правому порядку чтения перед строкой.
GCPCLASS_PREBOUNDRTL
Задайте lpClass[0], чтобы GCPCLASS_PREBOUNDRTL привязать строку к левому порядку чтения перед строкой.
GCPCLASS_POSTBOUNDLTR
Задайте lpClass[0], чтобы GCPCLASS_POSTBOUNDLTR привязать строку к левому к правому порядку чтения после строки.
GCPCLASS_POSTBOUNDRTL
Задайте для lpClass[0] значение GCPCLASS_POSTBOUNDRTL, чтобы привязать строку к левому порядку чтения после строки.
 

Чтобы принудительно выполнить макет символа определенным образом, предустановите классификацию соответствующего элемента массива; Функция оставляет такие предустановленные классификации без изменений и вычисляет классификации только для элементов массива, которые были заданы равным нулю. Предустановленные классификации используются только в том случае, если установлен флаг 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

Число символов, которые соответствуют экстентам, указанным параметром nMaxExtent функции GetCharacterPlacement. Если задано значение GCP_MAXEXTENT или GCP_JUSTIFY, это значение может быть меньше числа символов в исходной строке. Этот элемент задается независимо от того, задано ли значение GCP_MAXEXTENT или GCP_JUSTIFY. В отличие от nGlyphs, который указывает количество выходных глифов, nMaxFit ссылается на количество символов из входной строки. Для языков латиниции SBCS это будет одинаково.

Замечания

Независимо от того, 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)

См. также

ExtTextOut

структуры шрифта и текста

шрифтов и текста

GetCharacterPlacement

GetFontLanguageInfo