文章 "在 GUI 控件中使用布局和容器: CBox 类"

 

新文章 在 GUI 控件中使用布局和容器: CBox 类已发布:

本文介绍一种基于布局和容器来创建 GUI (图形用户界面) 的替代方法, 使用一个布局管理器 — CBox 类。类 CBox class 是一个辅助控件, 在 GUI 面板里充当一个基本控件的容器。它可令图形面板设计更加简便, 并且在某些场合, 减少编写代码时间。

在大多应用里, 在对话框窗口里使用控件绝对定位的直接方式来创建图形用户界面。然而, 在某些情况下, 这种 图形用户界面 (GUI) 设计的方式很不方便, 甚或很不实际。本文介绍一种基于布局和容器来创建 GUI (图形用户界面) 的替代方法, 使用一个布局管理器 — CBox 类。

在本文中实现并使用的布局管理器大致等同于一些可在主流编程语言找到的诸如 BoxLayout (Java) 和 几何管理器包 (Python/Tkinter)。

3.1. 布局样式

CBox 有两种布局样式: 垂直样式和水平样式。

水平样式有以下基本布局:

CBox 的水平样式

图利 2. 水平样式 (居中)

垂直样式有以下基本布局:

CBox 的垂直样式

图例 3. 垂直样式 (居中)

CBox 省缺使用水平样式。

使用这两种布局的组合 (也许使用多容器), 这可以重建几乎任何类型的 GUI 面板设计。此外, 在容器内布置控件也允许分段设计。即, 它允许在给定容器里自定义控件的大小和位置, 且不影响其它容器的所在。

作者:Enrico Lambino

 

非常感谢 Enrico 的文章、CBox 和示例!非常有用。

我有一个与此无关的问题,如果我想让用户通过拖动对话框的边框来改变对话框的大小,应该添加什么?

再次感谢!

 
Amir Yacoby:

我有一个与此无关的问题,如果我想让用户通过拖动对话框的边框来改变对话框的大小,应该添加什么?

我不是很确定,但据我所知,目前还不支持这一功能。但如果可以的话就更好了,因为各个控件 和容器仍将遵循其布局,而无需进一步重新定位(例如,如果布局居中,空间将最大化,因此控件仍将保持居中)。在这种情况下,您只需覆盖类的 OnResize() 方法,再次调用主 CBox 容器的 Pack() 方法即可。
 
Enrico Lambino:
我不是很确定,但据我所知,目前还不支持这一功能。但如果能做到这一点就好了,因为各个控件和容器仍将遵循其布局,而无需进一步重新定位(例如,如果布局居中,空间将最大化,因此控件仍将保持居中)。在这种情况下,您只需覆盖类的 OnResize() 方法,再次调用主 CBox 容器的 Pack() 方法即可。
是的,看来 MT 终端不支持。干得好,再次感谢!
 

开发人员应该在标准中加入这样一个类别!

太棒了

 
微信免费体验喊单,另有盈利超过千点的QQ群:375124107,加群请备注“77”,谢谢配合
 

Layouts\Box.mqh" 文件在哪里?

我没有找到整个 "Layouts "目录。谢谢。

 
Paul Xiang:

Layouts\Box.mqh" 文件在哪里?

我没有找到整个 "Layouts "目录。谢谢。

在那篇文章的底部(此处,滚动到文章末尾:https://www.mql5.com/zh/articles/1867)
Using Layouts and Containers for GUI Controls: The CBox Class
Using Layouts and Containers for GUI Controls: The CBox Class
  • 2015.07.09
  • Enrico Lambino
  • www.mql5.com
This article presents an alternative method of GUI creation based on layouts and containers, using one layout manager — the CBox class. The CBox class is an auxiliary control that acts as a container for essential controls in a GUI panel. It can make designing graphical panels easier, and in some cases, reduce coding time.
 
非常有趣......但对于像我这样的新手来说,所有这些文件应该放在哪里呢?
 
您好。非常漂亮的类,但如果我们把 radiogroup 或checkgeoup 放在方框内,它就不会出现。
有什么办法能让它正常工作吗?
如果我保留相同的代码,但将其添加到主窗口/对话框中,我就能看到我的 radiogroup。

谢谢。
 
LucTelmosse:
您好。非常漂亮的类,但如果我们把 radiogroup 或 checkgeoup 放在方框内,它就不会出现。
有什么办法能让它正常工作吗?
如果我保留相同的代码,但将其添加到主窗口/对话框中,我就能看到我的 radiogroup。

谢谢。

您好、

显示辐射组或检查组是可能的。我的一些图形用户界面就是这样做的。也许还有其他问题,如没有添加到 CBOx 容器或容器太小。在开发过程中,我会将背景(主界面和容器)设置为某种颜色,以便更容易看到边界的位置。如果您能提供代码,至少是主对话框的 Create()函数 的代码,我可以为您提供更多帮助。