工作十多年后重新做 Windows 开发,我用 C++20 和 Codex 写了一个轻量级原生框架 MWFL

8 月 23 日
 everettjf

大家好,最近做了一个原生 Windows 开发框架,叫做 MWFL ( Modern Windows Foundation Layer ),想在这里简单分享一下它的来历。

我刚毕业时做的就是 Windows 桌面程序开发。当时用过 Qt 、MFC ,也用过 WTL 。

如果追求轻量,比如需要把程序放进 U 盘或光盘里直接运行,尽量减少依赖并控制程序体积,当时我通常会选择 WTL ;如果不太在意依赖和安装包大小,则会考虑 MFC 或 Qt 。我也接触过 DuiLib 一类相对轻量的方案,但整体开发体验始终没有特别满意。

后来十多年里,我的工作重心转到了移动端,基本没有再系统地做 Windows 桌面开发。直到最近,工作中又遇到了一些 Windows 开发需求。

重新回头看这个领域,我发现当年的一些问题似乎还在:

直接使用 Win32 API ,代码比较繁琐,需要处理大量窗口消息和样板代码; MFC 、Qt 这样的方案相对完整,但有时又显得偏重; WTL 足够轻量,不过大量宏以及偏传统的编程方式,放在今天来看,代码的可读性和开发体验都还有改进空间。

于是我开始思考:能不能利用 C++20 的一些现代语言特性,在 Win32 之上构建一个更现代、轻量而且容易理解的基础库?

这个项目只面向 Windows ,不考虑跨平台。跨平台有它的价值,但也会带来更多抽象层和复杂度。对我的需求来说,既然目标就是 Windows 10 及以上系统,那保留 Windows 的原生控件、原生行为和系统集成能力,更直接。

最近我和 Codex 反复讨论和迭代,逐渐把这个想法做成了现在的 MWFL 。

#include <mwfl/mwfl.h>

using mwfl::operator""_dip;

class MainWindow final : public mwfl::WindowBase {
public:
    void BuildUI() override {
        SetTitle(L"Hello, mwfl");

        mwfl::ControlHost ui{*this};
        ui.Add(message_, L"Native UI, modern C++20.");
        ui.Add(close_, L"Close");

        SetLayout(mwfl::Column()
            .Margin(24_dip).Gap(12_dip)
            .Add(message_, mwfl::Auto())
            .Add(close_, mwfl::Fixed(36_dip)));
    }

private:
    mwfl::Label message_;
    mwfl::Button close_;
};

MWFL 没有重新绘制一套 UI 。窗口和控件仍然是真实的 HWND ,底层的消息、句柄、样式和返回值也都可以直接访问。它主要使用 C++20 提供一些更现代的封装,例如类型化事件、RAII 资源管理、DPI 感知布局和更明确的对象所有权,同时尽量减少传统 Win32 、MFC 和 WTL 开发中常见的宏与样板代码。

项目现在是第一个公开版本 v0.1.0 ,使用 MIT 协议,面向 Windows 10 及以上系统,支持 x64 和 ARM64 。仓库中有 62 个可以编译运行的示例。我也用它做了几个真实的小工具,包括十六进制编辑器、Markdown 编辑器、SQLite 查看器、PDF 阅读器、文件夹比较工具和启动项管理器等。

如果你需要:

可以看看这个项目。

项目地址:

https://github.com/mwfl/mwfl

文档:

https://mwfl.github.io/

业余 AI 项目,欢迎尽情交流。

2056 次点击
所在节点    程序员
10 条回复
godbuttonFor
8 月 23 日
为啥不直接 react 如果只是做桌面应用
everettjf
8 月 23 日
@godbuttonFor 太大了
Quarry
8 月 23 日
论极致的轻量感觉还得是 vb
everettjf
8 月 24 日
@dimwoodxi27 确实更古老了
mooyo
8 月 24 日
所以 winui3 是什么地方不能满足要求呢。。。

2026 年 在 windows 10 上使用 win32 控件
everettjf
8 月 24 日
@mooyo 还是多个 xaml 文件,总感觉不爽,哈哈
yolee599
8 月 24 日
如果是原生可以考虑一下 wxWidgets ,体积一样很小
simonsww
8 月 24 日
支持这样的项目。但是对于我个人来说,如果要做一个客户端类的产品,我可能还是希望能够支持 Win7 以及 Mac 端。
everettjf
8 月 25 日
@simonsww win7 还好说。mac 就负责了。
everettjf
8 月 25 日
@yolee599 wxWidgets 确实很多年了,给人一种不维护的感觉。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1236554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX