【wxWidgets】使用布局控件进行窗口布局

使用布局控件进行窗口布局

窗口布局基础

为了在各种环境中都能使窗口拥有合适的位置和大小,可能需要在OnSize事件中计算每一个窗口的大小并设置新位置,当然使用窗口布局控件可以更方便地实现
如果选择使用布局控件,可以通过自己编写或者使用工具来创建,也可以使用XRC文件布局的定义保存在一个xml文件中,可以被应用程序动态加载,也可以通过wxrc工具将其编译成C++源文件

窗口布局控件

和QT十分类似,窗口布局控件可以询问窗口需要的合适大小
在这里插入图片描述
图中使用了垂直布局和水平布局将控件放置到合适的位置

布局控件的通用特征

所有的布局控件都是容器,不管怎样排放子元素,必然有以下通用的特征

  • 最小大小:布局控件中的每个元素都有计算自己最小大小的能力,但是对于类似列表框这样的控件,必须清晰的指明大小,因为它们没有自然大小
  • 边界:每个元素都应该有一个边界,边界的最小大小必须被显式地指定
  • 对齐方式:每个元素都可以以居中或对齐某个边的方式放置,对齐可以为水平或垂直
  • 伸缩因子:如果一个布局控件的空间大于它所有子元素需要的空间,可以指定元素的伸缩因子分割多余的空间

使用布局控件进行编程

首先创建一个顶层布局控件,使用wxWindow::SetSizer函数将它和顶层窗口绑定,可以在顶层布局控件中放置窗口或其他控件元素,如果想顶层窗口的大小适合所有控件需要的大小,可以调用wxSizer::Fit函数,想顶层窗口在执行过程中不小于初始尺寸,可以使用wxSizer::SetHints函数
除了依次调用上面三个函数,可以直接通过调用wxWindow::SetSizerAndFit函数来达到同样效果
如果在frame窗口里使用了panel,只使用了一个panel,所有其他的窗口和控件都是panel的子窗口,那么已经知道了怎么将这个panel合适地放置在frame上了,只需要对panel子窗口使用布局控件。如果frame窗口中有多个panel,首先不得不为frame绑定一个布局控件对panel进行布局,然后再在panel子窗口中进行布局

使用wxBoxSizer进行编程

wxBoxSizer可以将容器子元素进行横向或者纵向的排列,以及指定对齐方向
在这里插入图片描述
使用wxBoxSizer的Add方法增加子元素:

//增加窗口
void Add(wxWindow *window, int stretch = 0, int flags = 0, int border = 0);
//增加布局控件
void Add(wxSizer *window, int stretch = 0, int flags = 0, int border = 0);

第一个参数是增加的窗口或布局控件
第二个参数是缩放因子
第三个参数是比特位列表,指示子元素的对齐和边界行为,默认的值为wxALIGN_LEFT|wxALIGN_TOP,即为左对齐上对齐
在这里插入图片描述
第四个参数指定边界间隔的大小
也可以直接增加一段空白:

//增加一段空白旧方法
void Add(int width, int height, int stretch = 0, int flags = 0, int border = 0);
//增加一段固定大小的空白
void AddSpacer(int size);
//增加一个可缩放的空白
void AddStretchSpacer(int stretch = 1);

第二种方法相当于调用Add(size, size, 0);
第三种方法相当于调用Add(0, 0, stretch)

使用wxStaticBoxSizer编程

wxStaticBoxSizer继承自wxBoxSizer布局控件,除了wxBoxSizer的功能,还在整个布局以外增加了一个静态边框wxStaticBox,这个wxStaticBox需要手动创建后作为参数传入wxStaticBoxSizer构造函数,Add函数与wxBoxSizer的Add函数用法相同
在这里插入图片描述

使用wxGridSizer编程

wxGridSizer布局控件可以以二维表的方式排列子元素,每个表格大小都是相同的,等于最长的表格的长度和高度,创建一个wxGridSizer需要指定行数和列数,以及行间距和列间距
在这里插入图片描述

使用wxFlexGridSizer编程

wxFlexGridSizer采用二维表进行布局,和wxGridSizer不同,不要求所有的表格大小一样,只要求同一列上所有表格宽度是相同的,同一行上所有表格高度是相同的,还可以给行和列指定是否缩放,当整个布局控件大小发生变化时,可以指定某些行或者列随着整个布局控件的缩放而缩放
wxFlexGridSizer可以指定行数,列数额外的垂直间距和水平间距,调用Add函数的方法和wxBoxSizer相同
初始情况看不出第一列可以改变大小的效果,改变对话框的水平方向大小可以在第一列占用额外增加的空间,并且第一列的子元素也居中显示
在这里插入图片描述

使用wxGridBagSizer编程

模拟现实世界中的固定位置和大小的基于布局控件的布局,将子元素按照一个虚拟的网格进行排序,子元素的位置是通过wxGBPosition对象指定的,对象大小使用wxGBSpan指定,对象的大小不仅限于一个网格
创建wxGridBagSizer的可选参数包括垂直和水平方向的间隔,Add函数需要提供的参数包括子元素的位置和大小,另外的可选标记和边框大小参数的意义和wxBoxSizer是一样的
在这里插入图片描述

更多关于布局的话题

对话框单位

尽管布局控件可以让基本控件的大小随着平台进行相应的改变,但是有些情况下,还是需要手动指定控件的大小,如果希望手动指定的大小也随着平台变化,应该使用对话框单位来代替像素单位

平台自适应布局

不同平台风格存在不同,要做到不同平台上按钮顺序的自适应,需要使用wxStdDialogButtonSizer布局控件,这个控件继承自wxBoxSizer
这个布局控件构造函数没有参数,要增加按钮可以使用两种方法:
1.传递按钮指针给AddButton函数,或者使用SetAffirmativeButton,SetNegativeButton,and SetCancelButton来设置按钮的特征,如果使用AddButton,那么按钮应使用下面的这些标识符:wxID_OK,wxID_YES,wxID_CANCEL,wxID_NO,wxID_SAVE,wxID_APPLY,wxID_HELP和wxID_CONTEXT_HELP,在所有按钮都增加到布局控件以后,调用Realize函数以便布局控件调整按钮的顺序:
在这里插入图片描述
在这里插入图片描述
2.或者可以使用wxDialog::CreateButtonSizer函数,基于一些按钮标记的列表来自动创建平台自适应的按钮,并将其放在布局控件中
在这里插入图片描述
在这里插入图片描述

动态布局

当需要动态更改对话框的布局时,比如按钮按下的时候显示更多的选项,可以使用平常的办法,调用wxWindow::Show函数来隐藏某个控件,不过wxSizer也提供了一个单独的方法,可以使用wxSizer::Show函数并且传递false函数,告诉wxSizer不要计算其中的窗口大小,调用这个函数需要使用wxSizer::Layout函数来强制更新对应的窗口

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【汉诺塔问题分析】

一、背景 汉诺塔问题是一种经典的递归问题,它由法国数学家Huygens在1665年发现,也是一道有趣的数学难题。这道问题的主要目的是将三根柱子上的一堆盘子移动到另一根柱子上,移动过程中每次只能移动一个盘子,并且大盘子不能放在小盘…

[QT编程系列-10]:C++图形用户界面编程,QT框架快速入门培训 - 4- QT画图与动画

目录 4. QT画图与动画 4.1 QT的绘图系统 4.2 案例目标 4.3 绘制过程 4.4 更换控件的icon 4.5 案例2 4.6 坐标轴 4. QT画图与动画 4.1 QT的绘图系统 QT(也称为Qt Framework)是一种流行的跨平台应用程序开发框架,它提供了丰富的图形用户…

集群基础1——集群概念、LVS负载均衡

文章目录 一、基本了解二、LVS负载均衡2.1 基本了解2.2 工作模式2.2.1 NAT模式2.2.2 DR模式2.2.3 LVS-TUN模式2.2.4 LVS-FULLNAT模式 三、调度器算法四、ipvsadm命令 一、基本了解 什么是集群? 多台服务器做同一件事情。 集群扩展方式: scale up&#xf…

2023年7月北京/广州/深圳制造业产品经理NPDP认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

C# 移除链表元素

203 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2&#x…

PostgreSQL

一、基本使用 1. 交互式终端psql 连接至数据库&#xff1a; psql -h <ip地址> -p <端口号>\d&#xff1a;查看所有表\d 表名&#xff1a;查看表结构\timing&#xff1a;显示SQL语句执行时间 2. 表空间的使用 如果需要把不同的表放在不同的存储介质或不同的文件…

2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?

2023-07-14&#xff1a;讲一讲Kafka与RocketMQ中存储设计的异同&#xff1f; 答案2023-07-14&#xff1a; 在Kafka中&#xff0c;文件的布局采用了Topic/Partition的方式&#xff0c;每个分区对应一个物理文件夹&#xff0c;且在分区文件级别上实现了顺序写入。然而&#xff0…

WIN无法访问linux开启的SAMBA服务器

WIN无法访问linux开启的SAMBA服务器 打开搜索框“管理Windows凭据” 点击编辑

TCP/IP网络编程 第十七章:优于select的epoll

epoll理解及应用 select复用方法其实由来已久&#xff0c;因此&#xff0c;利用该技术后&#xff0c;无论如何优化程序性能也无法同时接入上百个客户端&#xff08;当然&#xff0c;硬件性能不同&#xff0c;差别也很大)。这种select方式并不适合以Web服务器端开发为主流的现代…

Camtasia Studio 2023保存为mp4格式的视频的详细教程,Camtasia的视频导出功能

很多用户刚接触Camtasia Studio&#xff0c;不熟悉如何保存mp4格式的视频。在今天的文章中小编为大家带来了Camtasia Studio 2023保存为mp4格式的视频的详细教程介绍。 1、 打开Camtasia Studio。 Camtasia Studio- 2023 win&#xff1a; https://souurl.cn/1JFEsn Camtasia …

06_本地方法接口+07_本地方法栈

一、本地方法&#xff1f; 本地方法就是Java调用非Java代码的接口。 本地方法的作用是融合不同的编程语言为Java所用&#xff0c;它的初衷是融合 C、C程序 二、为什么要使用Native Method? 三、本地方法栈 Java虚拟机栈用于管理Java方法的调用&#xff0c;而本地方法栈用于…

【Linux】Docker 基本管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Docker 基本管理 Docker 概述Docker 核心概念Docker 安装部署Docker 镜像操作Docker 容器操作 Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵…

python爬虫中通用的两种乱码解决方式(自用)

问题&#xff1a;在python爬虫爬取的时候&#xff0c;我们有时会遇到诸如以下的乱码&#xff1a; &#xfffd;װŮ&#xfffd;&#xfffd; &#xfffd;&#xfffd;Ů ˮ СϪ Ψ&#xfffd;&#xfffd;¡4k解决方法一&#xff1a;用utf-8来转码&#xff0c;具…

spring复习:(40)全注解的spring AOP

零、需要的依赖&#xff1a; <dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.9</version></dependency><dependency><groupId>org.aspectj</groupId><arti…

AHB协议理解

从小父亲就教育我&#xff0c;做一个对社会有用的人&#xff01; 目录 Chapter1 AHB Block Diagram Ginput signal lnput signals Output Signal Chapter3 Transfers AHB接口Overview Chapter6 Data Buses HWDATA HRDATA Chapter1 Introduction AHB: Advanced High-performanc…

QT写文件操作

在Qt中&#xff0c;可以使用QTextStream类来按照指定的格式将数据写入文件。以下是按照格式写入文件的一个示例&#xff1a; #include <QFile> #include <QTextStream>int main() {QString fileName "output.txt";QFile file(fileName);if (!file.open…

奇迹MU架设教程:SQL Server 2008数据库的安装教程

不管是搭建什么游戏&#xff0c;都是有数据库的&#xff0c;奇迹MU用的是SQL 数据库&#xff0c;根据服务器系统选择SQL server版本&#xff0c;我比较喜欢用Windows server 2008R2系统&#xff0c;所以我安装的是SQL server 2008。作为架设奇迹很重要的数据库程序&#xff0c;…

【Ubuntu】安装docker-compose

要在Ubuntu上安装Docker Compose&#xff0c;可以按照以下步骤进行操作&#xff1a; 下载 Docker Compose 二进制文件&#xff1a; sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/loc…

Modbus-TCP数据问询解析-小记

调试代码 a00 23 00 00 00 05 01 03 02 00 64 aa.replace(" ","") alen(a) print(a)b3d650000000b011000570002044203a800 print(len(b))c01 10 00 57 00 02 04 42 03 68 00 cc.replace(" ","") clen(c) print(c)运行结果&#xff1…

Docker操作

Docker操作 Docker基本操作 # 删除 docker 容器 docker rm 关键字&#xff08;名字、容器ID&#xff09; # 删除docker所有容器 docker ps -a -q | xargs docker rm docker rm -f $(docker ps -qa) # 删除 docker镜像 docker rmi 关键字&#xff08;名字、容器ID&#xff…