GetCharacterPlacement

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

[Now Supported on Windows NT]

GetCharacterPlacement函数检索有关字符串的信息,例如字符宽度,插入符号定位,字符串中的排序和字形渲染。返回的信息类型取决于【dwFlags中】参数,并且基于给定显示上下文中当前选定的字体。该函数将信息复制到指定的GCP_RESULTS结构或由结构指定的一个或多个数组。

DWORD GetCharacterPlacement(

HDC 【HDC】,//处理设备上下文
LPCTSTR 【lpString】,//指向字符串的指针
INT【NCOUNT】,//字符串中的字符数
INT【nMaxExtent】,//显示字符串的最大范围
LPGCP_RESULTS【* lpResults】,//指针缓冲区的放置结果
DWORD【dwFlags中】//放置标志
); 

参数

【HDC】

标识设备上下文。

【lpString】

指向要处理的字符串。

【NCOUNT】

指定字符串中的字符数。

【nMaxExtent】

指定字符串处理的最大范围(以逻辑单位)。如果被处理的字符超出这个范围将被忽略。任何所需排序或字形数组的计算仅适用于包含的字符。仅当在【dwFlags中】参数中给出了GCP_MAXEXTENT值时,才使用此参数。由于函数处理输入字符串,所以每个字符及其范围仅在总范围尚未超过最大值时被添加到输出,范围和其他数组。一旦达到极限,处理将停止。

【lpResults】

指向接收函数结果的GCP_RESULTS结构。

【dwFlags中】

指定如何将字符串处理为所需的数组。此参数可以是以下值中的一个或多个:

含义
GCP_CLASSIN指定lpClass数组包含预设的字符分类。分类可能与产出相同。如果字符的特定分类未知,则阵列中的相应位置必须设置为零。有关分类的更多信息,请参阅GCP_RESULTS。仅当GetFontLanguageInfo返回GCP_REORDER标志时,此函数才有用。
GCP_DIACRITIC确定如何处理字符串中的变音符号。如果未设置此值,则将变音符视为零宽度字符。例如,希伯来语字符串可能包含变音符号,但您可能不希望显示它们。

使用GetFontLanguageInfo来确定字体是否支持变音符号。如果是,您可以使用或不使用GCP_DIACRITIC标志来调用GetCharacterPlacement,具体取决于您的应用需求。

GCP_DISPLAYZWG对于需要重排序或不同字形的语言,取决于单词中字符的位置,不可显示的字符通常出现在代码页中。例如,在希伯来语代码页中,有从左到右和从右到左的标记,以帮助确定输出字符串中字符的最终定位。通常这些不会显示,并从lpGlyphslpDx阵列中删除。您可以使用GCP_DISPLAYZWG标志来显示这些字符。
GCP_GLYPHSHAPE指定字符串中的某些或所有字符将使用当前代码页当前选定字体中定义的标准形状以外的形状进行显示。某些语言(如阿拉伯语)不能支持字形创建,除非给出这个值。作为一般规则,如果GetFontLanguageInfo为字符串返回此值,则此值【必须】将与GetCharacterPlacement一起使用。
GCP_JUSTIFY调整lpDx 【】数组中的范围,以使字符串长度与【nMaxExtent】相同。GCP_JUSTIFY只能与GCP_MAXEXTENT结合使用。
GCP_JUSTIFYIN指定lpDx数组包含输入上的对齐权重。通常,对齐权重可以是0或1,其中1表示可以调整给定字符的宽度以进行调整。对于GetFontLanguageInfo返回GCP_KASHIDA标志的语言,对齐权重可以是GCP_ARAJUST_ *值之一。
GCP_KASHIDA使用Kashidas,或者,而不是调整的范围来修改字符串的长度,使其等于【nMaxExtent】给出的值。在lpDx数组中,Kashida由负对齐指数指示。GCP_KASHIDA只能与GCP_JUSTIFY结合使用,只有当字体(和语言)支持Kashidas时才可以使用。使用GetFontLanguageInfo确定当前的字体是否支持Kashidas。

使用Kashidas来证明字符串可以导致所需的字形数大于输入字符串中的字符数。因此,当使用Kashidas时,应用程序不能假定将数组设置为输入字符串的大小将足够。(【最大值】可能大约是dxPageWidth / dxAveCharWidth,其中dxPageWidth是文档的宽度,dxAveCharWidth是从GetTextMetrics调用返回的平均字符宽度)。

请注意,只是因为GetFontLanguageInfo返回GCP_KASHIDA标志并不意味着【具有】GetCharacterPlacement的调用中使用,只是该选项可用。

GCP_LIGATE使用连字符,无论字符连接在哪里。当一个字形用于两个或多个字符时,发生连接。例如,字母“a”和“e”可以连接到“”。然而,为了使用这一点,语言支持和字体都必须支持所需的字形(给出的示例不会以英文默认处理)。

使用GetFontLanguageInfo来确定当前的字体是否支持连接。如果是,并且要连接的字符数需要特定的最大值,请在lpGlyphs数组的第一个元素中设置数字。如果需要正常连接,请将此值设置为零。如果没有给出GCP_LIGATE,则不会进行结扎。有关详细信息,请参阅GCP_RESULTS。

如果字符集通常需要GCP_REORDER值,但没有给出,则输出将是无意义的,除非传入的字符串已经在可视化排序中(也就是说,得到的结果被放入【lpGcpResults】 - > { 989796144}在一次调用GetCharacterPlacement中是第二次调用的输入字符串)。

请注意,只是因为GetFontLanguageInfo返回GCP_LIGATE标志并不意味着【具有】GetCharacterPlacement的调用中使用,只是该选项可用。

GCP_MAXEXTENT仅当逻辑单位的结果范围不超过【nMaxExtent】参数给出的值时,才能计算字符串的范围。
GCP_NEUTRALOVERRIDE只有某些语言覆盖中性粒子的正常处理,并将它们视为匹配字符串阅读顺序的强字符。仅适用于GCP_REORDER标记。
GCP_NUMERICOVERRIDE只有某些语言覆盖数字的正常处理,并将其视为与字符串读取顺序匹配的强字符。仅适用于GCP_REORDER标记。
GCP_NUMERICSLATIN仅限阿拉伯语/泰语。对数字使用标准拉丁字形并覆盖系统默认值。要确定此选项是否以字体的语言提供,请使用GetStringTypeEx查看语言是否支持多种数字格式。
GCP_NUMERICSLOCAL仅限阿拉伯语/泰语。对数字字符使用本地字形,并覆盖系统默认值。要确定该选项是否以字体的语言提供,请使用GetStringTypeEx查看语言是否支持多种数字格式。
GCP_REORDER重新排序字符串。用于不是SBCS和从左到右阅读顺序的语言。如果未给出此值,则假定该字符串处于显示顺序。

如果将此标志设置为Semitic语言,并使用lpClass数组,则数组的前两个元素用于指定超出字符串范围的读取顺序。GCP_CLASS_PREBOUNDRTL和GCP_CLASS_PREBOUNDLTR可用于设置顺序。如果不需要预设顺序,将值设置为零。如果设置了GCPCLASSIN标志,这些值可以与其他值组合。

如果GCP_REORDER值为【不】,则【lpString】参数被视为对于使用该语言的可视排序,并且【lpOutString】【lpOrder】字段将被忽略。

使用GetFontLanguageInfo来确定当前的字体是否支持重新排序。

GCP_SYMSWAPOFF只有闪族语言。指定可交换字符【不】重置。例如,在从右到左的字符串中,'('和')'不反转。
GCP_USEKERNING在创建宽度数组时,使用字体中的字距对(如果有)。使用GetFontLanguageInfo来确定当前字体是否支持字距对。

请注意,因为GetFontLanguageInfo返回GCP_USEKERNING标志并不意味着【具有】GetCharacterPlacement的调用中使用,只是该选项可用。大多数TrueType字体都有一个字距调整表,但您不必使用它。


建议应用程序使用GetFontLanguageInfo功能确定GCP_DIACRITIC,GCP_DBCS,GCP_USEKERNING,GCP_LIGATE,GCP_REORDER,GCP_GLYPHSHAPE和GCP_KASHIDA值是否对当前选定的字体有效。如果无效,GetCharacterPlacement将忽略该值。

GCP_NODIACRITICS值不再被定义,不应该被使用。

返回值

如果函数成功,则返回值与字符串的宽度和高度GetTextExtentPoint32的返回值相同。

如果函数失败,返回值为零。

备注

GetCharacterPlacement确保应用程序可以正确处理文本,无论可用的国际设置和字体类型如何。在使用ExtTextOut功能之前,应用程序使用此函数,代替GetTextExtentPoint32功能(偶尔代替GetCharWidth32GetCharABCWidths功能)。

使用GetCharacterPlacement来检索字符间距和索引数组并不总是必需的,除非需要进行校对或字距调整。对于非拉丁字体,应用程序可以通过使用GetCharacterPlacement在调用ExtTextOut之前检索字符间距和索引数组来提高ExtTextOut函数呈现文本的速度。当重复渲染相同的文本或使用字符间距来定位插入符时,这是特别有用的。如果在ExtTextOut的调用中使用lpGlyphs输出数组,则必须设置ETO_GLYPH_INDEX标志。

GetCharacterPlacement检查lpCaretPoslpCaretPoslpOutStringlpGlyphs GCP_RESULTS结构的成员,并将这些成员【不】设置为NULL时填充相应的数组。如果GetCharacterPlacement无法填充数组,则将相应的成员设置为NULL。为了确保检索有效的信息,应用程序负责在调用该函数之前将成员设置为有效地址,并在调用后检查成员的值。如果给出了GCP_JUSTIFY或GCP_USEKERNING值,则lpDx和/或lpCaretPos成员必须具有有效的地址。另外,如果给出了GCP_JUSTIFYIN,则lpDx成员必须具有有效的地址。

当计算对齐时,如果字符串中的尾随字符是空格,则该函数会减少字符串的长度,并在计算对齐之前删除空格。如果数组仅由空格组成,则该函数返回错误。

也可以看看

ExtTextOut, GCP_RESULTS, GetCharABCWidths, GetCharWidth32, GetFontLanguageInfo, GetStringTypeEx, GetTextExtentPoint32, GetTextMetrics