描述
GCP_RESULTS结构包含有关字符串中字符的信息。此结构接收GetCharacterPlacement函数的结果。对于某些语言,数组中的第一个元素可能包含更多与语言相关的信息。
C++ 语法
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; |
PowerBASIC 语法
TYPE GCP_RESULTSA lStructSize AS DWORD lpOutString AS ASCIIZ PTR lpOrder AS DWORD PTR lpDx AS LONG PTR lpCaretPos AS LONG PTR lpClass AS ASCIIZ PTR lpGlyphs AS WORD PTR nGlyphs AS DWORD nMaxFit AS LONG END TYPE |
Unicode版本:
TYPE GCP_RESULTSW lStructSize AS DWORD lpOutString AS WSTRINGZ PTR lpOrder AS DWORD PTR lpDx AS LONG PTR lpCaretPos AS LONG PTR lpClass AS WSTRINGZ PTR lpGlyphs AS WORD PTR nGlyphs AS DWORD nMaxFit AS LONG END TYPE |
成员
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函数一起使用。
该阵列中的距离按显示顺序显示。要找到原始字符串中thth字符的距离,请使用lpOrder数组,如下所示:
width = lpDx[lpOrder[i]];
lpCaretPos
指向接收插入位置值的数组的指针,如果不需要插入位置,则为空值。每个值指定相应字符之前的插入位置。在某些语言中,每个角色的插入符号的位置可能不会立即在字符的左侧。例如,在希伯来语中,文本从右到左运行,插入符号位置在字符的右侧。如果字形排序完成,lpCaretPos匹配原始字符串不输出字符串。这意味着一些相邻的值可能相同。
此数组中的值为输入顺序。要找到原始字符串中ith字符的插入位置值,请按如下所示使用数组:
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标志,字符的字形将根据字符的开头,中间或结尾是否不同。通常,输入字符串中的第一个字符也将是单词中的第一个字符,输入字符串中的最后一个字符将被视为单词中的最后一个字符。但是,如果显示的字符串是完整字符串的子集,例如显示滚动文本的一部分时,则可能不是这样。在这些情况下,期望强制将第一个或最后一个字符形成为不是初始形式或最终形式。为此,再次通过使用值GCPGLYPH_LINKBEFORE和/或GCPGLYPH_LINKAFTER执行上述连接值的OR操作来使用lpGlyphs数组中的第一个位置。例如,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数组,它将与传递给GetCharacterPlacement的lpInputString完全相同。)但是请注意,如果使用GCP_MAXEXTENT,则lpOutString将包含截断字符串(如果使用),NOT原件的确切副本。
在诸如希伯来语等字体的字体的情况下,它具有重新排序但通常不具有额外的字形形状,应该使用lpOutString.这将给屏幕可读顺序的字符串。但是,通常不需要lpGlyphs数组。(希伯来语可以有额外的字形,如果字体是TrueType / Open字体。)
在诸如泰语或阿拉伯语的语言中,GetFontLanguageInfo返回GCP_GLYPHSHAPE标志,lpOutString将给出传递给GetCharacterPlacement的字符串的显示可读顺序,但这些值仍将是未定义的字符。为了正确显示,必须使用lpGlyphs数组。
Windows 95:设置GCP_REORDER时,lpCaretPos数组返回不正确的值。要确定插入位置,请使用GGO_GLYPH_INDEX |调用GetGlyphOutlineGGO_METRICS获取重排序字符串中每个字符的度量信息。由此可以确定插入位置。
引用文件 #INCLUDE Once
WinGdi.inc(包括Windows.inc)