如何在 wx.Panel derived class 中重新定位带有大边框的子元素?

How to reposition children in wx.Panel derived class with a large border?

我有一个从 wx.Panel 派生的 class,它在较大的边界区域(例如左边缘超过 30 像素)创建一个图像。我希望能够为我的应用程序的一部分面板从中派生 subclasses,但我无法弄清楚如何调整派生面板中子项的位置 - 他们认为添加的边框区域是客户端 window 的一部分,并且很高兴将自己置于其下(随后被基础 class' EVT_PAINT 处理程序删除)。

我已经尝试跟踪客户区并覆盖我的基地 class 中的各种 GetClient... 方法,但它似乎并没有改变任何有关子行为的内容。我想我可以在子 classes 中手动重新定位子 windows,但这是很多重复的代码,似乎没有必要这样做。

在网上寻找答案,一直没有成功的企业。我也尝试通过 wx 代码寻找答案,但我也没有任何运气。

在 window 中定义客户区的最佳方式是什么,以便子级自动将自己定位在远离父级边缘的位置?有没有办法告诉新对象它们父级的客户区不是从 (0,0) 开始的(似乎重写 GetClientAreaOrigin 应该这样做,但似乎不起作用)?我应该在 Layout() 或 wx.EVT_SIZE 处理程序的上下文中手动移动它们吗?优雅的 and/or 合适的解决方案是什么?

经过一番努力,我放弃了这种笨拙的方法,但我确实取得了一些有限的成功,我想指出一些我学到的东西,以防其他人正在考虑它。

  1. 看看 PyPanel - 它被设计为相当广泛地被覆盖并且对我所做的大部分反应很好。

  2. 我在最初的努力中发现的最佳方法是创建一个面板实例作为控件的 child 以用作内容管理器。我在控件中重载了 AddChild 和 SetSizer 以将它们重定向到 child 面板;我还实现了一个受保护的标志,我可以在控件中设置它以防止重定向(否则我会在创建内容面板时尝试将内容面板添加到自身而不是控件)。

  3. 我仍然遇到了某些控件的一些奇怪问题(特别是 SpinCtrl 想要以非常奇怪的方式定位自己,通常部分位于内容面板之外,尽管我尽了一切努力来阻止它)。我在让 sizer 在控件的 best/minimum 大小方面表现良好也遇到了一些麻烦。

我认为我能给出的最好建议是考虑寻找其他方法来做到这一点;在我的例子中,我能够创建一个控件,该控件可以包含在一个面板中,以促进 parent; 的所需行为。 parent 例程中的钩子比我在最初的努力中创建的派生 class 的科学怪人混乱更容易管理。