返回

在 Windows 7 的 TRichEdit 控件中模拟 WordPad 的非文本字符字形变更

windows

在 Windows 7 中让 TRichEdit 更改非文本字符字体时模拟 WordPad

问题

如果你正在使用 Windows 7 中的 TRichEdit 控件,你可能会注意到它在更改某些非文本字符(如项目符号)的字体时与 WordPad 的行为不同。在 WordPad 中,你可以自由更改这些字符的字体,但在 TRichEdit 中,它们只能使用默认字体。

解决方法

要解决此问题,我们需要了解导致这种差异的根本原因。在 Windows XP SP1 及更高版本中,WordPad 使用 RichEdit 4.1,而 RichEdit 4.1 的行为与 RichEdit 3.0 不同,后者在 Windows 7 中使用。

在 RichEdit 3.0 中,非文本字符的字体被硬编码为“Arial Unicode MS”。这意味着你无法更改这些字符的字体,即使你使用 EM_SETCHARFORMAT 消息。

但是,我们有一种解决方法可以模拟 WordPad 的行为。此解决方法涉及将非文本字符的字体重置为“Arial Unicode MS”,然后再将其更改为所需的字体。

代码示例

以下代码示例演示了如何实现此解决方法:

procedure TMainForm.ButtonFontClick(Sender: TObject);
var
  format: TCharFormat2;
begin
  if dlgFontCdxTxt.Execute then
  begin
    FillChar(format, sizeof(format), 0);
    format.cbSize:= Sizeof(format);
    format.dwMask:= CFM_CHARSET;
    format.bCharSet := 1; // or 0;
    redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));

    FillChar(format, sizeof(format), 0);
    format.cbSize:= Sizeof(format);
    format.dwMask:= CFM_FACE;
    StrPLCopy(format.szFaceName, dlgFontCdxTxt.Font.Name, High(format.szFaceName));
    redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));
  end;
  redtTextBlock.SetFocus;
end;

结论

通过使用上述解决方法,你可以让 TRichEdit 在更改非文本字符的字体时表现得与 WordPad 相似。这提供了更大的灵活性,让你可以更轻松地自定义文档的外观。

常见问题解答

  1. 为什么在 RichEdit 3.0 中非文本字符的字体被硬编码为“Arial Unicode MS”?

    答:原因尚不清楚,但可能是为了提高性能或兼容性。

  2. 此解决方法是否适用于所有非文本字符?

    答:此解决方法仅适用于支持更改字体的非文本字符。

  3. 是否有其他方法可以更改非文本字符的字体?

    答:没有其他内置方法,但你可以使用自定义字体绘制引擎来实现更高级的控制。

  4. 此解决方法是否适用于 RichEdit 的其他版本?

    答:此解决方法仅适用于 RichEdit 3.0。在其他版本中,非文本字符的字体可能无法更改。

  5. 如何使用解决方法中提到的 EM_SETCHARFORMAT 消息?

    答:EM_SETCHARFORMAT 消息用于设置所选文本的字符格式。有关详细信息,请参阅 Microsoft 文档。