Структура GCP_RESULTS


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

Синтаксис

typedef struct tagGCP_RESULTS {
  DWORD  lStructSize;
  LPTSTR  lpOutString;
  UINT  *lpOrder;
  int  *lpDx;
  int  *lpCaretPos;
  LPSTR lpClass;
  LPWSTR  *lpGlyphs;
  UINT  nGlyphs;
  int  nMaxFit;
} GCP_RESULTS, *LPGCP_RESULTS;

Члены структуры

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.

Расстояния в этом массиве находятся в порядке вывода на экран. Чтобы найти расстояние для n-ого символа в первоначальной строке, используйте массив lpOrder как ниже указано:

width (ширина) = lpDx[lpOrder[i]], где i = n;
lpCaretPos

Указатель на массив, который принимает значения позиции каретки или  ПУСТО (NULL), если позиции каретки не нужны. Каждое значение задает позицию каретки непосредственно перед соответствующим символом. В некоторых языках позиция каретки для каждого символа не может быть выведена непосредственно слева от символа. Например, на иврите, в котором текст выполняется справа налево, позиция каретки - справа от символа. Если сделано упорядочивание глифа, параметр lpCaretPos соответствует первоначальной строке, а  не строка вывода. Это означает, что некоторые смежные значения, могут быть теми же самыми.

 Значения в этом массиве находятся в порядке ввода . Чтобы найти значение позиции каретки для n-ого  символа в первоначальной строке, используйте массив следующим образом:

позиция = lpCaretPos[i], где i = n;
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] в значение GCP_CLASS_PREBOUNDLTR перед строкой, чтобы связать строку с порядком чтения слева - направо.
GCPCLASS_PREBOUNDRTL Устанавливает параметр lpClass[0] в значение  GCP_CLASS_PREBOUNDRTL перед строкой, чтобы связать строку с порядком чтения справа - налево.
GCPCLASS_POSTBOUNDLTR Устанавливает параметр lpClass[0] в значение GCP_CLASS_POSTBOUNDLTR после строки, чтобы связать строку с порядком чтения слева - направо.
GCPCLASS_POSTBOUNDRTL Устанавливает параметр lpClass[0] в значение  GCP_CLASS_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/OpenType.)

В случае языков, таких как Тайский или Арабский язык, в которых функция GetFontLanguageInfo возвращает флажок GCP_GLYPHSHAPE, параметр lpOutString, должен выдать порядок чтения на экране строки, переданный в функцию GetCharacterPlacement, но значения должны быть при этом символами не имеющими формы. Для правильного вывода на экран, должен использоваться массив lpGlyphs.

Windows 95: Массив lpCaretPos возвращает неправильные значения тогда, когда установлен флажок GCP_REORDER. Чтобы определять позиции каретки, вызовите функцию GetGlyphOutline с флажками  GGO_GLYPH_INDEX | GGO_METRICS, чтобы получить метрическую информацию для каждого символа в переупорядоченной строке. Из этих значений может быть определена, позиция каретки.

Смотри также

Обзор шрифты и текст , Структуры, используемые шрифтами и текстом ,   ExtTextOut, GetCharacterPlacement, GetFontLanguageInfo

Размещение и совместимость GCP_RESULTS

Windows. NET Server

Да

Windows XP

Да

Windows 2000

Да

Windows NT

Да версии 4.0 и выше

Windows Me

Да

Windows 98

Да

Windows 95

Да

Заголовочный файл

 

- объявлено в

Wingdi.h

- включено в

Windows.h

Unicode

Объявлены как структуры Unicode и ANSI

Замечания по платформе

Не имеется

 

Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz