gpt4 book ai didi

c++ - wxWidgets 中的嵌套自定义控件

转载 作者:行者123 更新时间:2023-11-30 03:20:00 24 4
gpt4 key购买 nike

背景

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

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

基线

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

备选

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

这意味着我只将那些 Node 添加到当时可见的 DiagramView

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

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

enter image description here

最佳答案

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

您需要覆盖基类虚函数 DoGetBestSize()DoMoveWindow(...)

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

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

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

关于c++ - wxWidgets 中的嵌套自定义控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53194528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com