绘制在wxPanel或添加许多wxControls

Painting over wxPanel or add many wxControls?

本文关键字:许多 wxControls 添加 wxPanel 绘制      更新时间:2023-10-16

我有形式与空间,必须是六边形地图。首先想到的是-在那里放置wxPanel,并在上面画上我想要的东西。

但实际上所有的六边形都是一样的(它们的类型可能少于10种,颜色可能不同)。我读到有可能创建我自己的wxControls。如果我将创建我需要的wxHexagon控件,并将它们放置在wxPanel或任何其他布局上,该怎么办?

这可能更容易使用:如果用户将点击十六进制,我将不需要计算坐标,并了解他点击选择它的十六进制,我只需要设置事件为每个六边形控制,不是吗?

这是可能的吗(我的主要问题是设置这样的控件大小,因为它必须是六边形,而不是矩形,并将它们放置在一些布局的正确位置。

哪个更好?

无需创建自己的控件。wxButton可以显示位图。你也可以使用wxBitmapButton

to count coordinates and understand to which hex he clicked

实际上,这就是我要做的方式,而不是用许多相同的控制每个十六进制一个。这几乎是微不足道的,如果你所有的六边形都是相同的大小。当用户单击面板时,将点击的x和y协同词除以十六进制大小以找到行和列,将行乘以行计数并添加列,您立即拥有十六进制单击的索引。

在wxWidgets中创建自定义控件非常简单,这不仅仅是为大师保留的东西。基本上,只是派生一个新的c++类(从wxWindow,你不需要wxPanel这样的自定义控件,所以为什么从它不必要地派生?),绑定到你感兴趣的事件(至少wxEVT_PAINT,经常wxEVT_CHAR和鼠标事件),并实现他们的处理程序,唯一不明显的部分,也许,覆盖DoGetBestClientSize()基类虚拟,如果你的控件有一个自然的最佳大小。

就是这样。因此,创建自定义控件并不比在现有窗口中实现其功能需要更多的代码。正因为如此,你应该完全从你的代码设计的角度来做出选择,也就是说,有一个这样的控件是否有意义,或者它们是否总是在组中使用?重用它有意义吗?将来是否需要类似的控件(可以作为派生类实现以重用实现)?等等

不是答案,但是太长了。

如果没有明确的目标,哪个最好似乎完全是主观的,是个人偏好的问题。

也就是说,我猜哪种实现最终归结为许多因素。至少:

  1. 你认为你有可能想要六边形的控件吗未来
  2. 它们之间的距离有多近

    • 实现它们作为一个新的控件肯定会使重用在一个以后的日期非常快速和容易
    • 如果他们彼此接触(像蜂巢一样),我可以想象自己更清楚地处理hit-testing,而不是依赖于(矩形?)常规按钮使用的命中测试。

我想要一个LCD控件来模拟1602 LCD(1位ASCII),所以我将其实现为继承自wxWindow的新控件。后来,我简单地继承了我的控件,使其成为一个16位160x128彩色图形lcd。它很快就适应了。因为它是它自己的控件,所以我只是包含了必要的文件并重新实现了所需的成员函数。没有必要从一个旧项目中修改部分内容。

至于碰撞测试-当彼此排列时,使用方形边界框进行碰撞测试将意味着你有重叠的边界框。我认为你必须子类化wxBitmapButton或wxButton才能正确处理这种情况。由于六边形的大小是由图像决定的,而不是由变量决定的,我可以看到这很快就会变得非常混乱。

也许我对使用wxButton或wxBitmapButton的任务感到悲观,同时对实现自定义控件过于乐观。在任何情况下,我仍然倾向于让每个六边形成为某种描述的控件,这样它们就可以分别为你处理命中测试和点击事件生成——把这个和布局逻辑放在主程序中不是我的偏好。

我可能会使用它们适合的圆的直径作为尺寸,而不是边长测量,尽管每个都很容易,并且有更适合的情况。你可以非常快速和容易地计算出两者之间的比例。

作为一个粗略的指导:1个单位圆可以容纳一个六边形,从一个角到另一个角是1个单位,从一个角到另一个角是0.89个单位,每条边是0.48个单位。

总之,最容易使用的是自定义控件。实现wxButton或wxImageButton可能是最简单/最快/最小的代码。最好的功能来自自定义控件。我很有兴趣看看旋转将如何使用一个标准的按钮类处理。