duilib

duilib教程之duilib入门简明教程18.其他

a 夏天 提交于 2019-11-28 20:41:31
一、超链接按钮 代码很简单,参见360Demo: <Button text="{u}{a}求助{/a}{/u}" showhtml="true"/> 这里只需要加上showhtml="true",然后在text属性里写类html代码就可以了,不过duilib只支持小部分html代码,具体的格式请参见Demo以及源码~ 二、支持html 由于html非常方便,所以duilib也提供了部分支持,上面的超链接按钮就是使用html来表示,在360Demo里面有大量的html支持,详情请参阅Demo,效果如图: 三、改变字体 前面介绍了Default属性,属于全局属性,而字体也是全局属性,也是定义到一级子节点。 序号从0开始,上述顺序中,第0个字体就是name为【20号字体】的字体,所以如果想用这个字体,只需要在控件的属性里指定字体序号即可,如: 四、duilib的其他操作依然是win32的做法 1、设置exe的图标 导入一个icon资源即可,操作步骤如下: 运行之后就可以看到exe的图标和任务栏的图标都变了~ 注意:如果任务栏的图标没变,则需要调用 SetIcon(IDR_MAINFRAME); // 设置任务栏图标 (其中IDR_MAINFRAME是图标的ID) 2、设置公司、产品名、描述、版本等信息 在任务管理器中可以看到很多exe的描述,此Demo的描述是Duilib

duilib库分析1.消息流程分析

喜你入骨 提交于 2019-11-28 20:41:16
看下CWindowWnd类与CPaintManagerUI类是咋进行消息分发的吧. 1. 先看下CPaintManagerUI类的MessageLoop函数: void CPaintManagerUI::MessageLoop() { MSG msg = { 0 }; while( ::GetMessage(&msg, NULL, 0, 0) ) { // 获取消息 if( !CPaintManagerUI::TranslateMessage(&msg) ) { // 消息过滤 ::TranslateMessage(&msg); ::DispatchMessage(&msg); // 分发到窗口的消息处理窗口中. 也就是调用CWindowWnd类的__WndProc函数或是__ControlProc函数. } } } 消息第一次会由CPaintManagerUI类的TranslateMessage消息接收到. 2. 调用CWindowWnd::Create创建窗口. 完成以下操作: 1) 如果要子类下Window的控件(就是系统的控件, 而不是duilib的模拟控件), 就设置__ControlProc函数为消息回调函数. 2)不子类化, 就注册窗口类. 此时设置__WndProc为窗口消息处理回调函数. 3)用CreateWindowEx API函数创建窗口.

duilib库分析2.第一篇UIManager

牧云@^-^@ 提交于 2019-11-28 20:41:11
DUiLib 源码分析 ——以UiLib 1.01版为分析目标 ---------------------------------------------------------------------------------- 分析约定: private o------- 私有的成员变量或方法 protect x------- 受保护的成员变量或方法 public +------- 公开的成员变量或方法 ---------------------------------------------------------------------------------- 本篇分析一下源文件 UIManager.h/UIManager.cpp CPaintManagerUI 成员变量 窗体句柄 o---m_hWndPaint 要CPaintManagerUI进行Direct绘图操作的窗体句柄 o---m_hwndTooltip 提示窗口句柄 o---m_hInstance 当前管理的Instance实例 o---m_hResourceInstance 当前管理的资源DLL Instance实例 o---m_pStrResourcePath 当前使用的资源路径 o---m_pStrResourceZip 当前使用的资源压缩包文件全称 ---------------------------

duilib教程之duilib入门简明教程11.部分bug

荒凉一梦 提交于 2019-11-28 20:40:49
一、WindowImplBase的bug 在第8个 教程 【2013 duilib入门简明教程 -- 完整的自绘标题栏(8)】 中,可以发现窗口最大化之后有两个问题, 1、最大化按钮的样式还是没变 ,正确的样式应该是这样的 2、再次点击最大化按钮,不能还原到正常大小。 这个是WindowImplBase的bug,已经提交给官方有一段时间了,但是貌似没有被合并到SVN上去,所以这里说明一下, 我们需要在WindowImplBase的OnSysCommand函数里,在if( ::IsZoomed(*this) != bZoomed )里面加上下面这段代码: if( ::IsZoomed(*this) != bZoomed ) { CControlUI* pbtnMax = static_cast<CControlUI*>(m_PaintManager.FindControl(_T("maxbtn"))); // 最大化按钮 CControlUI* pbtnRestore = static_cast<CControlUI*>(m_PaintManager.FindControl(_T("restorebtn"))); // 还原按钮 // 切换最大化按钮和还原按钮的状态 if (pbtnMax && pbtnRestore) { pbtnMax->SetVisible(TRUE ==

duilib教程之duilib入门简明教程13.复杂控件介绍

北战南征 提交于 2019-11-28 20:40:42
首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图: 然后将Name属性改成其他名字, 不能是【控件名+UI+数字】这种,因为这是DuiDesigner默认的名字,它不会实际写入到XML,所以如果控件的名字被取成ActiveXUI1、ActiveXUI2、ButtonUI1这种格式的话,Name属性会被忽略,可以看到XML是没有Name属性的: 所以我们必须给它们指定其他的名字,这里格式统一为【控件名+Demo+数字】,如图: XML如下(删除了暂时没用到的属性,删除了标题栏区域,要关闭窗口请按Esc或者在任务栏右键关闭): <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <Window size="800,600" sizebox="4,4,4,4" caption="0,0,0,32" mininfo="600,400"> <VerticalLayout bkcolor="#FFF0F0F0" bkcolor2="#FFAAAAA0"> <HorizontalLayout> <Progress name="ProgressDemo1" text="Progress" float="true" pos="30,28,0,0" width="139" height="30" /> <Slider name=

duilib教程之duilib入门简明教程15.自绘控件

半世苍凉 提交于 2019-11-28 20:40:25
在【 2013 duilib入门简明教程 -- 复杂控件介绍 (13) 】中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如菜单控件)。虽然duilib没有提供这些控件,但是自己绘制起来也是非常方便的,不过duilib的自绘可比MFC方便得不止一点点了,其实duilib的自绘大都不用自己绘制,就是一些控件和图片的组合而已,相当简单方便~~~ 一、菜单控件 其实菜单控件的外观和ListBox非常像,所以我们可以用 教程 13的ListBox控件模拟,也可以自行用其他的组合,由于duilib自带的Demo里有两个Menu,而且样式还很不错,所以Alberl就拿来用了,不过那几个Demo同样是复杂得要命,还记得教程13中的ListCtrl使用起来多么简单吗?如果不觉得它简单,那么再对比一下duilib自带的ListDemo,就能感觉到它的简单啦~O(∩_∩)O~ 相信看过duilib自带的MenuDemo以及ListDemo里面的菜单,都不会觉得菜单很简单吧,那么来看看下面这个菜单的实现吧~O(∩_∩)O~ 1、新建一个menu.xml,如下: <?xml version="1.0" encoding="utf-8"?> <Window size="120,82"> <VerticalLayout bkimage=

duilib教程之duilib入门简明教程14.部分bug 2

心不动则不痛 提交于 2019-11-28 20:40:23
上一个 教程 中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃 如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口都用new生成,_tWinMain改为下面这样: int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); HRESULT Hr = ::CoInitialize(NULL); if( FAILED(Hr) ) return 0; CDuiFrameWnd *pFrame = new CDuiFrameWnd; // 这里必须用new,否则有ActiveX控件时,关闭窗口会产生崩溃 pFrame->Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); pFrame->CenterWindow(); pFrame->ShowModal(); delete pFrame; ::CoUninitialize(); return 0; } 复制代码 其根本原因是ActiveX控件使用了类似COM的方式

duilib教程之duilib入门简明教程16.结合win32和MFC

冷暖自知 提交于 2019-11-28 20:40:20
虽然duilib自带在MFC中使用duilib的Demo,但只是MFC窗口和duilib窗口不重叠的情况。如果要在MFC窗口中嵌入duilib控件,或者在duilib控件中嵌入MFC的控件的话,就没有Demo可以看了,其实Alberl开始也不知道怎么办,看了下ActiveXUI控件,这个就是结合HWND的,但是由于接触duilib不久,所以一时无法看懂ActiveXUI到底是怎么将win32的HWND画上去的,只好在群里问啦,多谢铅笔群的Troy大神指导: 当时解决完之后上传了代码,不过还是有网友看不懂,于是昨晚要求Alberl先写duilib结合MFC的 教程 ,当然啦,这个教程本来就在Alberl的计划之类,所以就折中一下啦,上一篇教程只写了一半,等写完这个教程再去补充,如果小伙伴们还有其他要求,也可以提哦,如果在Alberl的计划内,Alberl会尽量满足小伙伴们的要求的~O(∩_∩)O~ 一、在MFC中使用duilib 只需要将前面教程的CDuiFrameWnd的父窗口指定为MFC的窗口就好啦, 将CDuiFrameWnd m_duiFrame; 定义为MFC的成员变量,在MFC的初始化函数OnInitDialog里面创建duilib的窗口,代码如下: // TODO: 在此添加额外的初始化代码 CPaintManagerUI::SetInstance

duilib教程之duilib入门简明教程7.XML基础类

两盒软妹~` 提交于 2019-11-28 20:40:01
现在大家应该对XML描述界面不那么陌生了,那么我们做进一步介绍。   前面的 教程 我们写了很多代码,为的是让大家了解下基本流程,其实duilib已经对常用的操作做了很好的包装,正式使用时无需像前面的教程那样写那么多代码,下面我们就来看看XML的包装类WindowImplBase:   WindowImplBase类是一个duilib的基础框架类,封装了常用操作,以方便大家使用。 它是以XML作为界面描述的,所以用它的时候,我们必须将界面描述写到XML里。   下面将是我们第三次实现Hello World程序~O(∩_∩)O~ class CDuiFrameWnd : public WindowImplBase { public: virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); } virtual CDuiString GetSkinFile() { return _T("duilib.xml"); } virtual CDuiString GetSkinFolder() { return _T(""); } }; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,

duilib教程之duilib入门简明教程8.完整的自绘标题栏

我只是一个虾纸丫 提交于 2019-11-28 20:40:01
看了前面那么多 教程 ,相信对duilib已有基本映像了,我们就快马加鞭,做出一个完整的自绘标题栏吧~ 看到下面这个效果图,小伙伴们是不是有点惊呆了呢~O(∩_∩)O~ duilib实现以上效果非常简单,   1、将按钮图片的文件夹放到exe目录, SysBtn.zip (3.27 KB, 下载次数: 133)   2、main.cpp的代码无需改动,只需改动XML,XML内容如下(受网页宽度限制,以下XML格式有点乱,请复制到本地的XML编辑器上,以方便查看): <?xml version="1.0" encoding="UTF-8"?> <Window size="800,600" mininfo="600,400" caption="0,0,0,32" sizebox="4,4,4,4"> <!-- 窗口的初始尺寸(宽800,高600)、窗口的最小尺寸(宽600,高400)、标题栏拖拽区域(高32)、可拖拽边框大小(这里添加sizebox后就可以拖拽边框调整大小了) --> <VerticalLayout bkcolor="#FFF0F0F0" bkcolor2="#FFAAAAA0"> <!-- 整个窗口的背景色 --> <!-- 标题栏区 --> <HorizontalLayout height="32" bkcolor="#FFE6E6DC" bkcolor2="