复杂脚本
虽然前面讨论的函数适用于多种语言,但它们可能无法满足复杂脚本的需求。 复杂脚本 是其打印形式不以简单方式呈现的语言。 例如,复杂脚本可能允许双向呈现、字形的上下文调整或组合字符。 由于这些特殊要求,文本输出的控制必须非常灵活。
显示文本 TextOut、 ExtTextOut、 TabbedTextOut、 DrawText 和 GetTextExtentExPoint 的函数已扩展为支持复杂脚本。 通常,此支持对应用程序是透明的。 但是,应用程序应将字符保存在缓冲区中,并一次显示整行文本,以便复杂的脚本整形模块可以使用上下文正确重新排序和生成字形。 此外,由于字形的宽度可能因上下文而异,因此应用程序应使用 GetTextExtentExPoint 来确定行长,而不是使用缓存字符宽度。
此外,复杂的脚本感知应用程序应考虑为其应用程序添加对从右到左阅读顺序和右对齐的支持。 可以使用以下代码在左和右之间切换阅读顺序或对齐方式:
// Save lAlign (this example uses static variables)
static LONG lAlign = TA_LEFT;
// When user toggles alignment (assuming TA_CENTER is not supported).
lAlign = TA_RIGHT;
// When the user toggles reading order.
lAlign = TA_RTLREADING;
// Before calling ExtTextOut, for example, when processing WM_PAINT
SetTextAlign (hDc, lAlign);
若要同时切换这两个属性,请执行以下语句,然后调用 SetTextAlign 和 ExtTextOut,如前所示:
lAlign = TA_RIGHT^TA_RTLREADING; //pre-inline !
还可以使用 Uniscribe 处理复杂的脚本。 Uniscribe 是一组函数,允许对复杂脚本进行精细控制。 有关详细信息,请参阅 Uniscribe 和 处理复杂脚本。