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
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"