当前位置: 首页 > news >正文

在CodeBolcks下wxSmith的C++编程教程——使用wxPanel资源

欢迎来到 wxSmith 教程页面!wxSmith 与 Code::Blocks、wxWidgets 和 C++ 编译器相结合,为您提供一种所见即所得的方式来创建具有图形用户界面 (GUI) 的应用程序。该组合形成了一个用于快速应用程序开发 (RAD) 的工具,可在 Linux、Mac OS X 和 Windows 上运行。当您工作时,您会在屏幕上看到您正在设计的表单;他们看着你,就像他们看着你的程序的用户一样。
这些教程假设您是Code::Blocks 或 wxWidgets 的初学者,事实上,它们也是学习它们的好教程;假设您对 C++ 有基本的了解,您能够看懂教程中的C++实例代码。
这套教程的其他文章可以从以下文章中找到:

在CodeBolcks下wxSmith的C++编程教程——wxSmith教程目录(序言) - lexyao - 博客园

编写这篇文章参照了Code::Blocks 用户文档中wxSmith教程的以下文章:

WxSmith tutorial: Using wxPanel resources - Code::Blocks

在这篇文章中你将看到以下内容:

  1. 使用 wxPanel 资源
  2. 创建我们的游乐场
  3. 使用“自定义”项添加 wxPanel
  4. 通过标准 wxPanel 添加自定义面板
  5. 结束语

1.使用 wxPanel 资源

后续教程不依赖于此教程。如果您发现它令人困惑或与您的需求无关,您可以跳到下一个,而不会失去连续性。
不影响后续的学习并不是说这里提供的方法没有意义,事实上,这篇文章提供了一种非常有用的方法,特别是遇到以下情况时:

  • 当你发现现有的组件不能满足你的需求而你又有能力扩展现有组件功能的时候。
  • 当你的界面中有多出重复使用相同的组件组合的时候。

这篇教程讲的是wxPanel组件,但这里提供的方法不限于wxPanel组件。就像是我们为了保存一个类的实例而定义这个类的祖先类型的变量一样。

在某些情况下,必须将一个资源拆分为几个较小的部分。这样的拆分提供了一些优点:它有助于多人处理同一个项目,它可以让你更清楚地了解真正复杂的资源,并且它可能有助于在一个窗口中有多个功能的情况下划分逻辑部分的源代码。在本教程中,我将向您展示如何创建此类资源。

2.创建我们的游乐场

wxPanel 资源不能作为独立的项目存在 —— 它们必须放置在框架或对话框中。我们可以使用在向导中创建的主要资源。假设您已经阅读了前面的教程,那么创建一个简单的窗口对您来说应该不是什么大问题:)。

让我们从这样的开始:创建一个新的项目tu05,主界面框架如下图所示。

image

 

3.使用“自定义”项添加 wxPanel

3.1 创建 wxPanel 资源

在本教程中,我将向您展示在另一个资源中嵌入外部 wxPanel 的两种方法。 第一个使用“自定义”项目,可用于添加 wxSmith 不知道的任何类型的资源。

因此,让我们使用 Code::Blocks 主菜单上的 wxSmith 项创建 wxPanel 资源,资源的名称命名为InternalPanel。请注意,使用此嵌入方法会影响资源的初始配置。 我们希望面板的 id、大小和位置由父资源控制,因此请确保将它们添加到面板的构造函数中:

image

 现在让我们在面板中添加一些内容:

image

3.2 添加InternalPanel到主窗口中

3.2.1 向主窗口添加自定义项

 最后一步是在主窗口中添加“自定义”项目并正确配置。自定义图标是“标准调色板”中的最后一个图标(Code::Blocks 25.03中位于“标准”页的第一个图标),由此图标标识:

image

wechat_2025-09-24_222814_589 

 一个新项目将显示为一个黑色方块,顶部有三个问号。让我们稍微调整一下它的大小:

image

上面是早期版本的 Code::Blocks 中的截图,在 Code::Blocks 25.03中的截图如下: 

wechat_2025-09-24_223747_734 
其中的CustomClass对应着属性浏览器中Class name属性的值。

现在我们需要在属性浏览器中调整自定义项的属性。

3.2.2 调整自定义项的Creating code属性

我们首先要调整的是“Creating code”属性。顾名思义,在这里我们将能够调整 wxSmith 添加负责创建此项目的代码的方式。默认值为:

$(THIS) = new $(CLASS)($(PARENT),$(ID),$(POS),$(SIZE),$(STYLE),$(VALIDATOR),$(NAME));

您可能会发现使用了一些宏。它们在这里帮助您将此项目的其他属性映射到创建代码中:

  • $(THIS) 替换为此项目的变量名称
  • $(CLASS) 替换为项目类的名称
  • $(PARENT) 替换为父项的名称(允许它成为指向派生自 wxWindow 的类的指针)
  • $(ID) 替换为 ID 属性的值
  • $(POS) 替换为 position 属性的值(可以使用拖动框进行调整)
  • $(SIZE) 替换为 size 属性的值(可以使用拖动框进行调整)
  • $(STYLE) 被 style 属性替换 - 由于自定义项没有预定义的样式集,因此它被视为普通字符串
  • $(VALIDATOR) 验证器,可以使用wxDefaultValidator
  • $(NAME) 替换为生成的名称(相当于项目标识符的字符串表示形式)

默认代码模板创建一个使用默认属性集的标准项。让我们用与InternalPanel构造函数相对应的值替换它。
从InternalPanel.h文件中我们可以找到InternalPanel构造函数的定义代码:

internalPanel(wxWindow* parent,wxWindowID id=wxID_ANY,const wxPoint& pos=wxDefaultPosition,const wxSize& size=wxDefaultSize);

用与InternalPanel构造函数相对应的值替换默认的“Creating code”属性。

$(THIS) = new $(CLASS)($(PARENT),$(ID),$(POS),$(SIZE));

3.2.3 调整自定义项的Include file属性

现在我们必须在“Include file”属性中为提供外部资源的头文件的名称。我们创建了名称为“InternalPanel”的 wxPanel,因此标头将是“InternalPanel.h”。我们需要在属性浏览器中做如下操作:

  • 设置“Include file”属性值为“InternalPanel.h”
  • 设置Use "" for include(instead of <>)属性为true这是因为nternalPanel.h是本地文件

3.2.3 调整自定义项的Class name属性

最后一个要调整的属性是“Class name”——我们需要将面板的名称放在这里;在我们的示例中它是“InternalPanel”。当我们这样做时,我们的嵌入式资源就准备就绪了。虽然资源视图和显示预览继续显示带有InternalPanel的黑色方块,但如果您重新构建/运行项目,您将看到嵌入的资源:

wechat_2025-09-24_233124_917 

4.通过标准 wxPanel 添加自定义面板

使用外部资源的第二种方式是通过普通的 wxPanel。 如果你仔细观察,你会发现大多数项目都有一个名为“类名”的属性——这是将用作项目类型的类的名称。默认情况下,它包含 wxWidgets 中原始类的名称。更改它将通知 wxSmith 将使用不同的类。

因此,要将我们自己的面板放在这里,我们可以在主资源中添加一个“普通”面板,并将类名更改为我们内部资源的名称。到目前为止,这很容易,但这种技术有一个要求——我们的内部资源必须具有与“原始”类完全相同的构造函数参数。

那么让我们来看看 wxWidgets 文档。这是 wxPanel 构造函数的声明:

wxPanel( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL, const wxString& name = "panel")

现在让我们创建自己的内部资源。我们将不得不调整构造函数参数,就像前面的方法一样:

image

点击ok后生成一个新的面板InternalResource2

wechat_2025-09-25_000903_533 

请注意,我已经添加了自定义参数并关闭了所有默认值(这是必需的,因为我们无法轻松添加自定义参数的默认值)。
从InternalResource2.h中找到InternalResource2 构造函数的声明,你会看到它与wxPanel 构造函数的声明的参数是相同的:

InternalResource2(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size,long style, const wxString& name);

现在我们的面板InternalResource2 已经准备就绪,我们可以将其添加到主资源中。
让我们先添加一个“普通”面板:

  • 在主窗口中添加一个wxStaticBoxSizer,Label属性设置为“External resource 2”
  • 在External resource 2中添加一个wxPanel 面板
  • 在属性列表中将wxPanel面板的Class name属性值由“wxPanel”改为“InternalResource2”

修改属性后编辑器中的面板还是显示为一条线,这时编辑器中看到的主窗口画面如下:

wechat_2025-09-25_001126_875

我们仍然需要在源代码中添加 #include“InternalResource2.h”来使我们的项目编译。在之前的解决方案中,它是通过属性自动完成的。现在我们没有这样的系统,所以让我们手动添加它(记得把我们的 include 放在 wxSmith 的代码部分之外,否则资源中的任何更改都会删除我们的更改)。注意,我们需要将其添加到主资源的头文件中:

//(*Headers(Tutorial5Dialog)
#include <wx/sizer.h>
#include <wx/panel.h>
#include "InternalPanel.h"
#include <wx/dialog.h>
//*)
#include "InternalResource2.h"

 构建并运行会看到我们最后的成果,面板InternalPanel和InternalResource2都完整地显示在应用程序的窗口中:

wechat_2025-09-25_001150_989image 

5.结束语

在这篇教程中我们演示了使用wxPanel资源的两种方式,我们体验到两种方式添加组件过程的不同,也看到头文件添加位置的不同。
从本质上来说InternalPanel和InternalResource2都是wxPanel,这一点从类的定义中也能看得出。
参照这种方式,我们也可以以其他组件为基类构建新的类以增加原有组件的功能,同样也能参照这一样的方式在GUI界面中使用新构建的组件。

http://www.hskmm.com/?act=detail&tid=16306

相关文章:

  • 大龄程序员35岁后职业发展出路:认知与思路转变
  • Python安装与Anaconda环境搭建:新手完整教程
  • Unicode 标准 17.0版已经于2025.9.9发布
  • 美女壁纸 纯欲风 清纯
  • AC自动机
  • 虚拟机开机网络连接失败
  • unprofitable25,3
  • 随机过程学习笔记
  • Easysearch 国产替代 Elasticsearch:8 大核心问题解读
  • 9.24 闲话
  • AGC023F 题解
  • 个人介绍
  • C#学习2
  • AGC203F 题解
  • 高级的 SQL 查询技巧
  • 25,9.24日报
  • 在台风天找回了生活的本貌
  • 第二周第三天2.3
  • 欧几里得算法
  • Error response from daemon: could not select device driver nvidia with capabilities: [[gpu]]
  • 全内存12306抢票系统设计:基于位运算的高效席位状态管理
  • 第三天
  • adobe illustrator中如何打出度数的上标
  • day003
  • newDay03
  • 9.24总结
  • 常用API
  • 9月24日
  • 2025.9.24总结 - A