C++ wxWidgets中的嵌套自定义控件 背景

C++ wxWidgets中的嵌套自定义控件 背景,c++,user-interface,wxwidgets,C++,User Interface,Wxwidgets,我正在wxWidgets中处理几个自定义控件,发现我不确定实现复杂嵌套控件的“干净”或“预期”方式,这意味着原则上可以由多个子控件组成的控件 以图视图为例(例如UML图)。此图由节点和边组成。每个节点可能包含一个删除节点的按钮。我可能还需要整个图表的一个缩小的概览图像 基线 我当前的实现是(基于我找到的示例和手册)一个单独的图表控件,它处理所有图形-边、节点、按钮、概览图像,这并不是那么不方便,因为我无论如何都不想要本机控件,还可以根据在屏幕上找到按钮的坐标来处理按钮上的所有单击事件 可供替代的

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

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

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

可供替代的 但我想知道这是否真的是正确的方法,最近我想到可能有更好的方法:比如说
类节点:public wxPanel
,在
节点中有一个按钮,而
节点的其余部分(节点颜色等)由我在
节点
背景上绘制。然后,我将许多
节点
放在
类DiagramView:public wxPanel
中的每个图节点的位置上。我还将一个
类概述:public wxControl
放在
图表视图

这意味着我只将当前可见的
节点
添加到
图表视图

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

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


几乎总是这样,没有一个最佳答案适用于所有情况。 在您的情况下,可能最好使用完整的自定义图形,尤其是在您已经实现并正在工作的情况下。否则,另一个非常重要的考虑因素是兄弟小部件的重叠,这是不允许的。也就是说,如果节点1、节点2、概述等为wxPanel-s,则它们不能重叠。不支持重叠的小部件,允许它只会表现出奇怪的行为(这将影响绘图、事件处理等)


然而,在某些情况下,组合控件最好是从较小的控件构建的,当保证不会发生任何兄弟重叠时。这里的优势之一是将组件与尺寸标注器对齐、更容易的文本操作、更少的自定义绘图(如果有的话)。

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

您需要重写基类virtuals
DoGetBestSize()
DoMoveWindow(…)

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

第二种方法是你目前正在做的事情:自己画所有的东西并关注事件。那很难


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

您可能会在wxWidgets论坛上得到更多对此的回复。