一文全面了解 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 ---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1410422.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于 Wireshark 分析 IP 协议

一、IP 协议 IP(Internet Protocol)协议是一种网络层协议,它用于在计算机网络中实现数据包的传输和路由。 IP协议的主要功能有: 1. 数据报格式:IP协议将待传输的数据分割成一个个数据包,每个数据包包含有…

android init进程启动流程

Android系统完整的启动流程 android 系统架构图 init进程的启动流程 init进程启动服务的顺序 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// immediately takes it out of the restarting state if it was in there.flags_…

JAVA面试专题-微服务篇

Spring cloud Spring Cloud 5大组件有哪些 注册中心/配置中心:nacos 负载均衡:Ribbon 服务远程调用:Feign 服务保护:sentinel 服务网关:Gateway 微服务注册和发现 nacos和eureka的区别 负载均衡 微服务向Ribbon发送…

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中,有时需要设置为“第X页共X页”这种格式,使用Word中的域功能可实现,同时,在某些情况下,可能还需要减去封面的页码,接下来为具体步…

软件标准建设体系规范过程性文档(软件开发,管理,安全,运维等各阶段全文档)

软件标准建设体系规范是确保软件开发过程标准化、高质量和可维护性的关键。它通常包括一系列文档、规范、流程和最佳实践,以确保软件项目的成功实施和交付。以下是一个软件标准建设体系规范的基本框架: 软件全套资料获取方式1:进主页。 获取…

C#描述-计算机视觉OpenCV(3):重映射

C#描述-计算机视觉OpenCV(3):重映射 前言色彩波形图像重映射 前言 C#描述-计算机视觉OpenCV(1):基础操作 C#描述-计算机视觉OpenCV(2):图像处理 在前文中,描…

【跟马少平老师学AI】-【神经网络是怎么实现的】(四)卷积神经网络

一句话归纳: 1)用1个小粒度的模式,逐个与图像的局部区域进行运算,运算结果反映模式与区域的匹配程度。 2)卷积神经网络与全连接神经网络的区别: 卷积神经网络的输出只与局部输入有连接。参数较少&#xff0…

如何将手机投屏到mac电脑

1、将iphone手机和mac电脑连接到同一个网络 2、点击电脑上的QuickTime Player 3、点击之后,这个QuickTime Player的进程就开启了 4、鼠标点到这个上面,然后右击,选择新建影片录制 5、点击这个按钮后,来到这个界面,点击…

汉王科技亮相世界数字健康论坛:以AI定义第四代血压计

作为科技行业的年度盛会,2024年中关村论坛年会于近日在北京揭幕。 作为中关村知名的人工智能企业,汉王科技携大模型的最新垂直应用、柯氏音法电子血压计等创新成果,在4月29日中关村论坛平行论坛“2024世界数字健康论坛”上亮相。 在《AI赋能血…

jupyter notebook使用与本地位置设置

本地安装好Anaconda之后,自带的有Jupter notebook。 使用jupyter notebook 使用jupyter notebook时,可以直接打开或者搜索打开: 打开后,我们生成的或者编辑的一些文件,都可以看到,如下: j…

UDP_INTRODUCTION_03:介绍 - 挂起的监听调用

测试目的: 验证当数据报到达一个没有挂起监听(LISTEN)调用的UDP端口时,UDP是否应该发送ICMP端口不可达(Port Unreachable)消息。 描述: 本测试用例旨在确保当数据报发送到DUT上一个未被监听的…

如何基于nginx组建多个子目录网站

华子目录 实验要求实验步骤 实验要求 组建多个子目录网站www.openlab.com,该网站有2个子目录www.openlab.com/sxhkt和www.openlab.com/zywww.openlab.com/sxhkt使用http读取www.openlab.com/zy使用https读取 实验步骤 准备工作 [rootserver ~]# setenforce 0[ro…

PC通过串口发送指令控制LED+串口中断

如何让单片机接收数据? 首先要打开SCON中的串行接收控制位REN。当REN1时为允许接收状态,可以接收信息。 因此令SCON 0x50; 怎么知道收到数据? 利用RI接收中断请求标志位。当串行接收到第8位结束时由内部硬件自动置为RI1&#…

Python与OpenCV:图像处理与计算机视觉实战指南

前言 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它包含了数百种计算机视觉算法,包括图像处理、视频分析、物体检测、面部识别等。结合Python语言的强大功能,OpenCV可以用于…

【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排

题目讲解 面试题 01.02. 判定是否互为字符重排 算法讲解 直观的想法:我们找到一个字符串的全排列,然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列,所以我们知道两个字符串对应的字符出现的个数相同,那么…

【Linux—进程间通信】共享内存的原理、创建及使用

什么是共享内存 共享内存是一种计算机编程中的技术,它允许多个进程访问同一块内存区域,以此作为进程间通信(IPC, Inter-Process Communication)的一种方式。这种方式相对于管道、套接字等通信手段,具有更高的效率&…

<2024年5月软考高项极限冲刺>《2 考试知识块》

🪸🪸把你所学串起来,欢迎订阅。🪸🪸 每章附独家脑图,原图。 冲刺 冲刺 冲刺 1 看下面的图,让你知道你要学习的全部知识是什么 2 章节解析 我们考试的重点是项目管理知识,但是因…

Python零基础-上【详细】

目录 一、Python简介 1、Python发展史 2、Python理解 3、Python的优缺点 (1)优点 (2)缺点 二、Python开发环境搭建 1、环境搭建 2、尝试写一个基础程序 (1)调整配置 (2)新…

sunshine+n2n+moonlight串流远程控制全教程

远程主机说明(两台电脑不在同一局域网下): 控制台电脑 被控制电脑 所有工具下载地址:https://www.lanzouw.com/b00eepod7e 密码:1234 一、首先NTN组网 使用NTN技术创建虚拟局域网,实现设备之间的P2P连接。 NTN组网…