加载中...
深入分析基于框架窗口的应用
第1节:在Windows桌面打个叉
第2节:在窗口上跟踪输出鼠标坐标—Win32版
第3节:你好!wxWidgets
第4节:深入分析基于框架窗口的应用
第5节:玩转主菜单
第6节:简简单单,状态栏
课文封面

复杂应用最常见的桌面程序,基本都使用框架式的主窗口。本节涉及:

  1. 常见的应用中,哪些使用了框架窗口?
  2. wxWidgets 项目配置详解(为将来手工写wxWigets项目配置打基础);
  3. 复习如何使用Code::Blocks的向导,创建一个基于框架窗口的wxWidgets项目;
  4. wxApp 和 wxFrame 快速了解;
  5. 如何修改一个wxWigets应用程序的图标;
  6. 框架窗口的界面组成相关代码;

0. 视频

1. 框架窗口概述

我的第一个框架窗口应用

框架窗口通常用于功能相对复杂的GUI应用的主窗口。对应的,功能相对简单的应用,可以使用对话框作为主窗口。

功能相对复杂的一个体现,就是功能多,因此对应所需要的功能入口也会比较多;并且,假设有三个功能A、功能B、功能C,往往在GUI体现上,往往还不止三个入口。为了方便用户在不同操作过程中,都可以用到某一功能,同一功能往往会有多个图形交互入口。

例如:新建文件功能,有可能在主菜单、工具栏,以及某些地方的快捷(右键)菜单(也称弹出菜单),都会有入口。

尽管大量的框架窗口应用,存在主菜单、工具栏、状态栏,但框架型窗口应用最主要的组成,是用于展示其主数据的UI(用户交互)组件。比如:

  • 画图程序,主要数据界面是用户正在画的图;
  • 记事本程序,主要数据界面是用户正在编辑的文本内容;
  • VS Code 或 我们熟悉的 Code::Blocks,主要数据界面用户正在编辑的代码文件。

2. wxWigets项目主要构建配置(Windows)

建议复制到备忘文件,或者收藏本课堂,以备将来使用别的IDE(比如 VS Code)写wxWidgets时,需要手工配置。

2.1 编译选项

附加编译选项

  • -pipe
  • -mthreads
  • -Wno-unused-local-typedefs

宏(#define)

  • __GNUWIN32__
  • __WXMSW__
  • wxUSE_UNICODE

wxWidgets 项目需要的宏定义

2.2 链接选项

需链接的 Windows 库

wxWidgets 底层使用原生操作系统的UI、网络等功能,因此在 Windows 系统下,wxWidgets 的的项目构建目标,不管是调试(DEBUG)或发行(RELEASE)复本,都需要以下 Windows 库。

这些库并非直接由 Windows 提供,由于我们是在 Windows 使用 GCC 编译环境,因此它们是由 MinGW32 包装、提供)

  • libkernel32.a - Windows 核心层
  • libuser32.a - Windows 用户层
  • libgdi32.a - Windows 绘图层
  • libwinspool.a - Windows 后台处理服务层 (比如处理打印任务)
  • libcomdlg32.a - Windows 通用对话框
  • libadvapi32.a - Windows 高级API
  • libshell32.a - Windows Shell
  • libole32.a - Windows OLE (应用对象链接与嵌入)库
  • liboleaut32.a - Windows OLE
  • libuuid.a - 创建UUID
  • libcomctl32.a - Windows Common Controls Library 通用界面控件库
  • libwsock32.a - Windows 网络基础库
  • libodbc32.a - Windows ODBC (通用数据库访问)库

需链接的 wxWidgets 库

  • 调试版构建目标:libwxmsw28ud_core.a、libwxbase28ud.a、libwxpngd.a、libwxzlibd.a
  • 发行版构建目标:libwxmsw28u_core.a、libwxbase28u.a、libwxpng.a、libwxzlib.a

2.3 搜索路径

除 wxWidgets 的头文件(\include)、库文件(\lib)所在路径之外,还需要额外有 wxWidgets 自带资源(主要是一些图标)的搜索路径。通常它和 wxWidgets 头文件在同一个文件夹下。

下面使用 XXX 表示 wxWidgets 开发库安装在你电脑上目录。

类型 路径 备注
头文件 XXX\include -
库文件 XXX\lib\gcc_lib gcc_lib为静态链接库,gcc_dll为动态链接库
资源文件 XXX\include 和头文件一样

3. wxWidgets 程序入口

由于不同操作系统、或不同的GUI系统,所提供的 GUI 程序的入口函数存在不同(其实主要就是 Windows 系统搞了个 “WinMain”),wxWidgets 使用宏定义,将各系统的不同入口包装起来,然后把 bool wxApp::OnInit() 方法变成事实上的新入口。

4. 修改 wxWidgets 程序图标

打开项目默认生成的 resource.rc (资源文件),将第一行:

aaaa ICON "wx/msg/std.ico"

改为:

aaaa ICON "所在路径/图标文件.ico"

强烈建议将自己的图标放在项目文件的同一目录,如此,在上述资源文件的图标文件,无需写路径,比如本课堂视频中举的例子:

aaaa ICON "d2school.ico"