Windows下安装wxWidgets并编写一个Hello World
之前尝试用Compose Desktop通过Win32 Api的方式实现了桌面管理工具,但是这个实现显然是很不环保的——Compose Desktop现阶段打包还需要带上JVM,带来惊人的包大小增长和较慢的执行速度。因此,我又开始尝试写一下其他UI框架的Hello World,今天是wxWidgets。

之前尝试用Compose Desktop通过Win32 Api的方式实现了桌面管理工具,但是这个实现显然是很不环保的——Compose Desktop现阶段打包还需要带上JVM,带来惊人的包大小增长和较慢的执行速度。因此,我又开始尝试写一下其他UI框架的Hello World,今天是wxWidgets

wxWidgets

C++下的GUI工具最为人所知的就是Qt,但Qt在国内都快成开源刺客了,风评很不好,所以我优先看了下其他选择,即wxWidgets。

与Qt或我之前了解的Compose Desktop不同,wxWidgets是对系统原生组件的封装。好处说和系统原生控件效果保持一致,坏处是同一个应用在不同系统显示效果会不一致,而且交互设计也要受原生控件能力的限制。

下载wxWidgets

虽然官方提倡自己从源码进行编译,但对于我这三分钟热度的折腾党来说,还是尽快看到界面获得点成就感才能继续折腾下去。wxWidgets提供了Windows下的预编译版本,只要下载header文件和预编译文件即可,如下:

下载文件

我将两个压缩包都解压到 C:/wxWidgets 下备用。

解压

接下来配置环境变量,首选创建一个WXWIN变量指向wxWidgets文件夹

修改环境变量

再把dll所在目录添加到Path文件夹中,这样编译完成后就不用把这些dll拷贝到输出目录了(发布时仍然还是要带上,否则用户会找不到dll)

添加dll到Path环境变量

CMake工程配置

Windows下最好用的IDE显然是VS2019,但wxWidgets理论上是跨平台的,因此还是选择用CMake做构建系统,而不是VS自带的工程文件。

首先创建一个CMake空工程

创建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

很幸运我没有遇到编码问题,中文也都正确显示了。

解决字体模糊问题

上面的例子虽然正确显示了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