Win32 Common Controls 现在是否使用 Direct2D?

Does Win32 Common Controls use Direct2D now?

我有一个 Direct2D 应用程序,我在其中使用 DirectWrite 绘制文本消息。都是C++。我想添加一个必须支持表情符号的编辑控件和右侧的按钮。 Win32 编辑控件和按钮是否可以在 Direct2D 中使用 window 文本按钮是使用 DirectWrite 还是使用旧的 GDI 呈现的?

谢谢

comctl32.dll 中没有基于 GDI 的通用控件使用 DirectWrite 绘制文本(兼容性问题太多),但是 Windows 10 shell 的许多较新部分使用 DirectWrite - 任何东西基于 DUI 或 XAML,例如开始菜单或系统设置应用程序。

  • 根据 Simon Mourier 的评论,我几年前写了一个名为 PadWrite 的 SDK 示例,它演示了一个非常基本的编辑控件,但我不能推荐它作为一个严肃的文本编辑器,因为它会在每次编辑时重新创建 IDWriteTextLayout 对象。所以最好只更新几行或几段文本,因为更聪明的编辑器会选择性地只更新文本中发生变化的部分。这适用于 Windows 7,但 Windows 7 本身只有基本的表情符号支持(Segoe UI 符号中的单色字形)。直到Windows10(加上SegoeUIEmoji)才真正变得五颜六色。
  • 较新的 RichEdit 也是一个可行的选择(我忘记了启用它的标志)。
  • 我尝试子类化标准 EDIT 控件以拦截 WM_PAINT 消息(以及 Edit_GetRect、GetDCEx、DefSubclassProc),但这很脆弱,因为 HFONT 并不总是匹配相同的指标作为相应的 IDWriteFontFace 由于字体回退和 GDI 与 DWrite 之间的度量差异,这意味着您绘制的文本可能与底层 EDIT 控件使用的字形推进不匹配。
  • WinUI 如果您可以依赖 >= Windows 10.
  • 应该会很好地工作
  • 还有支持DirectWrite 模式的Scintilla 文本编辑器。 https://www.scintilla.org/ScintillaDoc.html(设置 SCI_SETTECHNOLOGY = SC_TECHNOLOGY_DIRECTWRITE)。这将适用于 >= Windows 7(或带有 SP2 Service Pack 平台更新的 Vista)。