wingdi.h) (GCP_RESULTSW 结构

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 函数一起使用。

此数组中的距离按显示顺序排列。 若要查找原始字符串中 第 i个字符的 距离,请使用 lpOrder 数组,如下所示:


width = lpDx[lpOrder[i]];

lpCaretPos

指向接收插入点位置值的数组的指针;如果不需要插入点位置,则为 NULL 。 每个值指定紧靠相应字符之前的插入点位置。 在某些语言中,每个字符的插入点位置可能不会紧靠字符的左侧。 例如,在希伯来语中,文本从右到左排列,插入符号位置是字符的右侧。 如果完成字形排序, lpCaretPos 将匹配原始字符串,而不是输出字符串。 这意味着某些相邻值可能相同。

此数组中的值按输入顺序排列。 若要查找原始字符串中 第 i个字符的 插入点位置值,请使用 数组,如下所示:


position = lpCaretPos[i];

lpClass

指向包含和/或接收字符分类的数组的指针。 这些值指示如何在字符串中设置字符的布局, (与 GetStringTypeEx 函数返回的CT_CTYPE2值) 相似,但并不完全相同。 可以将数组的每个元素设置为零或以下值之一。

含义
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 。 如果字符串包含连字形,数组中的字形数可能小于原始字符串中的字符数。 此外,如果需要重新排序,字形的顺序可能不是连续的。

如果对具有任何形式的连线、字距调整或顺序切换的字符串执行多个操作,则此数组非常有用。 将此数组中的值用于后续操作可节省每次生成字形索引所需的时间。

此数组始终包含字形索引,并且当此数组与 ExtTextOut 函数一起使用时,必须始终使用此ETO_GLYPH_INDEX值。

使用 GCP_LIGATE 时,可以限制将连在一起的字符数。 (例如,在阿拉伯语中,三字符连线是常见的) 。 这是通过在 lpGcpResults-lpGlyphs>[0] 中设置所需的最大值来完成的。 如果不需要最大值,则应将此字段设置为零。

对于阿拉伯语(其中 GetFontLanguageInfo 返回GCP_GLYPHSHAPE标志)的语言,字符的字形将有所不同,具体取决于字符是位于单词的开头、中间还是结尾。 通常,输入字符串中的第一个字符也是单词中的第一个字符,输入字符串中的最后一个字符将被视为单词中的最后一个字符。 但是,如果显示的字符串是完整字符串的子集(例如在显示滚动文本的一部分时),则可能并非如此。 在这些情况下,需要强制将第一个或最后一个字符塑造为不是初始或最终形式。 为此,同样,使用 lpGlyphs 数组中的第一个位置,方法是使用GCPGLYPH_LINKBEFORE和/或GCPGLYPH_LINKAFTER值执行上述连线值的 OR 操作。 例如,值 GCPGLYPH_LINKBEFORE |2 表示双字符连字是所需的最大值,字符串中的第一个字符应被视为在单词中间。

nGlyphs

输入时,必须将此成员设置为数组指针成员指向的数组的大小。 在输出时,此值设置为输出数组中填充的字形数。 如果不需要字形替换 (即,每个输入字符映射到一个字形) ,则此成员与输入时相同。

nMaxFit

GetCharacterPlacement 函数的 nMaxExtent 参数指定的范围中的字符数。 如果设置了GCP_MAXEXTENT或GCP_JUSTIFY值,则此值可能小于原始字符串中的字符数。 无论指定GCP_MAXEXTENT值还是GCP_JUSTIFY值,都会设置此成员。 nGlyphs 与指定输出字形数量的 nGlyphs 不同, nMaxFit 引用输入字符串中的字符数。 对于拉丁语 SBCS 语言,这相同。

注解

是否需要 lpGlyphslpOutString 或两者都取决于 GetFontLanguageInfo 调用的结果。

对于英语等语言的字体,其中不返回任何GCP_DBCS、GCP_REORDER、GCP_GLYPHSHAPE、GCP_LIGATE、GCP_DIACRITIC或GCP_KASHIDA标志,则不需要任何数组即可正确操作。 (虽然不是必需的,但仍可以使用它们。如果使用 lpOutString 数组,它将与传递给 GetCharacterPlacement.) 的 lpInputString 完全相同,但是,如果使用 GCP_MAXEXTENT,则 lpOutString 将包含截断的字符串(如果使用它),而不是原始字符串的确切副本。

对于具有重新排序但通常没有额外字形形状的语言(如希伯来语)的字体,应使用 lpOutString 。 这将提供屏幕可读顺序上的字符串。 但是,通常不需要 lpGlyphs 数组。 如果字体为 TrueType/Open font, (希伯来语可以有额外的字形 )

对于泰语或阿拉伯语等语言, 其中 GetFontLanguageInfo 返回GCP_GLYPHSHAPE标志, lpOutString 将提供传递给 GetCharacterPlacement 的字符串的显示可读顺序,但值仍将是未调整的字符。 为了正确显示,必须使用 lpGlyphs 数组。

注意

wingdi.h 标头将 GCP_RESULTS 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
标头 wingdi.h (包括 Windows.h)

另请参阅

ExtTextOut

字体和文本结构

字体和文本概述

GetCharacterPlacement

GetFontLanguageInfo