Winapi 如何使用东亚文本强制Win32 RichEdit回退到SimSun?

Winapi 如何使用东亚文本强制Win32 RichEdit回退到SimSun?,winapi,fonts,fallback,Winapi,Fonts,Fallback,我在窗口注册表中为我的字体设置字体链接到SimSun。 当我将该字体应用于richedit控件时,它具有以下行为: 首先,它显示SimSun-ok 当我添加非CKJ unicode的文本,然后在CKJ中添加更多文本时,选择的字体窗口是Microsoft Ya Hei而不是SimSun 以下是截图: 字体为: "阿哥": 西蒙斯 "◎“:Segoe用户界面符号 “[āgē]đạ我可以用Arial "对兄长的称呼。“雅喜 在这种情况下,我如何强制window选择SimSun而不是Micro

我在窗口注册表中为我的字体设置字体链接到SimSun。
当我将该字体应用于richedit控件时,它具有以下行为:

  • 首先,它显示SimSun-ok
  • 当我添加非CKJ unicode的文本,然后在CKJ中添加更多文本时,选择的字体窗口是Microsoft Ya Hei而不是SimSun
以下是截图:

字体为:

  • "阿哥": 西蒙斯
  • "◎“:Segoe用户界面符号
  • “[āgē]đạ我可以用Arial
  • "对兄长的称呼。“雅喜
在这种情况下,我如何强制window选择SimSun而不是Microsoft Ya Hei

编辑
感谢@Cody Gray的完美回答。以下是代码:

CHARFORMAT2 cf2;

memset(&cf2, 0, sizeof(CHARFORMAT2));
cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_FACE | CFM_SIZE | CFM_CHARSET | CFM_LCID;
cf2.lcid = 0x0804;
cf2.yHeight = 280;
cf2.bCharSet = CHINESEBIG5_CHARSET;
wcscpy(cf2.szFaceName, L"SimSun");
SendMessage(rtbhWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_ASSOCIATEFONT, (LPARAM)&cf2);

cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_FACE | CFM_SIZE | CFM_CHARSET | CFM_LCID;
cf2.lcid = 0x0409;
cf2.yHeight = 220;
cf2.bCharSet = ANSI_CHARSET;
wcscpy(cf2.szFaceName, L"Segoe UI");
SendMessage(rtbhWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_ASSOCIATEFONT2, (LPARAM)&cf2);

通过发送带有
SCF\u ASSOCIATEFONT
标志的RichEdit控件,可以设置字符表示的默认字体

这涉及使用所需字体的特征以及与所需字符表示的区域设置相对应的LCID(如文档中所述)填充

另见:


Windows 8引入了“MicrosoftYahei”字体作为简体中文脚本的默认用户界面字体,我想(但我不确定)该SimSun曾是此脚本的默认字体,因此,如果您在某些系统而不是其他系统上看到此行为,这就可以解释了。

我可以再问一个问题吗,我可以将两种字体大小绑定到两种选定的字体吗?例如,如果我选择一个段落,将字体大小设置为100,则字体1的大小设置为100,字体2的大小设置为150?@Tuyen I'm不完全确定我是否理解您的问题。但据我所知,RichEdit控件的缩放是全局性的。如果您使用类似于
EM_SETZOOM
的内容设置缩放因子,它将应用于控件中的所有文本。您不能为单个文本字符串设置不同的缩放因子。但您可以只更改字体大小,即正常的字体大小方法:当您已经选择了一个文本字符串时,发送
EM_SETFONTSIZE
消息。@Tuyen我不完全确定是否理解您的问题。但据我所知,放大RichEdit控件是全局的。如果您使用类似
EM_SETZOOM
的内容设置缩放因子,它将应用于控件中的所有文本。您无法使用t为单个文本字符串设置不同的缩放因子。但是您可以只更改字体大小,通常的方法是:当您已经选择了一个文本字符串时,发送
EM_SETFONTSIZE
消息。这不是缩放,例如:文本范围内同时有拉丁字母和CJK字母。如果我将该文本范围的字体大小设置为12,则对l有好处a字母,但对CKJ来说太小了。如果我们将字体大小设置为18,对CKJ来说就可以了,但对拉丁语来说太大了。我可以做的一种方法是将这个范围分成几个部分,每个部分只包含拉丁语或CKJ,然后为它设置字体大小。但这是一项相当复杂的工作。所以我想知道是否有什么方法,比如将每个字体的字体大小映射/链接到基本字体大小?如果我们为文本范围设置基本字体大小=12,那么字体1大小=12,字体2大小=12*1.5?