一文全面了解 wxWidgets 布局器(Sizers)

2024-05-03 01:52

本文主要是介绍一文全面了解 wxWidgets 布局器(Sizers),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

Sizers背后的理念

共同特征

最小大小

边框

对齐方式

伸缩因子

使用 Sizer 隐藏控件

wxBoxSizer

wxStaticBoxSizer

wxGridSizer

wxFlexGridSizer


布局器(Sizers),由wxWidgets类层次结构中的wxSizer类及其派生类表示,已成为wxWidgets中定义对话框控件布局的首选方法。这是因为它们能够创建视觉上吸引人的对话框,而不受平台限制,同时考虑到各个控件的大小和样式差异。

本文将描述和展示使用sizers可以做什么。随后的部分将简要介绍如何使用单独的sizer类进行编程。

关于能够描述基于sizer的对话框的wxWidgets资源系统的信息,请参阅基于XML的资源系统(XRC)。

另请参阅:wxSizerwxBoxSizerwxStaticBoxSizerwxStdDialogButtonSizerwxWrapSizerwxGridSizerwxFlexGridSizerwxGridBagSizer

Sizers背后的理念

wxWidgets中Sizers使用的布局算法与其他GUI工具包(如Java的AWT、GTK工具包或Qt工具包)中的布局系统密切相关。它基于单个子窗口报告其所需的最小大小以及如果父窗口大小发生变化时它们能够伸展的能力。这通常意味着程序员不需要设置对话框的初始大小,而是将sizer分配给对话框,并查询这个sizer以获得推荐的大小。反过来,这个sizer将查询其子元素(可以是普通的窗口、空白空间或其他sizer),以便构建sizer的层次结构。请注意,wxSizer不是从wxWindow派生的,因此不会干扰标签顺序,与屏幕上的真实窗口相比,它所需的资源非常少。

使得sizer在wxWidgets中如此适合使用的事实是,每个控件都报告自己的最小大小,并且该算法可以毫无问题地处理不同平台上字体大小或不同窗口(对话框项)大小之间的差异。例如,如果Linux/GTK小部件的标准字体和整体设计需要比Windows更多的空间,那么在Linux/GTK上的初始对话框大小将自动比Windows上的大。

目前,wxWidgets中有七种不同类型的sizer可用。每一种都代表了在对话框中以某种方式布局对话框项,或者完成特殊任务,如将一个静态框包装在对话框项(或另一个sizer)周围。这些sizer将在下面的文本中逐一讨论。有关如何使用sizer进行编程的更多详细信息,请参阅wxBoxSizer部分。

共同特征

所有sizer都是容器,即它们用于布局一个对话框项(或几个对话框项),这些项包含在sizer中。这些项有时被称为sizer的子项。无论各个sizer如何布局其子项,所有子项都有某些共同的特征:

最小大小

这个最小大小通常与控件的初始大小相同,可以在控件构造函数的wxSize字段中明确设置,或者由wxWidgets计算得出,通常是通过将项目的高度和/或宽度设置为-1。请注意,只有一些控件可以计算其大小(如复选框),而其他控件(如列表框)没有自然的宽度或高度,因此需要明确指定大小。有些控件可以计算其高度,但不能计算其宽度(例如单行文本控件):

边框

边框只是空白空间,用于在对话框中分隔对话框项。这个边框可以是全方位的,也可以是任何组合的一侧,例如仅位于控件的上方和下方。这个边框的厚度必须明确设置,通常是5个点。以下示例展示了只有一个对话框项(一个按钮)以及围绕按钮的0、5和10像素的边框:

对齐方式

通常,对话框项会被分配比其最小大小加上边框更多的空间。根据用于相应对话框项的标志,对话框项可以填充所有可用空间,即它会增长到比最小大小更大的尺寸,或者它会移动到可用空间的中心或空间的任一侧。以下示例展示了水平盒子sizer中的一个列表框和三个按钮;一个按钮居中对齐,一个顶部对齐,一个底部对齐:

伸缩因子

如果sizer包含多个子项,并且被提供的空间多于其子项和它们的边框所需的空间,就会出现如何在子项之间分配剩余空间的问题。为此,可以为每个子项分配一个伸缩因子,其中默认值为0表示子项不会获得比其请求的最小大小更多的空间。大于零的值是根据相应sizer子项中所有伸缩因子的总和来解释的,即如果两个子项都获得伸缩因子1,它们将各自获得一半的额外空间,无论一个控件的最小尺寸是否比另一个差。以下示例展示了一个包含三个按钮的对话框,第一个按钮的伸缩因子为1,因此会拉伸,而其他两个按钮的伸缩因子为0,保持其初始宽度:

使用 Sizer 隐藏控件

你可以使用 wxWindow::Show() 方法来隐藏 sizer 中的控件,就像隐藏任何其他控件一样。然而,wxSizer 也提供了一个独立的方法,可以告诉 sizer 在其大小计算中不考虑该控件。要使用 sizer 隐藏窗口,请调用 wxSizer::Show()。然后,你必须调用 sizer 上的 Layout 方法来强制更新。

这在隐藏界面部分时很有用,因为你可以避免从 sizer 中移除控件并稍后重新添加它们。

注意:这仅由 wxBoxSizer 和 wxFlexGridSizer 支持。

wxBoxSizer

wxBoxSizer 可以根据其构造函数中使用的标志将其子项垂直或水平排列。当使用垂直 sizer 时,每个子项可以居中对齐、右对齐或左对齐。相应地,当使用水平 sizer 时,每个子项可以居中对齐、底部对齐或顶部对齐。上一节中描述的伸缩因子用于主要方向,即当使用水平 box sizer 时,伸缩因子决定了子项可以水平拉伸多少。以下示例展示了与上一个示例相同的对话框,但 box sizer 现在是一个垂直 box sizer:

wxStaticBoxSizer

wxStaticBoxSizer 与 wxBoxSizer 相同,但周围有一个静态框。以下是一个示例:

wxGridSizer

wxGridSizer 是一个二维 sizer。所有子项都被赋予相同的大小,这是由最大的子项所需的最小大小决定的,在这种情况下是左下角边框中的文本控件。列数或行数中的任何一个是固定的,如果添加了新的子项,网格 sizer 将在相应的另一个方向上增长:

wxFlexGridSizer

wxFlexGridSizer 是从 wxGridSizer 派生出的二维 sizer。每列的宽度和每行的高度都是根据各自最大子项的最小要求单独计算的。此外,如果 sizer 被分配了一个与其请求的大小不同的尺寸,可以声明列和行是可伸缩的。以下示例显示了与上面相同的对话框,但使用了 flex 网格 sizer:

--- END ---

这篇关于一文全面了解 wxWidgets 布局器(Sizers)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955586

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

Apache Tiles 布局管理器

陈科肇 =========== 1.简介 一个免费的开源模板框架现代Java应用程序。  基于该复合图案它是建立以简化的用户界面的开发。 对于复杂的网站,它仍然最简单,最优雅的方式来一起工作的任何MVC技术。 Tiles允许作者定义页面片段可被组装成在运行一个完整的网页。  这些片段,或Tiles,可以用于为了降低公共页面元素的重复,简单地包括或嵌入在其它瓦片,制定了一系列可重复使用

C++第四十七弹---深入理解异常机制:try, catch, throw全面解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】 目录 1.C语言传统的处理错误的方式 2.C++异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3 异常安全 3.4 异常规范 4.自定义异常体系 5.C++标准库的异常体系 1.C语言传统的处理错误的方式 传统的错误处理机制: