之前尝试用Compose Desktop通过Win32 Api的方式实现了桌面管理工具,但是这个实现显然是很不环保的——Compose Desktop现阶段打包还需要带上JVM,带来惊人的包大小增长和较慢的执行速度。因此,我又开始尝试写一下其他UI框架的Hello World,今天是wxWidgets。
C++下的GUI工具最为人所知的就是Qt,但Qt在国内都快成开源刺客了,风评很不好,所以我优先看了下其他选择,即wxWidgets。
与Qt或我之前了解的Compose Desktop不同,wxWidgets是对系统原生组件的封装。好处说和系统原生控件效果保持一致,坏处是同一个应用在不同系统显示效果会不一致,而且交互设计也要受原生控件能力的限制。
下载wxWidgets
虽然官方提倡自己从源码进行编译,但对于我这三分钟热度的折腾党来说,还是尽快看到界面获得点成就感才能继续折腾下去。wxWidgets提供了Windows下的预编译版本,只要下载header文件和预编译文件即可,如下:
我将两个压缩包都解压到 C:/wxWidgets
下备用。
接下来配置环境变量,首选创建一个WXWIN变量指向wxWidgets文件夹
再把dll所在目录添加到Path文件夹中,这样编译完成后就不用把这些dll拷贝到输出目录了(发布时仍然还是要带上,否则用户会找不到dll)
CMake工程配置
Windows下最好用的IDE显然是VS2019,但wxWidgets理论上是跨平台的,因此还是选择用CMake做构建系统,而不是VS自带的工程文件。
首先创建一个CMake空工程
在CMakeLists.txt中添加依赖
find_package(wxWidgets REQUIRED)
include(${wxWidgets_USE_FILE})
# 这里的 wxProject2 是你的编译目标文件名
target_link_libraries(wxProject2 ${wxWidgets_LIBRARIES})
最简化Demo
打开cpp文件,输入以下代码
#include <wx/wx.h>
class MyFrame : public wxFrame
{
public:
MyFrame() : wxFrame(NULL, wxID_ANY, "Hello, wxWidgets!")
{
// 创建一个静态文本控件并添加到框架
wxStaticText* text = new wxStaticText(this, wxID_ANY, "Hello, World!\n你好,世界!");
// 设置文本控件的字体和颜色
text->SetFont(wxFont(16, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
text->SetForegroundColour(*wxBLUE);
// 使用垂直盒子布局管理器来布局文本控件
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(text, 0, wxALIGN_CENTER | wxTOP, 50);
SetSizer(sizer);
// 设置框架的大小
SetClientSize(400, 300);
}
};
class MyApp : public wxApp
{
public:
virtual bool OnInit()
{
MyFrame* frame = new MyFrame();
frame->Show(true);
return true;
}
};
// 虽然教程说可以用这个宏定义代替main函数,但我尝试没有成功
// wxIMPLEMENT_APP(MyApp);
int main(int argc, char* argv[])
{
wxApp::SetInstance(new MyApp);
return wxEntry(argc, argv);
}
很幸运我没有遇到编码问题,中文也都正确显示了。
解决字体模糊问题
上面的例子虽然正确显示了Hello World,但是字体显得很模糊,展示效果很差。为了解决这个问题,我们需要开启一个被称作DPI感知的特性。
拷贝文件 C:\wxWidgets\include\wx\msw\wx_dpi_aware.manifest
到当前项目目录下,然后再CMakeLists.txt中引入。
target_sources(wxProject2 PRIVATE wx_dpi_aware.manifest)
那么大功告成,我将所有代码推送到了Github上,可以最后拉下来自己试试。
最后修改于 2024-08-29