使用 Direct2D 和 DirectWrite(C++、DirectX)制作按钮

Posted

技术标签:

【中文标题】使用 Direct2D 和 DirectWrite(C++、DirectX)制作按钮【英文标题】:Producing buttons with Direct2D and DirectWrite (C++, DirectX) 【发布时间】:2014-01-08 10:06:50 【问题描述】:

我一直在寻找有关如何使用 Direct2D 和 DirectWrite 生成按钮的方法,但没有成功。我对形状、文字和爵士乐感到满意。

但是我突然想到我可能以错误的方式看待它。取一句话:

“您使用 Direct2D 和 DirectWrite API 为您的应用绘制控件和内容,直接处理所有输入事件。”

我现在认为这意味着我不能像使用 XAML 那样快速生成功能齐全的按钮,而是绘制按钮,手动检查鼠标单击时的位置,是否在按钮边界内然后处理事件?无需点击即可悬停的类似方法。

在 UI 中使用 Direct2D 和 DirectWrite 时需要这种方法吗?还是我错过了什么。

任何帮助表示赞赏!干杯:)

【问题讨论】:

【参考方案1】:

是的,要使用 Direct2D 绘制 UI Button,您需要自己处理所有事情,为什么? Direct2D 是 2D 图形 API,而不是控件库。您需要绘制按钮的布局,并处理按钮的消息(例如单击,鼠标悬停......),您失去了很多方便,而且很耗时,但最重要的是:您可以控制自己动手!

【讨论】:

【参考方案2】:

我没有任何使用 DirectX 的经验,但是在 OpenGL 中我从头开始构建我的按钮。假设您已经实现了动画精灵,您的按钮本质上是播放某些动画以响应被单击、悬停等操作的精灵,并且您可以注册回调。在我的 2D 引擎中,我有一个名为 UiButton 的类,它继承了 Sprite,并监听各种 UI 事件。当您想要处理键盘导航(箭头键 + 输入以选择)时,它会变得更加复杂,因为您必须考虑按钮的连接方式以及在任何给定时刻它们中的哪一个具有焦点。

这是我的实现供参考: 标头:https://github.com/RobJinman/dodge/tree/master/Dodge/include/dodge/ui 来源:https://github.com/RobJinman/dodge/tree/master/Dodge/src/ui

如果您不准备推出自己的产品,谷歌搜索“direct2d gui 框架”似乎会带来一些有希望的结果。

很抱歉,我无法提供更多帮助。

【讨论】:

【参考方案3】:

我会看看 Graphucks。它是由 Jeremiah Morrill(Microsoft MVP)创建的,我对它有很好的体验。 http://graphucks.codeplex.com/

【讨论】:

以上是关于使用 Direct2D 和 DirectWrite(C++、DirectX)制作按钮的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DirectX/DirectWrite/Direct2D 文本渲染不能像 GDI 一样清晰?

WinRT 和软件 ClearType 字体渲染

uwp 获取系统字体库

.NET中生成水印更好的方法

如何在 Directwrite 中为给定字体获取可用的 OpenType 功能?

C# 使用 Direct2D 实现斜角效果