duilib界面库使用介绍资料

上传人:E**** 文档编号:107076166 上传时间:2019-10-17 格式:DOC 页数:39 大小:876.57KB
返回 下载 相关 举报
duilib界面库使用介绍资料_第1页
第1页 / 共39页
duilib界面库使用介绍资料_第2页
第2页 / 共39页
duilib界面库使用介绍资料_第3页
第3页 / 共39页
duilib界面库使用介绍资料_第4页
第4页 / 共39页
duilib界面库使用介绍资料_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《duilib界面库使用介绍资料》由会员分享,可在线阅读,更多相关《duilib界面库使用介绍资料(39页珍藏版)》请在金锄头文库上搜索。

1、Duilib界面库使用介绍一、Duilib简介Duilib是以DirectUI为技术原理开发的一款轻量级Windows桌面UI库,具有入门简单,使用方便等特点,在国内吸引了不少的开发者。其开发原型为国外大神viksoe的http:/www.viksoe.dk/code/windowless1.htm 文章中提供的源码,国内开源前辈以此为基础:修正Bug、优化程序结构、提高稳定性和易用性,是一款功能强大,使用方便的界面库。界面库使用XML来描述界面风格,界面布局,可以很方便的构建高效,绚丽的,非常易于扩展的界面。从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。Du

2、ilib界面库的出现解决了使用传统MFC界面库开发软件不美观、界面细节处理不好、使用硬编码、开发效率低下、生成程序体积大等问题。国内的以下客户端都曾经以此为基础拓展并使用了duilib: 1. 百度杀毒2. 微信PC客户端3. 爱奇艺客户端4. 酷我音乐其他基于Duilib的软件不完全列表:百度: PPS 百度卫士 91助手腾讯: 企业微信阿里: 钉钉 支付宝安全控件 PP助手华为: 华为网盘书生云:书生企业云盘微软: 微软壁纸网易: 易信 云音乐 荒野行动PC版金山: 金山快盘京东: 咚咚cctv: cbox蘑菇街: TeamTalk火绒: 火绒安全软件盘古: 盘古越狱工具顺网: 网维大师

3、91y网狐: 网狐经典版墨迹风云: 墨迹天气zoomcloud: Zoom视频会议搜狗: 搜狗手机助手沃通: 沃通代码签名工具驱动人生: 驱动人生 人生日历维棠: 维棠深圳市北斗智研科技: 智能办公助手 ERP管理系统2、 Duilib原理DirectUI意为直接在父窗口上绘图(Paint on parent dc directly)。即子窗口不以窗口句柄的形式创建(windowless),只是逻辑上的窗口,绘制在父窗口之上。通俗来说就是在窗口上指定一块区域(仅仅是一个区域,不是一个实体控件)通过各种消息模拟一个控件的功能。完全可以在一个对话框类的OnMouseMove、OnLButtonDo

4、wn等函数中模拟一个按钮出来。但是模拟的控件一多就混乱了,为了统一管理,逻辑上更清晰类似于实体控件。把每种控件封装成类处理各种消息,并通过自定义的消息分发机制把消息分发到各个模拟控件里。DuiLib 一部分技术特点界面与业务逻辑分离使用XML配置界面界面布局方式灵活多样强大的事件处理机制基于GDI和脏矩形的高效绘制技术支持多种资源方式,支持多种图片格式支持alpha混合,支持窗口透明支持动态切换资源位置方式换肤支持unicode内存占用小无第三方库依赖CPaintManagerUI - 管理控件的绘制以及消息处理分发等功能其中关联了真正的主窗口HWDN以及HOVER,FOCUS,CLICK等控

5、件指针。CControlUI - 大多控件的基类。 包含控件各种属性,需要子类控件处理的消息的虚函数等。button响应消息过程1.CPaintManagerUI findcontrol,根据点找到CControlUI2.该控件调用虚函数的DoEvet(如按钮具体是改变自身一些flag)3.调用基类(CControlUI)的Invalidate.(此Invalidate是依次找父UI(layout之类)和当前区域相交结果,只刷新那一部分).4.m_pRoot调用DoPaint。从最下层依次调用有子关系的CControlUI的DoPaint。(涉及剪切,区域相交等)3、 运行流程Win32消息路

6、由如下:消息产生。系统将消息排列到其应该排放的线程消息队列中。线程中的消息循环调用GetMessage(or PeekMessage)获取消息。传送消息TranslateMessage and DispatchMessage to 窗口过程(Windows procedure)。在窗口过程里进行消息处理#include ././DuiLib/UIlib.husing namespace DuiLib;#ifdef _DEBUG# ifdef _UNICODE# pragma comment(lib, ././Lib/DuiLib_ud.lib)# else# pragma comment(li

7、b, ././Lib/DuiLib_d.lib)# endif#else# ifdef _UNICODE# pragma comment(lib, ././Lib/DuiLib_u.lib)# else# pragma comment(lib, ././Lib/DuiLib.lib)# endif#endifclass CFrameWnd : public CWindowWndpublic: virtual LPCTSTR GetWindowClassName() const return _T(FrameWnd); virtual void OnFinalMessage(HWND hWnd)

8、 delete this; ;int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd ) / new一个窗口对象 CFrameWnd* pFrame = new CFrameWnd; / 注册窗口类、创建窗口 pFrame-Create(NULL, _T(sample01), UI_WNDSTYLE_FRAME, UI_WNDSTYLE_EX_FRAME, 100, 100, 800, 600, NULL); / 显示窗口、进入窗口消息循环 pFra

9、me-ShowModal(); return 0;使用CFrameWnd继承自CWindowWnd,CWindowWnd必须实现的一个纯虚接口是GetWindowClassName来表明她的窗口类名。在OnFinalMessage中delete this是因为DuiLib中需要使用new来生成一个窗口,delete可以防止内存泄漏(在后面的DuiLib程序中可以看到都只有new而没有delete,这是因为DuiLib内部在窗口销毁时已经做了delete的操作)。以下是关键的几个方法: 1、创建窗口 HWND CWindowWnd:Create(HWND hwndParent, LPCTSTR

10、pstrName, DWORD dwStyle, DWORD dwExStyle, int x, int y, int cx, int cy, HMENU hMenu) if( GetSuperClassName() != NULL & !RegisterSuperclass() ) return NULL; if( GetSuperClassName() = NULL & !RegisterWindowClass() ) return NULL; m_hWnd = :CreateWindowEx(dwExStyle, GetWindowClassName(), pstrName, dwSty

11、le, x, y, cx, cy, hwndParent, hMenu, CPaintManagerUI:GetInstance(), this); ASSERT(m_hWnd!=NULL); return m_hWnd;在调用CreateWindowEx这个windows API前会先调用RegisterWindowClass注册窗口类。 2、显示窗口并进入消息循环UINT CWindowWnd:ShowModal() ASSERT(:IsWindow(m_hWnd); UINT nRet = 0; HWND hWndParent = GetWindowOwner(m_hWnd); :Sho

12、wWindow(m_hWnd, SW_SHOWNORMAL); :EnableWindow(hWndParent, FALSE); MSG msg = 0 ; while( :IsWindow(m_hWnd) & :GetMessage(&msg, NULL, 0, 0) ) if( msg.message = WM_CLOSE & msg.hwnd = m_hWnd ) nRet = msg.wParam; :EnableWindow(hWndParent, TRUE); :SetFocus(hWndParent); if( !CPaintManagerUI:TranslateMessage

13、(&msg) ) :TranslateMessage(&msg); :DispatchMessage(&msg); if( msg.message = WM_QUIT ) break; :EnableWindow(hWndParent, TRUE); :SetFocus(hWndParent); if( msg.message = WM_QUIT ) :PostQuitMessage(msg.wParam); return nRet;先调用了ShowWindow去显示窗口,然后进入GetMessage消息循环。3、窗口过程 LRESULT CALLBACK CWindowWnd:_WndPro

14、c(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) CWindowWnd* pThis = NULL; if( uMsg = WM_NCCREATE ) LPCREATESTRUCT lpcs = reinterpret_cast(lParam); pThis = static_cast(lpcs-lpCreateParams); pThis-m_hWnd = hWnd; :SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast(pThis); else pThis = reinterpret_cas

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号