c++ gui开发需依赖第三方库或系统api;winapi轻量但需手动处理消息循环和gdi/direct2d渲染;qt qpainter限gui线程且需正确传参;dear imgui专注每帧ui逻辑,需自行绑定图形后端。

C++ 本身不提供图形界面渲染能力,必须依赖第三方库或系统 API —— 别指望标准库画个按钮出来。
用 WinAPI 在 Windows 上直接绘图最轻量,但得自己处理消息循环
Windows 原生 GUI 渲染走的是 GDI/GDI+ 或更现代的 Direct2D,WinAPI 是绕不开的入口。你写一个窗口、响应鼠标、在客户区画线,全靠 CreateWindowEx、GetDC、LineTo 这些函数串起来。
- 常见错误:没调用
BeginPaint/EndPaint就直接GetDC绘图,导致重绘异常或资源泄漏 - 使用场景:工具类小软件、嵌入式设备控制面板、需要极致启动速度的本地应用
- 性能影响:GDI 绘图是 CPU 渲染,复杂动画卡顿明显;Direct2D 支持 GPU 加速,但初始化更重
- 示例关键点:
WM_PAINT消息里必须用PAINTSTRUCT,不能硬塞HDC
Qt 的 QPainter 是最常用的选择,但要注意线程限制
QPainter 只能在 GUI 线程中安全使用,且只能在 paintEvent、QPixmap 或 QImage 上绘制 —— 拿它去在线程里画图?直接崩溃或黑屏。
- 常见错误:在
std::thread或QThread::run()里调用QPainter::drawText,报错QPainter::begin: A paint device must be used - 参数差异:
QPainter构造时传QPaintDevice*,传错类型(比如传了QWidget*却没确保它已 show)会静默失败 - 兼容性影响:Qt6 默认启用高 DPI 缩放,
QPainter的坐标单位可能不是像素,需检查devicePixelRatio() - 替代方案:想异步生成图像,先用
QImage绘制,再用QPixmap::fromImage()转到主线程显示
Dear ImGui 不是传统 GUI 库,它把 UI 渲染逻辑压进每帧循环
Dear ImGui 不管理窗口生命周期,也不封装控件事件 —— 它只负责“这一帧该画什么”,最终渲染靠你绑定的 OpenGL/Vulkan/DX11 后端。适合游戏工具、调试面板、音视频插件界面。
立即学习“C++免费学习笔记(深入)”;
- 常见错误:漏掉
ImGui::Render()后调用后端的ImDrawData* draw_data = ImGui::GetDrawData()并提交给 GPU,结果 UI 全黑 - 使用场景:需要和 OpenGL 渲染共存(比如在游戏引擎里加调试窗口),或对帧率敏感、拒绝事件驱动模型
- 性能影响:UI 绘制开销极低,但每帧都要调用
ImGui::NewFrame()+ImGui::Render(),别把它当一次性初始化库用 - 注意点:
ImGui::Begin()和ImGui::End()必须成对,否则内部状态错乱,后续窗口位置/大小全乱
真正难的从来不是“怎么画出一个矩形”,而是决定谁来管窗口生命周期、谁来分发鼠标事件、谁来保证 DPI 适配、谁来扛住多线程访问 —— 这些问题没想清楚前,连 QPainter 都会画歪。










