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

news2024/12/24 9:04:42

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

窗口布局基础

为了在各种环境中都能使窗口拥有合适的位置和大小,可能需要在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.coloradmin.cn/o/772415.html

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

相关文章

创新创业项目申报管理系统vue+nodejs+mysql

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 本站是一个B/S模式系统,采用nodejs框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界…

详解UDP协议

在讲本篇文章之前,给读者介绍两个指令 1.netstat:用来查看网络状态的重要工具 语法:netstat [选项] n 拒绝显示别名,能显示数字的全部转化成数字l 仅列出有在 Listen (监听) 的服務状态p 显示建立相关链接的程序名t (tcp)仅显示tcp相关选项…

JDK、JRE、JVM之间的关系是什么?

目录 JVM、JRE、JDK的关系? JDK、JRE、JVM都是什么? JVM JRE JDK JVM、JRE、JDK的关系? 三者包含关系: JDK>JRE>JVM JDK、JRE、JVM都是什么? jdk:是用于java开发的最小环境 包括:ja…

C++牛客WebServer项目学习笔记一

1.Linux系统命令: sudo apt install softname # sudo 管理员权限;apt 安装软件命令;ps -ef | grep ssh # ps 查看进程命令;| 管道符;grep 过滤出(过滤出ssh关键词); 3.Ctrl滚动鼠标…

抓 https 报文新方案 -Magisk+LSPosed,来试试吧

关于如何抓取Android端https报文,在之前一篇文章中有介绍可以通过VitualXposedJustTrustMe模块禁用SSL验证,这样可以抓取到https,还是有一些同学反馈以下的一些问题: App在低版本的Android上不兼容,需要用高版本的And…

leetcode:1470. 重新排列数组(python3解法)

难度:简单 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。 请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。 示例 1: 输入:nums [2,5,1,3,4…

SQL-每日一题【607.销售员】

题目 表: SalesPerson 表: Company 表: Orders 编写一个SQL查询,报告没有任何与名为 “RED” 的公司相关的订单的所有销售人员的姓名。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例: 解题思路 1.我们可以用子查询来解决这道题,…

Tabby - 本地化AI代码自动补全 - Windows10

参考: https://github.com/TabbyML/tabby 安装winget,方便命令行安装git 微软商店,搜索winget,安装App Installer PS C:\Windows\system32> winget install --id Git.Git -e --source winget Found Git [Git.Git] Version 2…

旅游卡加盟代理合伙人模式软件开发

旅游卡加盟代理合伙人模式是近年来逐渐兴起的一种旅游产业发展模式,它通过将旅游卡加盟商与代理商紧密结合,实现资源共享、风险共担、合作共赢的目标。而软件开发作为旅游卡加盟代理合伙人模式的重要技术支持,对于该模式的实施和发展起着至关…

Prometheus节点监控及hadoop集群监控

话不多说,先看效果 1.监控组件Prometheus 1.1上传Prometheus包 [root@bigdb01 ~]# rsync root@172.16.1.247/data/fan/install/native/09.prometheus/jmx_prometheus_javaagent-0.19.0.jar /opt/software/1.2 解压 [root@bigdb01 ~]# mkdir /opt/module/monitoring [roo…

金融银行测试面试题:网上银行转账是怎么测的?

前言 这段时间收到好多粉丝的留言说想求一份金融银行相关的测试面试题,所以我花了不少时间给大家整理了一份,今天分享给需要的朋友们,也希望对你们有所帮助。 1、网上银行转账是怎么测的,设计一下测试用例。 回答思路&#xff1…

【Vue】day02-Vue基础入门

目录 day02 一、今日学习目标 1.指令补充 2.computed计算属性 3.watch侦听器 4.综合案例 (演示) 二、指令修饰符 1.什么是指令修饰符? 2.按键修饰符 3.v-model修饰符 4.事件修饰符 三、v-bind对样式控制的增强-操作class 1.语法…

目标检测数据集标注工具Labelimg安装与使用

一、labelimg是什么 labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,其注释以 PASCAL VOC格式保存为XML文件,这是ImageNet使用的格式。此外,它还支持 COCO数据集格式。 二、安装labelimg 打开cmd并输入以下命令 …

微信小程序导入微信地址

获取用户收货地址。调起用户编辑收货地址原生界面,并在编辑完成后返回用户选择的地址。 1:原生微信小程序接口使用API:wx.chooseAddress(OBJECT) wx.chooseAddress({success (res) {console.log(res.userName)console.log(res.postalCode)c…

【计算机视觉】DINOv2(视觉大模型)代码使用和测试(完整的源代码)

文章目录 一、环境部署二、导入原图2.1 使用vit_s14的模型 三、使用其他模型3.1 使用vit_b14的模型3.2 使用vit_l14的模型3.3 使用vit_g14的模型 一、环境部署 !git clone https://ghproxy.com/https://github.com/facebookresearch/dinov2.git输出为: Cloning in…

OpenCv之图像轮廓(二)

目录 一、多边形逼近 二、凸包 三、最小外接矩形与最大外接矩形 一、多边形逼近 参照函数: approxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(DP) DP算法原理比较简单,核心就是不断找多边形最远的点加入形成新的多边形,直…

go环境下载github文件显示timeout解决方法

1、问题背景 go环境正常,需要去github拉取一个资源进行编译 go build -v -o naabu cmd/naabu/main.go 编译过程中报错如下: pkg/runner/runner.go:19:2: github.com/miekg/dnsv1.1.53: Get "https://proxy.golang.org/github.com/miekg/dns/v/v1.1.53.zip&q…

Git 使用笔记

Git使用笔记 1 版本控制 1.1 什么是版本控制 ​ 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单说就是用…

C#使用Linq和Loop计算集合的平均值、方差【标准差】

方差【标准差】 标准差公式是一种数学公式。标准差也被称为标准偏差,或者实验标准差,公式如下所示: 样本标准差方差的算术平方根ssqrt(((x1-x)^2 (x2-x)^2 ......(xn-x)^2)/n) 总体标准差σsqrt(((x1-x)^2 (x2-x)^2 ......(xn-x)^2)/n ) …

准备WebUI自动化测试面试?这30个问题你必须掌握(二)

本文共有11000字,包含了后十五个问题,如需要前十五个问题,可查看文末链接~ 16. 在WebUI自动化测试中,你如何处理验证码或图像识别的问题? 1. 人工识别:一种简单但费时费力的方法是使用人工手动识别验证码。…