Структура 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; |
Указатель на массив, который получает индексы расстановки или значение ПУСТО (NULL), если индексы расстановки не нужны. Однако, его значение зависит от других элементов структуры GCP_RESULTS. Если должны быть возвращены индексы глифа, то индексы являются массивом для lpGlyphs; если возвращаются не индексы глифа, а значения, запрошенные lpOrder, индексы предназначаются для lpOutString. Например, в последнем случае значение lpOrder [i] является позицией lpString [i] в строке вывода данных lpOutString.
Это обычно используется тогда, когда функция
GetFontLanguageInfo возвращает флажок GCP_REORDER, который указывает, что первоначальную строку, нужно переупорядочить. Например, в еврейском языке, в котором текст пишется справа налево, массив lpOrder дает точные места каждого элемента в исходной строке.Расстояния в этом массиве находятся в порядке вывода на экран. Чтобы найти расстояние для n-ого символа
в первоначальной строке, используйте массив lpOrder как ниже указано:
width (ширина) = lpDx[lpOrder[i]], где i = n; |
Указатель на массив, который принимает значения позиции каретки или ПУСТО (NULL), если позиции каретки не нужны. Каждое значение задает позицию каретки непосредственно перед соответствующим символом. В некоторых языках позиция каретки для каждого символа не может быть выведена непосредственно слева от символа. Например, на иврите, в котором текст выполняется справа налево, позиция каретки - справа от символа. Если сделано упорядочивание глифа, параметр lpCaretPos соответствует первоначальной строке, а не строка вывода. Это означает, что некоторые смежные значения, могут быть теми же самыми.
Значения в этом массиве находятся в порядке ввода . Чтобы найти значение позиции каретки для n-ого символа в первоначальной строке, используйте массив следующим образом:
позиция = lpCaretPos[i], где i = n; |
Значение | Предназначение |
---|---|
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 значимо.
Этот массив полезен, если со строкой делается больше чем одна операция, которая имеет любую форму лигатуры (сшивки символов), кернинга или переключения порядка. Использование значений в этом массиве для последующих операций экономит время, в противном случае необходимо, чтобы каждый раз создавались индексы глифов .
Этот массив всегда содержит индексы глифа, и нужно всегда использовать значение ETO_GLYPH_INDEX, когда этот массив используется с функцией ExtTextOut.
Когда используется флажок GCP_LIGATE , Вы можете ограничить число символов, которые должны сшиваться вместе. (В арабском языке например, трехсимвольные лигатуры являются обычным делом). Это делается настройкой требуемого максимума в lpGcpResults-> lpGlyphs [0]. Если такого максимум не требуется, вам следует установить это поле в нуль.
Для языков, таких как арабский язык, где функция GetFontLanguageInfo возвращает флажок GCP_GLYPHSHAPE, глифы для символов должны быть различными в зависимости от того, находится ли символ вначале, середине, или в конце слова. Как правило, первый символ во вводимой строке также будет первым символом в слове, и последний символ во вводимой строке, должен обрабатываться как последний символ в слове. Однако, если показываемая на экране строка - подмножество законченной строки, такой как при отображении раздела пролистанного текста, это не может быть истиной. В этих случаях желательно заставить первый или последний символы получить форму, также не являющуюся начальной или конечной формами. Чтобы сделать это, опять используется первое место в массиве lpGlyphs , выполняя операцию OR значения лигатуры со значениями GCPGLYPH_LINKBEFORE и/или GCPGLYPH_LINKAFTER. Например, значение GCPGLYPH_LINKBEFORE | 2 означает, что двух символьные лигатуры имеют необходимый максимум, а первый символ в строке, должен быть обработан, как будто он находится в середине слова.
Требуются ли параметры 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 Замечания по платформе
Не имеется