这张照片说明了我的困境:
所有字符看起来都是相同的大小,但与使用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'的值。
答案 0 :(得分:3)
我不知道答案,但有几件事需要怀疑:
@
。也许你在富编辑控件中使用了错误的一个。更新:通过搞乱写字板,我能够用丰富的编辑控件中的拥挤文本重现问题。
现在文字过于拥挤,与你的例子非常相似。因此,看起来根本问题在于字体链接和回退。 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的更多内容,以及一些有关字体绑定的有趣文章也可能有所帮助。