GCP_RESULTS

【勇芳软件工作室】汉化HomePreviousNext

GCP_RESULTS结构包含有关字符串中字符的信息。此结构接收GetCharacterPlacement函数的结果。对于某些语言,数组中的第一个元素可能包含更多与语言相关的信息。

typedef struct tagGCP_RESULTS {
DWORD lStructSize;
LPTSTR lpOutString;
UINT *lpOrder;
INT *lpDx;
INT *lpCaretPos;
LPTSTR lpClass;
UINT *lpGlyphs;
UINT nGlyphs;
UINT nMaxFit;
} GCP_RESULTS;

会员

lStructSize

指定结构的大小(以字节为单位)。

lpOutString

指向接收输出字符串的缓冲区的指针,如果不需要输出字符串,则为NULL。输出字符串是原始字符串的版本,其顺序将显示在给定的设备上。通常,输出字符串与原始字符串相同,但是如果字符串需要重新排序并设置了GCP_REORDER标志,或者如果原始字符串超过了最大范围并设置了GCP_MAXEXTENT标志,则该字符串可能不同。

lpOrder

接收输出字符串中字符的排序索引的数组的地址,如果不需要排序索引,则为NULL。如果GetFontLanguageInfo函数返回GCP_REORDER值,则原始字符串需要重新排序。这通常在GetFontLanguageInfo返回GCP_REORDER标志时使用。例如,在希伯来语中,文本从右到左运行,lpOrder数组给出原始字符串中每个元素的确切位置。

lpDx

指向接收相邻字符单元格之间距离的数组的指针,如果不需要这些距离,则为NULL。如果字形渲染完成,距离是字形,而不是字符,所以结果的数组可以与ExtTextOut函数一起使用。

该阵列中的距离按显示顺序显示。要找到原始字符串中【i】个字符的距离,请使用lpOrder数组,如下所示:

width = lpDx[lpOrder[i]];

在输入时,如果使用GetCharacterPlacement函数给出GCP_JUSTIFYIN值,则此成员可能包含对齐权重值。

lpCaretPos

指向接收插入位置值的数组的指针,如果不需要插入位置,则为空值。每个值指定相应字符之前的插入位置。在某些语言中,每个角色的插入符号的位置可能不会立即在字符的左侧。例如,在希伯来语中,文本从右到左运行,插入符号位置在字符的右侧。如果字形排序完成,lpCaretPos匹配原始字符串【不】输出字符串。这意味着一些相邻的值可能相同。

此数组中的值为输入顺序。要找到原始字符串中【i】个字符的插入位置值,请按如下所示使用该数组:

position = lpCaretPos[i];

lpClass

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

含义
GCPCLASS_ARABIC阿拉伯字符。
GCPCLASS_HEBREW希伯来字
GCPCLASS_LATIN来自拉丁语或其他单字节字符集的字符,用于从左到右的语言。
GCPCLASS_LATINNUMBER从拉丁语或其他单字节字符集数字从左到右的语言。
GCPCLASS_LOCALNUMBER从与当前字体相关联的字符集数字。

此外,当在lpClass数组中提供GCP_CLASSIN标志的值时,可以使用以下内容。

含义
GCPCLASS_LATINNUMERICSEPARATOR仅输入。用于分隔拉丁数字的字符,如acomma或小数点。
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。如果字符串包含连字符,数组中的字形数可能会少于原始字符串中的字符数。另外如果需要重新排序,字形的顺序可能不是顺序的。

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

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

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

对于诸如阿拉伯语的语言,其中GetFontLanguageInfo返回GCP_GLYPHSHAPE标志,字符的字形将根据字符的开头,中间或结尾是否不同。通常,输入字符串中的第一个字符也将是单词中的第一个字符,输入字符串中的最后一个字符将被视为单词中的最后一个字符。但是,如果显示的字符串是完整字符串的子集,例如显示滚动文本的一部分时,则可能不是这样。在这些情况下,期望强制将第一个或最后一个字符形成为不是初始形式或最终形式。为此,再次,使用lpGlyphs数组中的第一个位置通过执行上述连接值的OR运算,并使用值GCPGLYPH_LINKBEFORE和/或GCPGLYPH_LINKAFTER。例如,GCPGLYPH_LINKBEFORE |的值2意味着两个字符的连字是所需的最大值,字符串中的第一个字符应该被当作一个字的中间。

nGlyphs

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

nMaxFit

适合GetCharacterPlacement功能的【nMaxExtent】参数指定范围内的字符数。如果设置了GCP_MAXEXTENT或GCP_JUSTIFY值,则该值可能小于原始字符串中的字符数。无论是否给出了GCP_MAXEXTENT或GCP_JUSTIFY值,都会设置此成员。与指定输出字形数的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字体。)

在诸如泰语或阿拉伯语的语言中,GetFontLanguageInfo返回GCP_GLYPHSHAPE标志,lpOutString将给出传递给GetCharacterPlacement的字符串的显示可读顺序,但这些值仍将是未定义的字符。为了正确显示,必须使用lpGlyphs数组。

也可以看看

ExtTextOut, GetCharacterPlacement, GetFontLanguageInfo