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

这篇具有很好参考价值的文章主要介绍了【wxWidgets】使用布局控件进行窗口布局。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

窗口布局基础

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

窗口布局控件

和QT十分类似,窗口布局控件可以询问窗口需要的合适大小
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++
图中使用了垂直布局和水平布局将控件放置到合适的位置

布局控件的通用特征

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

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

使用布局控件进行编程

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

使用wxBoxSizer进行编程

wxBoxSizer可以将容器子元素进行横向或者纵向的排列,以及指定对齐方向
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++
使用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,即为左对齐上对齐
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++
第四个参数指定边界间隔的大小
也可以直接增加一段空白:

//增加一段空白旧方法
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函数用法相同
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++

使用wxGridSizer编程

wxGridSizer布局控件可以以二维表的方式排列子元素,每个表格大小都是相同的,等于最长的表格的长度和高度,创建一个wxGridSizer需要指定行数和列数,以及行间距和列间距
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++

使用wxFlexGridSizer编程

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

使用wxGridBagSizer编程

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

更多关于布局的话题

对话框单位

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

平台自适应布局

不同平台风格存在不同,要做到不同平台上按钮顺序的自适应,需要使用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函数以便布局控件调整按钮的顺序:
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++
2.或者可以使用wxDialog::CreateButtonSizer函数,基于一些按钮标记的列表来自动创建平台自适应的按钮,并将其放在布局控件中
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++
【wxWidgets】使用布局控件进行窗口布局,wxWidgets,开发语言,c++

动态布局

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

到了这里,关于【wxWidgets】使用布局控件进行窗口布局的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ Qt 学习(二):常用控件使用与界面布局

    ui 设计器设计界面很方便,为什么还要手写代码? 更好的控制布局 更好的设置 qss 代码复用 完全不会写 Qt 布局,很麻烦,怎么学会手写布局? 看 Qt 自己怎么写 改良 Qt 的布局写法 1.1 水平布局 addWidget() 在布局里添加一个控件 addLayout() 在布局里添加子布局 setMargin() 设置水平

    2024年02月06日
    浏览(42)
  • 安卓开发——控件AlertDialog实现方式,设置下部三个按钮,自定义布局设置.setView(dialogView)样式,控件PopupWindow1常用方法,showAsDropDown构造方法

     AlertDialog . Builder builder = new AlertDialog . Builder ( context ); 构建 Dialog 的各种参数  Builder . setlcon ( int iconld ); 添加 ICON   Builder . setTitle ( CharSequence title ); 添加标题  Builder . setMessage ( CharSequence message ); 添加消息  Builder . setView ( View view ); 设置自定义布

    2024年02月03日
    浏览(36)
  • 使用Go语言进行安卓开发

    本文将介绍如何使用Go语言进行安卓开发。我们将探讨使用Go语言进行安卓开发的优点、准备工作、基本概念和示例代码。通过本文的学习,你将了解如何使用Go语言构建高效的安卓应用程序。 随着移动互联网的快速发展,安卓应用程序的需求越来越旺盛。使用传统的Java和K

    2024年02月06日
    浏览(35)
  • Compose布局之Image控件使用详解:加载网络图片与内容缩放

    本文详细介绍了Compose框架中Image控件的基础使用,包括加载网络图片、contentScale内容缩放等高级功能,帮助开发者更好地掌握Compose布局中的图片展示技巧。

    2024年02月11日
    浏览(93)
  • 五个使用Delphi语言进行开发的案例

    案例一:学生信息管理系统 某学校需要开发一个学生信息管理系统,用于记录学生的基本信息、成绩和考勤情况等。开发者使用Delphi语言进行开发,设计了一个包含多个窗体的应用程序。主窗体用于展示学生的列表和基本信息,其他窗体则用于编辑学生信息、查看成绩和考勤

    2024年02月22日
    浏览(28)
  • JavaFX入门和网格布局面板的使用,Dao层交互,舞台与场景切换以及其他控件的使用

    网格布局 将整个面板划分为若干个格子 , 每个格子的大小是一样的 , 每个格子中可以放置一个控件(布局) , 类似于表格的方式。在网格布局 中放入控件的时候 , 还需要指定位置。 我们将要排出这个布局 , 也就是登陆页面的优化版本 位置原理讲解 以网格布局的思维来拆分

    2024年02月04日
    浏览(32)
  • UniApp项目中 使用微信小程序原生语言 进行开发

    wxcomponents 下放的是微信小程序原生代码写的组件。我进行了封装 在你下uniApp 项目的根目录创建一个 wxcomponents 名字千万不要错 京东、支付宝灯参考下面图片 官方文档也有介绍 然后在你需要引入原生功能的页面里面引入你的组件(我这里提前已经放过来了。在上面图可看到

    2024年02月04日
    浏览(42)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理

    在我们窗口新增、编辑状态下的时候,我们往往会根据是否修改过的痕迹-也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时候,可以避免用户不小心关掉窗口,导致窗口的数

    2024年02月08日
    浏览(45)
  • 面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

    源自网络收集,仅供参考 实验三收集到两份完整报告,这是其一,另一份见本专栏下一篇文章。 《面向对象程序设计》 实验三 实验题目:子窗口与控件的基本用法、资源的使用 整体目的:理解、窗口之间的消息传送、调用栈;掌握光标、图标、菜单的制作和使用方式;掌

    2024年02月07日
    浏览(32)
  • 【UE5】蓝图UI控件菜单锚(Menu Anchor)的使用与浮动详情窗口的制作

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近在做毕设,一直在苦恼要怎么精准地把浮动的详情窗口放在图标的一边,就比如下图中的效果 本来也有想过直接获取控件在屏幕上的位置来计算浮动窗口的生成位置,但神奇的是蓝图似乎没有这个

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包