C++ 创建独立控件Direct2D的好策略

C++ 创建独立控件Direct2D的好策略,c++,visual-c++,direct3d,direct2d,C++,Visual C++,Direct3d,Direct2d,在花了相当多的时间使用Direct2D(1_1)之后,我正在寻找有关使用Direct2D创建独立控件的信息,主要是关于命中测试和抽象布局的信息 创建一个完整的场景非常简单(特别感谢Kenny Kerr),但是我还没有找到将代码分离到可重用UI组件中的好策略 最后,我还想为这些控件提供包装,这些控件也可以在WPF中使用。谢谢你的帮助 [2月19日至7日上午编辑] 考虑这个非常简单的例子: Render(或Draw)函数渲染一些圆角矩形几何体,其中一些几何体重叠。现在,让我们将每个圆角矩形视为一个独

在花了相当多的时间使用Direct2D(1_1)之后,我正在寻找有关使用Direct2D创建独立控件的信息,主要是关于命中测试和抽象布局的信息

创建一个完整的场景非常简单(特别感谢Kenny Kerr),但是我还没有找到将代码分离到可重用UI组件中的好策略

最后,我还想为这些控件提供包装,这些控件也可以在WPF中使用。谢谢你的帮助

[2月19日至7日上午编辑]

考虑这个非常简单的例子: Render(或Draw)函数渲染一些圆角矩形几何体,其中一些几何体重叠。现在,让我们将每个圆角矩形视为一个独立的ui控件。所以我们将rounded rect抽象为它自己的类,提供一个渲染函数,该函数有一个渲染目标的参数和一个要绘制的点。但是还有很多事情要考虑。控件不一定知道它位于何处。我们的系统可以继续建立在一个通用的命中测试策略之上,这一点非常重要

正如@codeanger所指出的,应该实现诸如visible、enabled、zOrder、width、height等属性。但布局系统应该是我们的出发点


没有一件事情是难以置信的困难,但是我知道这些事情每天都在做,我希望能找到一些模式或策略来考虑。再次感谢。

一般命中测试可以通过以下方式完成:

  • 每个控件都应该有其布局的几何图形。基本矩形、椭圆或不规则形状。然后,控制管理器对它们进行命中测试。然后按zorder订购可能的匹配项
  • 只需在zorder中对它们进行测试,以防止排序步骤
您应该以任何方式存储控件层次结构zordered,这本身就跳过了排序

控件不需要知道它们的位置,但需要知道它们的大小(如果是矩形)和/或形状。并且管理器知道位置和边框。将这些元素组合在一起,就可以进行命中测试。首先确保点落在边界矩形中,然后针对控件的几何体进行测试。在命中测试之前,通过减去控制管理器已知的控制客户端偏移量,将HWND客户端点更新为控制客户端点

这就是我(计划)做这件事的方式。但我要让它没有窗户。如果每个控件都在它自己的子控件中,那么生活就容易多了


PS:如果你想交换意见,可以给我发邮件。如果你愿意,你可以找到我的电子邮件

这是一个棘手的问题,我不确定这个问题是否符合stackoverflow提出的典型问题。这听起来更像是一个设计问题,而不是一个编程问题。另外,我觉得这个问题的措辞很笨拙,所以我不确定你在找什么。你没有提到,但我假设你在使用WPF进行输入处理?从未使用过自己,只有CdTePoin或XInput在C++ Windows应用程序中使用。不确定你所说的独立控件是什么意思,你能澄清一下吗?您是否正在尝试创建可跨不同API/平台使用的可移植抽象接口?您是否希望在抽象的控制代码之上抽象操作?你需要弄清楚你到底想要什么,并澄清。问题是有点模糊。有趣:我目前正在为一个无窗口的UI,内置在D2D1和DW和WIC上的本地C++。我和您的步骤是一样的,使主HWND渲染表面可滚动,与控件交互,然后创建自定义控件。但是我是为C++编写的,而不是用C语言支持的,这确实是一个设计问题。首先,您需要考虑定义和控制的内容,比如ZOrder、大小、可滚动区域、原点、启用、可见等等。然后实现所有这些东西。如果您在HWNDs中创建它们,您只需要管理滚动和鼠标/键盘交互。钩住目标窗口,开始画画…@CodeAngry-谢谢你的留言。首先,我不想担心托管代码。我认为我们可能有类似的目标。我知道这些东西每天都在做,我想可能有一些很好的信息来源,或者流行的模式。我将编辑我的问题以提供一个非常简单的示例。再次感谢,我同意。控件管理器也可以抽象出来,以便在任何容器控件上重用。我也希望它是无窗口的,但是我不确定如何分离渲染目标。因此,如果根据控件所需的宽度和高度生成每个边界矩形,并在子HWND中渲染,则坐标将从左上角零开始?渲染函数看起来类似于:void render(HWND-HWND,RECT-boundary)?可能是提供许多其他属性的基控件。谢谢你的想法,它是C++。您有一个具有虚拟函数的基本控件。如果要避免它们,请使用DLL或库中存储的C类型回调。基本控件公开了一些函数,用户可以使用这些预定义的控件或在基本控件上创建新控件来创建新控件。另外,您可以使用
PushAxisAlignedClip()
PopAxisAlignedClip()
将控件渲染(可选)剪裁到其边界矩形。--对于控件,HWND需要是
ID2D1RenderTarget*
。如果没有窗口,不要每次都创建一个新的。啊!这就是我所缺少的(PushAxisAlignedClip()和PopAxisAlignedClip())。并确保HWND实现ID2D1RenderTarget*。再次感谢你的想法。