如何在Windows GUI中绘制垂直文本?

sha*_*oth 8 user-interface winapi fonts visual-c++

我需要在我的原生C++ Win32 GUI应用程序中绘制一列垂直文本(日语 - 从上到下而不是从左到右).我查看了MSDN,但只发现了如何绘制从右到左的文本.

除了分别绘制每个字符外,如何输出从上到下的文本?

Joh*_*ler 7

直接的Win32 API无法以这种方式绘制(未旋转的)垂直文本(使用任意字体),除了1个字符.

您可以使用GDI +执行更复杂的文本输出 但是这可能不是您想要的,因为文本将是垂直的,但字符也将被旋转.

类似地,您可以使用具有900或2700的lfEscapement值的CreateFont来获取旋转文本,但这将旋转所有内容.所以这也无济于事.

要执行日语从上到下的绘制,您希望字符不旋转,但每个字符的位置要在Y中前进而不在X中前进.Windows没有为所有字体执行此操作的API.(你可以从右到左,从左到右,但不是从上到下).

理论上,创建一个方向为900且擒纵机构为2700的字体可以达到你想要的效果,但是如果你设置了擒纵机构,那么大多数字体都会忽略方向.对于日语字体,这可能会有所不同.值得花一些时间玩.(有关详细信息,请参阅附录)

我认为你最好的选择可能是使用ExtTextOut一次绘制一个角色的循环,它可以让你完全控制每个角色的位置.

如果您使用ETO_OPAQUE绘制列中的第一个字符,而不是所有其他字符,那么您将被允许在需要时垂直填充字符.

附录

Roygbiv指出一篇有趣的文章说,当你使用CreateFont一个lfEscapement值为2700的字体时,名字以@开头的字体与其他字体的行为不同,这些特殊字体产生直立字符,同时仍然向前推进页面.因此,虽然无法对任意字体执行任何操作,但您可以使用某些字体使其工作.

显示文本的选项

出于好奇,我写了一个小的控制台应用程序来枚举字体并列出名称.我的Windows Server 2003计算机没有名称以@开头的字体.但我的Windows 7机器有一些.所有似乎都是中文字体,我在默认的Windows 7 Ultimate安装中看不到日文字体.

  • 不真实 - Win32可以做到.看我的帖子. (2认同)

小智 5

正确答案是:

有三种方法可以做到这一点:

这里是讨论一些这些方法的文章.

幸运的是,使用Win32,您不需要编写代码来旋转字符.要在Windows 2000和Windows XP上垂直显示文本,请照常枚举可用字体,并选择字体名称以at符号(@)开头的字体.然后创建一个LOGFONT结构,将擒纵机构和方向设置为270度.对TextOut的调用与水平文本的调用相同.