Duilib--->Duilib库介绍&总结&概述

DuiLib库

介绍:

DuiLib(第三方库,应用窗口美化,逻辑操作与界面分离,用XML文档进行界面编辑)(DUI与GUI/VUI的对比)

概念与定义:

DuiLib库是轻量级的C++界面开发库。duilib并没有像MFC那样把所有的东西全包了,它仅仅包装了UI部分而已,其他的还是需要用win32、MFC的知识,所以除了UI部分,其他的都和duilib没有关系。
逻辑操作与界面分离了。

DuiLib库优点与缺陷:

优点:
  1. 基于GDI在窗口上自绘,无其他依赖,未使用特殊或危险的系统调用,能够很好的解决传统MFC界面的一系列问题。
  2. 使用XML来描述界面风格,界面布局,将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。
  3. 完全兼容ActiveX控件(如常见的IE控件和Flash),也可以和MFC等界面库配合使用。
  4. 可广泛用于互联网客户端、工具软件客户端、管理系统客户端、多媒体客户端(如KTV、触摸屏)、车载电脑系统、gps系统和手机客户端软件等。
缺陷:
  1. 没有帮助文档
  2. 后期没有进行维护

使用

环境配置:

1.下载,将DuiLib设为启动项,将项目配置全部批生成。
2.将DuiLib与lib文件夹拷贝至项目目录下,[附加包含目录]添加[Duilib]的路径,[附加库目录]添加[lib]路径,将[bin]目录下的.dll(应用程序扩展)拷贝至项目[Dubug]目录下。
几个重要类的学习:
WindowImplBase
class UILIB_API WindowImplBase
: public CWindowWnd //基本窗口的创建与消息处理,【源码
, public CNotifyPump //Duilib虚拟界面由CNotifyPump类控制
, public INotifyUI //消息通知
, public IMessageFilterUI //消息过滤
, public IDialogBuilderCallback //对话框建立消息回馈
{…};
CPaintManagerUI //控件的绘制,一般直接传入XML文档,写函数绘制太麻烦了

初步介绍

由于DuiLib库没有文档说明,在使用之后做出了如下总结,算是方便以后查阅,也分享给大家。有部分内容是拷贝转载的,已注明来源(精华提取,就不用跳过去看了)

主函数入口地址

_tWinMain	//主函数入口地址
#define _tWinMain   wWinMain
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow){}
//lpCmdLine 是命令行参数,nCmdShow 是窗体显示方式,hInstance 是实例句柄,hPrevInstance 这个参数是Win16 的遗留参数。

启动代码调用Win32 API,获取hInstance,lpCmdLine,nCmdShow 3个参数。
hInstance 实际上通常,这个是程序的启动地址,大概是0x400000 即 4M 的位置,4M 以下是系统保留的------用于捕获空指针异常的,因为 Win32 每个进程,有自己的地址空间,所以,几乎都是从同一地址启动的。
hPrevInstance 这个参数是Win16 的遗留参数,用来判断,同一程序的另一个实例,是否已经启动,缺省设置为NULL。

控件与界面的绘制

CPaintManagerUI		//控件与界面的绘制,一般直接传入XML文档,写函数绘制太麻烦了
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());   // 设置资源的默认路径(此处设置为和exe在同一目录)

进阶使用&相关基础

Win32应用程序流程

1.注册窗口类
2.创建窗口
3.显示窗口&更新窗口
4.消息队列

MFC(将Win32的步骤封装成类,但是界面并不好看)

DuiLib(第三方库,应用窗口美化,逻辑操作与界面分离,用XML文档进行界面编辑

  • 1>概念与定义
    DuiLib库是轻量级的C++界面开发库。duilib并没有像MFC那样把所有的东西全包了,它仅仅包装了UI部分而已,其他的还是需要用win32、MFC的知识,所以除了UI部分,其他的都和duilib没有关系。
    逻辑操作与界面分离了。
  • 2>DuiLib库优点
    1. 基于GDI在窗口上自绘,无其他依赖,未使用特殊或危险的系统调用,能够很好的解决传统MFC界面的一系列问题。
    2. 使用XML来描述界面风格,界面布局,将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。
    3. 完全兼容ActiveX控件(如常见的IE控件和Flash),也可以和MFC等界面库配合使用。
    4. 可广泛用于互联网客户端、工具软件客户端、管理系统客户端、多媒体客户端(如KTV、触摸屏)、车载电脑系统、gps系统和手机客户端软件等。
  • 3>部分类与函数
		Create()	duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
			参数 	1>副窗口	2>窗口类的名字(标识)	3>风格(UI_WNDSTYLE_FRAME>厚边框) 	4>风格 
		ShowModal(窗口显示,模态对话框)
		ShowWindal(窗口显示)
		CenterWindow(居中窗口)
			//如下为创建并居中显示窗口
			CDuiFrameWnd duiFrame;
			duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
			duiFrame.CenterWindow();
			duiFrame.ShowModal();
		MessageBox(NULL,_T("测试"),_T("GIF"),IDOK);//测试窗口
	4>消息
		typedef struct tagTNotifyUI 
		{
			CDuiString sType;
			CDuiString sVirtualWnd;
			CControlUI* pSender;
			DWORD dwTimestamp;
			POINT ptMouse;
			WPARAM wParam;
			LPARAM lParam;
		} TNotifyUI;
  • 5>使用DuiLib注意
    1、 duilib其实并没有区分标题栏和客户区,它的实现方法是屏蔽了系统自带的标题栏,用客户区来模拟标题栏,所以想怎么画就怎么画,非常方便。
    我们首先屏蔽一下系统自带的标题栏,在HandleMessage消息处理函数里屏蔽以下三个消息即可 WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT。

  • 6>重写消息
    1. WindowImplBase下的 virtual void Notify(TNotifyUI& msg);重写
    2. WindowImplBase下的 virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);重写

  • 7>win32:获取文件路径窗口

  • 8>向CMD窗口发送命令(使用ffmpeg库,转到库目录下,使用如下cmd命令)
    1. 使用图片生成gif
    ffmpeg -r 1 -i .\Pictrue\%d.jpg 11.gif //-r(参数选项) 1(控制图片速度,值越大图片播放越快) -i(数据来源) .(当前目录)
    2. 使用视频生成gif
    (1)视频的截取
    ffmpeg -ss 00:00:15 -to 00:00:25 -i input.mp4 -vcodec copy -acodec copy output.mp4 //从15秒截取到25秒 --vcodec视频文件拷贝 -acodec音频文件拷贝
    (2)提取原视频中的字幕流
    ffmpeg -i output.mkv -an -vn -scodec copy sub3.ass
    (3)对提取到的字幕流进行编辑
    (4)将字幕流烧录到视频文件
    (5)视频生成CIF
    ffmpeg -r 1 -i 1.flv 1.gif //1.flv(原视频的路径) 1.gif(生成视频的路径)
    Dui Desiger
    图片载入
    source 左起,0,右至,高度

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值