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] 的值是输出字符串 lpOutString 中 lpString[i] 的位置。
GetFontLanguageInfo 返回GCP_REORDER标志时,通常会使用此标志,指示原始字符串需要重新排序。 例如,在希伯来语中,文本从右到左运行,lpOrder 数组提供原始字符串中每个元素的确切位置。
lpDx
指向接收相邻字符单元格之间的距离或 NULL(如果不需要这些距离)的数组的指针。 如果完成字形呈现,则标志符号的距离不是字符,因此生成的数组可与 ExtTextOut 函数一起使用。
此数组中的距离按显示顺序排列。 若要在原始字符串中查找 i第 个字符的距离,请使用 lpOrder 数组,如下所示:
width = lpDx[lpOrder[i]];
lpCaretPos
指向接收插入符号位置值的数组的指针,或者如果不需要插入点位置,则为 NULL
此数组中的值按输入顺序排列。 若要查找原始字符串中第
position = lpCaretPos[i];
lpClass
指向包含和/或接收字符分类的数组的指针。 这些值指示如何在字符串中布局字符,并且与 GetStringTypeEx 函数返回的CT_CTYPE2值相似(但不完全相同)。 数组的每个元素都可以设置为零或以下值之一。
价值 | 意义 |
---|---|
|
阿拉伯文字符。 |
|
希伯来语字符。 |
|
来自拉丁语或其他单字节字符集的字符,用于从左到右的语言。 |
|
来自拉丁语或其他单字节字符集的数字,用于从左到右的语言。 |
|
与当前字体关联的字符集中的数字。 |
此外,在提供具有GCP_CLASSIN标志的 lpClass 数组中的值时,可以使用以下内容。
对于使用GCP_REORDER标志的语言,还可以将以下值与GCP_CLASSIN标志一起使用。 与上述值不同,可以在 lpClass 数组中的任何位置使用,以下所有值仅在数组的第一个位置使用。 所有分类都与其他分类相结合。
请注意,GCPCLASS_PREBOUNDLTR和GCPCLASS_PREBOUNDRTL互斥,GCPCLASSPOSTBOUNDLTR 和 GCPCLASSPOSTBOUNDRTL 是互斥的。
若要强制以特定方式执行字符的布局,请预设相应数组元素的分类:该函数保留此类预设分类不变,并且仅计算已设置为零的数组元素的分类。 仅当设置了GCP_CLASSIN标志并且提供 lpClass 数组时,才使用预设分类。
如果 GetFontLanguageInfo 不返回当前字体的GCP_REORDER,则只有GCPCLASS_LATIN值有意义。
lpGlyphs
指向数组的指针,用于接收用于呈现字符串的字形的值,或者如果不需要字形呈现,则为 NULL 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不同,它指定输出标志符号的数量,nMaxFit 引用输入字符串中的字符数。 对于拉丁语 SBCS 语言,这相同。
言论
lpGlyphs、lpOutString,还是不需要这两者都取决于 GetFontLanguageInfo 调用的结果。
如果语言(如英语)的字体,其中没有GCP_DBCS、GCP_REORDER、GCP_GLYPHSHAPE、GCP_LIGATE、GCP_DIACRITIC或GCP_KASHIDA标志,则无需任何数组才能正常运行。 (虽然不需要,但它们仍然可以使用。如果使用
对于具有重新排序但通常没有额外字形形状的语言(如希伯来语)的字体,应使用 lpOutString。 这将按屏幕可读的顺序提供字符串。 但是,通常不需要 lpGlyphs 数组。 (如果字体为 TrueType/Open 字体,希伯来语可以具有额外的字形。
如果语言(如泰文或阿拉伯语)GetFontLanguageInfo 返回GCP_GLYPHSHAPE标志,lpOutString 将提供传递给 getCharacterPlacement的字符串的显示可读顺序,但值仍将为未调整字符。 若要正确显示,必须使用 lpGlyphs 数组。
注意
wingdi.h 标头将GCP_RESULTS定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
支持的最低服务器 | Windows 2000 Server [仅限桌面应用] |
标头 | wingdi.h (包括 Windows.h) |