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


структура 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 .

Расстояния в этом массиве находятся в порядке отображения. Чтобы найти расстояние для i-го символа в исходной строке, используйте массив 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, чтобы привязать строку к порядку чтения справа налево после строки.
 

Чтобы принудительно выполнить макет символа определенным образом, предустановите классификацию для соответствующего элемента массива; функция оставляет такие предустановленные классификации без изменений и вычисляет классификации только для элементов массива, для которых задано значение 0. Предустановленные классификации используются только в том случае, если установлен флаг GCP_CLASSIN и предоставлен массив lpClass .

Если GetFontLanguageInfo не возвращает GCP_REORDER для текущего шрифта, имеет смысл только GCPCLASS_LATIN значение.

lpGlyphs

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

Этот массив полезен, если с строкой выполняется несколько операций, имеющих любую форму лигагирования, кернинга или переключения порядка. Использование значений в этом массиве для последующих операций экономит время, необходимое для создания индексов глифов каждый раз.

Этот массив всегда содержит индексы глифов, и значение ETO_GLYPH_INDEX всегда должно использоваться при использовании этого массива с функцией ExtTextOut .

При использовании GCP_LIGATE можно ограничить количество символов, которые будут связаны друг с другом. (В арабском языке, например, обычно используются трехзначные лигатуры.) Для этого необходимо задать максимальное необходимое значение в lpGcpResults-lpGlyphs>[0]. Если максимальное значение не требуется, установите для этого поля значение 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 или Юникод этой функции на основе определения константы препроцессора UNICODE. Сочетание использования псевдонима, не зависящий от кодировки, с кодом, не зависящим от кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Верхняя часть wingdi.h (включая Windows.h)

См. также раздел

ExtTextOut

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

Общие сведения о шрифтах и тексте

GetCharacterPlacement

GetFontLanguageInfo