【问题标题】:Nested custom controls in wxWidgetswxWidgets 中的嵌套自定义控件
【发布时间】:2019-04-11 04:21:41
【问题描述】:

背景

我正在处理 wxWidgets 中的几个自定义控件,发现我不确定实现复杂嵌套控件的“干净”或“预期”方式,即原则上可以由几个子控件组成的控件控制。

以图表视图为例(例如对于 UML 图)。该图由节点和边组成。每个节点可能包含一个用于删除节点的按钮。我可能还想要整个图表的缩小概览图。

基线

我当前的实现是(基于我找到的示例和手册)处理所有绘图的单个图表控件 - 边缘、节点、按钮、概览图像,这不是那么不方便,因为我不想要本机控件无论如何,并且还根据在屏幕上找到它们的坐标来处理按钮上的所有点击事件。

另类

但我一直想知道这是否真的是正确的方法,最近我想到可能会有更好的方法:说(例如)class Node : public wxPanel,在Node 里面是一个按钮,Node 的其余部分(节点颜色等)由我在Node 背景上绘制。然后我将许多Nodes 放在class DiagramView : public wxPanel 中,在每个图表节点的位置。我还在DiagramView 中放置了一个class Overview : public wxControl

这意味着我只将那些Nodes 添加到目前可见的DiagramView

我在下面添加了当前实现(上)和替代方案(下)的草图。类边界用粗虚线标记。完全自定义绘制的控件是红色的,面板是蓝色的。

我也意识到有用于绘制图形的库,这只是一个直观的示例,但我的问题更笼统:什么是正确或预期的方式,或者构建嵌套/复杂自定义控件的最佳实践?自定义绘制所有内容是否更好,例如通用树视图?或者更好地继承例如从面板中嵌套这些,并且只在它们的背景和原子自定义控件(如按钮)上绘制?还是出于某种原因所有这些问题?任何提示将不胜感激。

【问题讨论】:

  • 你可能会在 wxWidgets 论坛上得到更多的回复。

标签: c++ user-interface wxwidgets


【解决方案1】:

几乎所有情况都没有单一的最佳答案。 在您的情况下,最好保留完整的自定义绘图,特别是因为您已经实现并工作了它。否则,另一个非常重要的考虑因素是兄弟小部件的重叠,这是不允许的。 IE。如果 Node 1、Node 2、Overview 等是 wxPanel-s,它们不能重叠。不支持重叠的小部件,允许它只会表现出奇怪的行为(这将影响绘图、事件处理等)。

但是,在某些情况下,复合控件最好由较小的控件构建,这样可以保证不会发生任何同级重叠。此处的优点包括使用尺寸调整器对齐组件、更轻松的文本操作、更少的自定义绘图(如果有的话)。

【讨论】:

    【解决方案2】:

    通常,您设计自己的控件的方式与设计对话框的方式相同:使用子控件并在 wxSizer 的帮助下将它们放置在 wxPanel 中。

    您需要覆盖基类 virtuals DoGetBestSize()DoMoveWindow(...)

    如果需要,您应该注意鼠标/键盘操作,而不是默认处理。

    第二种方法是您目前所做的:绘制所有内容并自己关心事件。这很难。

    第三种方法是使用未记录的wxCompositeWindow 类。 wxWidgets 在内部使用它来构建一些控件(通用 wxSpinCtrl、wxDateCtrl 等)。你可以搜索它的源代码,看看它是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 2023-03-30
      • 2015-08-24
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多