duilib库分析日志 (一) : 简单了解下duilib库

最近一直在想做个DirectUI库. 先找了几个UI库, 也没做过啥Demo. 1年前看过国外的viksoe库(URL: http://www.viksoe.dk/code/index.htm) 因水平有艰也没能坚持看完.

后来找到国内一款牛X的开源库duilib, (URL: www.duilib.com)这个团队还是基于viksoe库开发的, 但完善的很好.  其中有个UIDesigner设计器可以快捷的设计出duilib库可以解析的XML文件( 设计者的主页: http://www.taxue.org ).  以上都是牛人.   其实到他们的BBS会有很多文档可以参考. http://bbs.duilib.com

本人只想快点跟上他们, 所以会陆续在此记录理解到的东西. 


1. 整个框架我没法画出来, 还好"踏雪流云"已经画出.(URL: http://www.taxue.org/?p=55  )可以参考下.

2. 简单记录下主要类的功能

CPaintManagerUI很重要的一个类, 管理所有控件树, 并对控件相关消息产生相应的用户层的事件. 显示控件到用户窗口上.

CWindowWnd 相关于WTL库里的CWindow库. 有创建窗口对象, 注册窗口类, 接管消息处理的函数. 也就用户自定窗口的父类.

CControl 所有DUI控件的基础类. 以后的所有控件都会从这个类继承. 包含了控件所需的基本信息. 

CContainter窗口类的基类. 所有布局类, 列表控件, 组合框, 都会继承于此. 功能是可以放置基本控件或自定义控件类对象. 还有水平于垂直滚动条功能.

CDialogBuilder解析Skin相关的XML文件, 并转为控件树. 包含了读文件/解压包文件功能, 会利用CMarkup类解析XML中的元素和属性, 并设置到相应的控件对象中.


CDelegate相关类挺有意思, 类似C#里的委托功能. 

CRender类对于区域管理打包打的不错.(主要操作HRGN对象)

CRenderEngine  这类纯粹就是用于方便画图. 有关基本线条, 贴图, 透明贴图很有帮助. 



恩.... 现在就大概看了这些.  个人大概的分析, 所以难免会出错. 希望能指正.   下回看下消息处理流程.



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: duilib是一款基于C++开发的UI界面,支持Windows操作系统。它提供了丰富的控件和样式,可以用于快速开发各种图形界面应用程序。 下面是一个简单duilib的演示示例: #include "stdafx.h" #include "DuiLib/UIlib.h" using namespace DuiLib; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CWndHostDemoWnd wnd; if(!wnd.Create(NULL, _T("DuiLib Demo"), UI_WNDSTYLE_DIALOG, 0L, 0, 0, 800, 600)) { return 0; } wnd.CenterWindow(); wnd.ShowWindow(true); CPaintManagerUI::MessageLoop(); return 0; } 以上代码是一个简单的程序入口函数,包含了duilib的初始化和创建一个对话框窗口的过程。其中CPaintManagerUI::SetInstance(hInstance);用于设置实例句柄,CWndHostDemoWnd是对话框窗口的自定义类;wnd.Create()用于创建窗口,参数依次为父窗口句柄、窗口名称、窗口样式、额外扩展样式、窗口的位置和大小;wnd.CenterWindow()用于将窗口居中显示;wnd.ShowWindow(true)将窗口显示出来;CPaintManagerUI::MessageLoop()是进入duilib的消息循环。 duilib的优点是使用方便,界面美观,扩展性强。它提供了丰富的控件和样式,能够满足不同应用场景的需求。通过duilib,开发人员可以快速构建出直观、交互友好的图形界面应用程序。有很多开发者使用duilib来开发各种类型的应用,例如电商平台、音乐播放器、管理系统等。使用duilib可以极大地提高开发效率,减少代码量,提升用户体验。 ### 回答2: Duilib是一个开源的C++ GUI,其主要用途是用于Windows平台下的桌面应用程序开发。下面是一个简单Duilib的demo。 首先,需要包含头文件: ``` #include <duilib/UIlib.h> ``` 创建一个窗口类,继承自`WindowImplBase`: ``` class MyWindow : public WindowImplBase { public: virtual LPCTSTR GetWindowClassName() const { return _T("MyWindowClass"); } virtual CDuiString GetSkinFile() { return _T("mywindow.xml"); } virtual CDuiString GetSkinFolder() { return _T(""); } virtual void OnFinalMessage(HWND hWnd) { delete this; } virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { return __super::HandleMessage(uMsg, wParam, lParam); } virtual void InitWindow() { } virtual void Notify(TNotifyUI& msg) { } }; ``` 在应用程序的入口函数中创建窗口: ``` int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // 初始化Duilib CPaintManagerUI::SetInstance(hInstance); // 创建窗口 MyWindow* pWnd = new MyWindow(); if (pWnd == NULL) { return 0; } pWnd->Create(NULL, _T("MyWindowTitle"), UI_WNDSTYLE_FRAME, WS_EX_STATICEDGE); pWnd->CenterWindow(); pWnd->ShowWindow(); CPaintManagerUI::MessageLoop(); return 0; } ``` 在项目目录下创建一个名为`mywindow.xml`的XML文件,定义窗口的布局: ``` <?xml version="1.0" encoding="UTF-8"?> <Window> <Text pos="100, 100, 200, 200" text="Hello, World!" /> </Window> ``` 以上是一个使用Duilib创建一个简单的窗口的demo。通过继承`WindowImplBase`类来自定义窗口的行为,通过创建相应的XML布局文件来设计界面。Duilib提供了丰富的UI控件和事件处理机制,可以让开发者轻松实现复杂的Windows应用程序。 ### 回答3: duilib是一款基于C++开发的跨平台UI,它能够帮助开发者快速地构建漂亮、流畅、易于维护的图形用户界面。下面是一个简单duilib的示例demo。 ```cpp #include "stdafx.h" #include "UIlib.h" using namespace DuiLib; class CMyWindow : public CWindowWnd, public INotifyUI { public: CMyWindow() {} virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); } virtual void Notify(TNotifyUI& msg) { if (msg.sType == _T("click")) { if (msg.pSender->GetName() == _T("btnClick")) { wstring text = msg.pSender->GetText(); MessageBox(NULL, text.c_str(), _T("提示"), MB_OK); } } } virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT lRes = 0; if (uMsg == WM_CREATE) { m_pm.Init(m_hWnd); CDialogBuilder builder; CContainerUI* pContainer = static_cast<CContainerUI*>(builder.Create(_T("duilib.xml"), NULL, NULL, &m_pm)); if(pContainer) { m_pm.AttachDialog(pContainer); m_pm.AddNotifier(this); } } else if (uMsg == WM_CLOSE) { ::PostQuitMessage(0); return lRes; } else if (uMsg == WM_DESTROY) { ::PostQuitMessage(0); return lRes; } if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes)) return lRes; return CWindowWnd::HandleMessage(uMsg, wParam, lParam); } protected: CPaintManagerUI m_pm; }; int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CMyWindow myWindow; if (!myWindow.Create(NULL, _T("duilib demo"), UI_WNDSTYLE_DIALOG, 0L, 0, 0, 800, 600)) { return 0; } myWindow.CenterWindow(); myWindow.ShowWindow(true); CMessageLoop msgLoop; return msgLoop.Run(); } ``` 以上是一个简单的使用duilib的示例demo。它创建了一个窗口,加载了duilib.xml布局文件,并添加了一个按钮点击事件的响应处理函数。当点击按钮时,会弹出一个消息框显示按钮的文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值