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

Producing buttons with Direct2D and DirectWrite (C++, DirectX)

本文关键字:DirectX 按钮 C++ Direct2D DirectWrite 使用      更新时间:2023-10-16

关于如何使用Direct2D和DirectWrite生成按钮,我已经四处寻找了一段时间,但没有成功。我对形状、文字和爵士乐很熟悉。然而,我突然想到,我可能用错误的方式看待它。

举个例子:

您可以使用Direct2D和DirectWrite API,直接处理所有输入事件。

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

使用Direct2D和DirectWrite时需要这种方法吗?

我对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

如果你还没有准备好推出自己的,谷歌搜索"direct2dgui框架"似乎会带来一些有希望的结果。

对不起,我帮不了你了。

是的,要用Direct2D绘制UI按钮,你需要自己处理所有事情,为什么?Direct2D是一个二维图形API,而不是控件库。你需要绘制按钮的布局,并处理按钮的消息(如点击、鼠标悬停…),你失去了很多方便,这很耗时,但最重要的是:你可以自己控制它!

Direct2D是一个图形库。UI控件,如文本选择,文本框和按钮不是其中的一部分。然而,使用Direct2D和DirectWrite的好处是我们可以实现自己的UI控件,并对其进行完全控制。

点击测试任务请参见:ID2D1Geometry::FillsContainsPoint()