显示亚洲字符(使用Unicode):与使用ExtTextOut相比,在RichEdit控件中显示时字符间距的差异

时间:2011-02-23 14:22:38

标签: windows unicode rtf richedit textout

这张照片说明了我的困境:

Image1

所有字符看起来都是相同的大小,但与使用ExtTextOut时相比,它们在RichEdit控件中显示时间距会有所不同。

我想在RichEdit控件(理想情况下)中显示相同的字符,以保留换行位置。

任何人都可以告诉我:

a)哪种表示更正确?

b)为什么RichEdit控件显示亚洲字符之间没有间隙的文字?

c)在绘制这些字符时,有没有办法让ExtTextOut重现RichEdit控件的行为?

d)如果我在亚洲版的Windows上工作会有什么不同吗?

也许我很乐观,但如果有人提出任何提示,我会非常有兴趣听到。

如果有帮助:

这是我的文字:

快的棕色狐狸跳在懶惰狗1 2 3 4 5 6 7 8 9 0

向亚洲读者道歉,这仅仅是为了测试我们的Unicode实现,我甚至不知道这些字符取自哪种语言,更不用说它们是否意味着什么

为了通过将这些字符粘贴到RichEdit控件(例如,Wordpad)来查看效果,您可能会发现必须将它们滑动并将字体设置为“Arial”。

我获得的富文本是:

{\rtf1\ansi\ansicpg1252\deff0\deflang2057{\fonttbl{\f0\fnil\fcharset0 Arial;}}{\colortbl ;\red0\green0\blue0;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\fs22\u24555?\u30340?\u26837?\u33394?\u29392?\u29432?\u36339?\u22312?\u25078?\u24816?\u29399?1 2 3 4 5 6 7 8 9 0\par\pard\'a3 $$ \'80\'80\cf1\lang2057\fs16\par}

它似乎不包含我首先想到的角色'pitch'的值。

3 个答案:

答案 0 :(得分:3)

我不知道答案,但有几件事需要怀疑:

  • 富编辑控件有多个版本。也许你正在使用一个没有所有最新印刷改进的旧版本。
  • 有许多样式和标志会影响丰富的editcontrol的行为,因此您可能想要探索设置哪些样式和它们的作用。例如,请查看EM_GETEDITSTYLE
  • 许多亚洲字体在Windows上有两个版本。一个针对水平布局进行了优化,另一个针对垂直布局进行了优化后者通常具有相同的名称,但前缀为@。也许你在富编辑控件中使用了错误的一个。

更新:通过搞乱写字板,我能够用丰富的编辑控件中的拥挤文本重现问题。

  1. 在Windows 7上的Wordpad中打开一个新文档。请注意,所选字体为Calibri。
  2. 将示例文本粘贴到文档中。
  3. 文本显示正确,但Wordpad将字体更改为SimSun。
  4. 选择文本并将字体更改回Calibri或Arial。
  5. 现在文字过于拥挤,与你的例子非常相似。因此,看起来根本问题在于字体链接和回退。 ExtTextOut可能会自动为脚本选择合适的字体。您面临的挑战是弄清楚如何为脚本识别正确的字体,并在富编辑控件中设置该字体。

答案 1 :(得分:1)

ExtTextOut允许您指定记录之间的逻辑间距。它具有parameter lpDx,它是指向值数组的const指针,指示相邻字符单元格的原点之间的距离。 Microsoft API文档指出,如果您没有设置它,那么它会设置它自己的默认间距。我不得不说,这就是为什么ExtTextOut正常工作的原因。

特别是,当您在EMF中构建EMR_EXTTEXTOUTW记录时,它会使用此DX阵列填充EMR_TEXT结构 - 查看您的一条注释,允许RichEdit使用记录中包含的信息插入EMF,如果你没有设置字体绑定,然后RTF记录进行了一些匹配,以确定要使用的字体。

就RichEdit控件而言,following article可能很有用:

  

在Rich Edit Control中使用字体绑定

     

分配字符集后,Rich Edit将扫描文本周围的文本   向前和向后插入点以找到最近的字体   已被用于字符集。如果没有找到a的字体   字符集,Rich Edit使用客户端为其选择的字体   字符集。如果客户端没有为该字符指定字体   set,Rich Edit使用该字符集的默认字体。如果   客户端想要一些其他字体,客户端总是可以改变它,但是   这种方法大部分时间都可以使用。当前的默认字体   选择基于下表。请注意默认字体   是按进程设置的,并且有单独的UI使用列表和   非UI使用。

如果您还没有设置字符集,那么它会进一步解释它回退到ANSI_CHARSET。但是,它绝对是a lot more complicated than that,正如Murray Sargent(微软程序员)的博客文章所示。

答案 2 :(得分:0)

这只会对您的部分问题有所帮助,但有一种方法可以将文本绘制到与RichEdit完全相同的DC:所谓的无窗口RichEdit控件。它不是很容易使用:几年前我写了CodeProject article。我用它来解决文本块的可滚动显示问题,每个文本块都可以通过点击来编辑:普通的绘图是用无窗口的RichEdit完成的,编辑是通过显示“真正的”RichEdit控件来实现的。它的顶部。

这至少会让你在两种情况下都看起来相同,但不幸的是两种情况都会显示出太少的字符间距。

还有一个想法:如果你可以依赖安装的Microsoft Office,你也可以尝试随办公室的更高版本的RichEdit。关于Murray Sargent's blog的更多内容,以及一些有关字体绑定的有趣文章也可能有所帮助。