还是那句话,不想用MFC,写的界面丑,不想依赖MFC的一些库,在网上闲逛,发现duilib还可以,至于QT,有时间再研究,
dulib已经没人更新了,估计也是翻不出什么花样了,但研究一下总算是C++的一个扩展吧
这个并不是框架,也不是语言,就可以理解为一个c++类库,封装了一些做界面的常用的,但跟MFC还不同,它的界面上的东西都是画出来的,而且消息的处理方式也不太一样
另外一点,如何画,是用xml定义的,跟WPF的味道相似,其实来讲,感觉现在的网页,做前后端分离是一样的感觉,UI跟业务逻辑分离
比如现在的360,网易,微信,迅雷等都是这个画的。
这个哥们讲得比较多,但代码和资源都在CSDN上,没分下不来,谁能告诉我怎么赚分? (讲真的,csdn这事有点恶心,跟那个视觉中国一样德行)
https://www.cnblogs.com/Alberl/p/3341956.html
但这博客讲得很粗,只适合有基础需要加大宽度的朋友
这个讲得很细,不过用的网易的分支版本,大家自己决定 https://www.cnblogs.com/feipeng8848/p/11912613.html
我自己的过程大概是这样
一、从git拉下来
二、用的vs2019打开的,升级后有些不能编译,按照提示做些简单修改即可
#include "afxres.h"
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
这两个编译错误,换成
#include "winres.h"
QQDemo编辑错误时,把res文件夹往debug目录里扔
记得先编译 DuiLib
三、按照RichListDemo里的样子,写了一个helloworld
a、把目录 都处理一下,上面地址里的哥们都有介绍
b、需要知道按钮被点击,我在例子里写了三个地方,只有一个地方没有实现,只是懒得去弄,具体可以看下这个哥们的
https://blog.csdn.net/qq_24127015/article/details/89708749
c、这就是全部的代码!
#pragma once #include <UIlib.h> using namespace DuiLib; #ifdef _DEBUG # ifdef _UNICODE # pragma comment(lib, "DuiLib_ud.lib") # else # pragma comment(lib, "DuiLib_d.lib") # endif #else # ifdef _UNICODE # pragma comment(lib, "DuiLib_u.lib") # else # pragma comment(lib, "DuiLib.lib") # endif #endif //声明一个窗口的类 class CfrmWnd : public WindowImplBase { public: virtual LPCTSTR GetWindowClassName() const { return _T("CfrmWnd"); } virtual CDuiString GetSkinFile() { return _T("duilib.xml"); } virtual CDuiString GetSkinFolder() { return _T(""); } virtual void OnFinalMessage(HWND); virtual void Notify(TNotifyUI& msg); //virtual void InitWindow(); 窗口初始化可以做些事 virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { //这里是更上一层的消息函数,用以方法获取按钮点击事件,不过是有些麻烦,看下这里 //https://blog.csdn.net/qq_24127015/article/details/89708749 switch (uMsg) { case WM_LBUTTONDOWN: { } break; case WM_LBUTTONUP: { } break; } return __super::HandleMessage(uMsg, wParam, lParam); } DUI_DECLARE_MESSAGE_MAP() virtual void OnClick(TNotifyUI& msg); }; //定义宏 DUI_BEGIN_MESSAGE_MAP(CfrmWnd, WindowImplBase) DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK, OnClick) DUI_END_MESSAGE_MAP() //下面所有的都是重写或宏定义的方法 void CfrmWnd::OnFinalMessage(HWND hWnd) { __super::OnFinalMessage(hWnd); delete this; } void CfrmWnd::Notify(TNotifyUI& msg) { if (msg.sType == _T("click")) { if (msg.pSender->GetName() == _T("btnHello")) { ::MessageBox(NULL, _T("我是按钮1"), _T("点击了按钮"), NULL); } } return WindowImplBase::Notify(msg); } void CfrmWnd::OnClick(TNotifyUI& msg) { if (msg.pSender->GetName() == _T("btnHello")) { ::MessageBox(NULL, _T("hello world,我是按钮2,用的消息映射"), _T("点击了按钮"), NULL); return; } if (msg.pSender->GetName() == _T("closebtn")) { ::MessageBox(NULL, _T("关闭了 hello world"), _T("点击了按钮"), NULL); PostQuitMessage(0); // 因为activex的原因,使用close可能会出现错误 return; } } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); // 设置资源的默认路径(此处设置为和exe在同一目录) CfrmWnd duiFrame; duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); duiFrame.ShowModal(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现