1、duilib中各个类的简单介绍

  2、源码分析

  3、各个控件可以设置的属性

  4、duilib的消息流程处理

  5、工程编译入门

  6、MFC中混合使用duilib制作界面

  7、从Win32窗口到duilib

  8、实例:使用duilib开发的简单Windows安装包

  9、duilib各种布局的含义

  10、duilib中V和H布局中的滚动条问题

  

  7 ---> CWindowWnd直接包装了Win32里的窗口函数。

  Win32里有什么窗口函数,无非就是注册、创建、显示、消息循环、窗口回调,注意这些都是全局的C函数,

  CWindowWnd直接以C++的形式包装了这窗口显示基本要素,注意其中窗口回调一定要是静态的可在编译期确定编译地址的。利用传递this指针给类内静态成员函数的做法也很常见。

  CWindowWnd直接抛弃了MFC的所有机制,千万不要再记住MFC里那些烦人的机制了!

  部分摘要记录:

  1 --->

  CWindowWnd,窗口对象管理父类,主要作用:

  1)        创建窗口。

  2)        窗口消息过程处理。

  3)        提供窗口子类化与超类化接口。

  2.        CDialogBuilder,控件布局类,主要作用:

  1)        读取XML脚本,分析脚本,构建控件树。

  2)        创建控件对象。

  3.        CPaintManagerUI,窗口消息及图形绘制管理器类,与窗口绑定,主要作用:

  1)        绘制控件。

  2)        消息管理。

  3)        事件通知。

  4.        INotifyUI,事件通知抽象类,主要作用:

  1)        重载Notify虚函数,处理事件通知。

  自问自答1:

  CWindowsWnd与CPaintManagerUI的关系?

  duilib本质上没有脱离Windows编程,也就是Windows的核心编程一套API,仍然是使用的。提到Wnd(也就是窗口),你想到什么?当然是窗口显示过程的一套流程,建立窗口样式类(最重要的包括窗口各种属性、窗口名称和窗口过程回调),注册该窗口类,创建窗口,显示窗口,消息循环,处理具体的消息回调过程。

  CWindowsWnd继承于CWnd,对是Wnd的封装,对Win32 窗体的封装。

  传统Windows的绘图又是怎样的呢?窗口CWnd的核心是HWnd,HWnd关于一个HDC,就是跟绘图相关的都被HDC封装了。GDI提供的是一组API,绘图对HDC操作,也就相当于在Wnd上画图了。

  传统Windows里每个控件都是一个窗口,包含上面所说的窗口本质都是一样的,只是形成了父子窗口的关系。

  CPaintManagerUI就是跟duilib与传统windows的结合了。duilib的核心是在窗口上直接画UI,而不是采用一个个子窗口。

  CPaintManagerUI负责这些控件的绘制,同时,这些控件是画在Wnd上的,CPaintManagerUI肯定要负责与CWnd的交互。

  这些交互是什么呢?一个控件可能与父窗口产生的交互是什么?

  a、父窗口刷新,子窗口也会刷新。

  b、父窗口收到鼠标点击,键盘按下事件,一定要找到对应的控件,然后把消息传递给该控件。

  比如鼠标停留在Button上,Button四周显示虚线,这些就是在控件内部要做的处理。

  c、子控件获得某些消息后,最终的消息处理自身是不能处理的(这属于业务逻辑,而不是控件基础功能)。

  能想到的交互就这么些,不同控件能接收的消息不同,内部对消息的基础反映也不同,能给父窗口发送的消息也不一样。

  CPaintManagerUI就完成这样一个交互。

  6 ---> 这个例子给了我很大的启示,我接受到的传统GUI怎么做的,duilib界面怎么做的,有一个对比,很多事情就豁然开朗了。

  传统MFC窗口继承与CWnd,当使用对话框时,资源IDD_DIALOG对应生成一个窗口, CMyDialog子类化(SubClass)这个窗口,SubClass这个词是有误解的,实质是CMyDiglog类托管了窗口的回调过程。

  资源IDD_DIALOG上的每一个控件都会生成一个窗口,在CMyDialog中怎么使用这些窗口呢?GetDlgItem可以通过窗口ID返回窗口类对象,如CRichEdit *pEdit。控件与父窗口的交互过程是这样的,每一个窗口都会有回调函数,系统处理消息,将每个消息发送给对应窗口的回调函数,这些消息将被CWnd或者CEdit以成员函数的方式处理。

  对于控件的逻辑处理,控件将发消息给父窗口,交给父窗口处理(通过向父窗口发送消息的方式)。

  再来看下CDuilib_Dialog(下面代码中命名为CFrameWindowWnd )。

 class CFrameWindowWnd : public CWindowWnd, public INotifyUI
{
public:
CFrameWindowWnd() { };
LPCTSTR GetWindowClassName() const { return _T("UIMainFrame"); };
UINT GetClassStyle() const { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };
void OnFinalMessage(HWND /*hWnd*/) { delete this; }; void Notify(TNotifyUI& msg)
{
if( msg.sType == _T("click") ) {
if( msg.pSender->GetName() == _T("closebtn") ) {
Close();
}
}
} LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if( uMsg == WM_CREATE ) {
m_pm.Init(m_hWnd);
CControlUI *pButton = new CButtonUI;
pButton->SetName(_T("closebtn"));
pButton->SetBkColor(0xFFFF0000);
m_pm.AttachDialog(pButton);
m_pm.AddNotifier(this);
return ;
}
else if( uMsg == WM_DESTROY ) {
::PostQuitMessage();
}
LRESULT lRes = ;
if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
} public:
CPaintManagerUI m_pm;
};
CFrameWindowWnd中只重载了5个函数,前三个都很好理解
1、GetWindowClassName 返回窗口创建时的窗口名称,创建窗口时需要。
2、GetClassStyle 返回窗口创建时的样式。这也没什么说的。
3、OnFinalMessage 这个是对WM_DESTORY消息的再处理。应该是CWindowWnd::HandleMessage里处理WM_DESTORY消息调用了OnFinalMessage虚函数。
4、NotifyUI 是自绘控件发给CWindowWnd的消息,在这里处理各控件消息即可。控件有各种类型、不同控件也有各种消息。
5、LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)里面代码都值得仔细揣摩。
一、
if( uMsg == WM_CREATE ) {          /* 本窗口创建时 */
21 m_pm.Init(m_hWnd);     /* CPaintManagerUI 与本窗口的关联 直接关联了m_hWnd */
22 CControlUI *pButton = new CButtonUI;  
23 pButton->SetName(_T("closebtn"));
24 pButton->SetBkColor(0xFFFF0000);
25 m_pm.AttachDialog(pButton);  /* 控件与CPaintManager的关系 */
26 m_pm.AddNotifier(this); /* 设置了INotify的回调,控件产生的消息都通过此接口返回到CFrameWindowWnd处理,INotify回调接口设置的就是CFrameWindowWnd类 */
27 return 0;
28 }
二、
  if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;    /* 消息先交给控件自身处理 */
24
25 return CWindowWnd::HandleMessage(uMsg, wParam, lParam); /* 控件不处理的话再由窗口来处理 */ 这样CPaintManagerUI 自绘控件、父窗体、INotify接口的关系大致弄清楚了,消息循环机制也大概弄清楚了。
 再看看怎么创建这个窗口的。
 if(m_dlgDuilib == NULL)
{
m_dlgDuilib.Create(this->m_hWnd, NULL, UI_WNDSTYLE_DIALOG & (~( WS_BORDER | WS_CAPTION )) , , , , , );
}
m_dlgDuilib.CenterWindow();
m_dlgDuilib.ShowWindow(TRUE);
}

  Create函数不是CWnd::Create,应该是对CWnd::Create函数的包装,此函数应该包括了窗体注册(所以需要窗体名字、窗体的大小等参数)。

  7 ---> 解决了6中的一些困惑。

duilib查看过的资料整理的更多相关文章

  1. zz 圣诞丨太阁所有的免费算法视频资料整理

    首发于 太阁实验室 关注专栏   写文章     圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法 ...

  2. H.264的一些资料整理

    本文转载自 http://blog.csdn.net/ljzcom/article/details/7258978, 如有需要,请移步查看. Technorati 标签: H.264 资料整理 --- ...

  3. 转:基于IOS上MDM技术相关资料整理及汇总

    一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...

  4. (转载)2016 CCF大数据与计算智能大赛 开源资料整理

    本文转载自:http://blog.sina.com.cn/s/blog_5399b8660102wxks.html 2016 CCF 大数据与计算智能大赛已经落下帷幕,11个赛题由众多大神包揽奖项, ...

  5. Niagara帮助文档资料整理

    1.任何软件额发布都会有说明文档,有的不会附具体实践的操作步骤,存在不懂得问题一般可以通过查看榜文文档解决问题 一些软件的帮助文档是一PDF格式存储在软件安装的目录下面,如Niagar workben ...

  6. 对word2vec的理解及资料整理

    对word2vec的理解及资料整理 无他,在网上看到好多对word2vec的介绍,当然也有写的比较认真的,但是自己学习过程中还是看了好多才明白,这里按照自己整理梳理一下资料,形成提纲以便学习. 介绍较 ...

  7. 基于IOS上MDM技术相关资料整理及汇总

    (转自:http://www.mbaike.net/special/1542.html) 一.MDM相关知识:MDM (Mobile Device Management ),即移动设备管理.在21世纪 ...

  8. POI3的资料整理

    转自http://aman.cao.blog.163.com/blog/static/32951336201010823557408/ POI3的资料整理一.POI简介 Jakarta POI 是ap ...

  9. Nodejs安装使用,以及不错的Nodejs或者JS资料整理

    先按照这个教程来学习:Node.js教程 - 菜鸟教程网 在mac上使用brew安装了nodejs,中间还是用到了先下载到cache目录的方法. 但是后来发现这样按照的node,没有安装npm. 找到 ...

随机推荐

  1. hdu 4632 子字符串统计的区间dp

    题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...

  2. TopCoder SRM 701 Div2 Problem 900 ThueMorseGame(博弈+预处理)

    题意  Alice和Bob在玩一个游戏,Alice先手. 每次一个人可以从一堆式子中拿走任意数量(不超过m)的式子. 取走最后一颗式子的人胜利. 当一个取完某一步的时候剩下的石子数量的二进制表示中1的 ...

  3. 洛谷——P2706 巧克力

    P2706 巧克力 题目背景 王7的生日到了,他的弟弟准备送他巧克力. 题目描述 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧克力盒 ...

  4. 洛谷——P1086 花生采摘

    P1086 花生采摘 题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”. 鲁宾逊先生和多多都 ...

  5. k8s入门简介

    1.docker的三种编排工具 Docker的第一类编排工具: a.docker compose(docker原生):只能对一个主机上的容器进行编排,无法编排多个主机上的容器; b.docker sw ...

  6. Codeforces Round #321 (Div. 2) Kefa and Park 深搜

    原题链接: 题意: 给你一棵有根树,某些节点的权值是1,其他的是0,问你从根到叶子节点的权值和不超过m的路径有多少条. 题解: 直接dfs一下就好了. 代码: #include<iostream ...

  7. redis 延迟消息

    1.查询下redis 是否打开了键空间通知功能 发现打开了,如果没有打开可以在执行下 我们可以看到参数设置 2.订阅下键空间或者事件通知 订阅键空间:subscribe __keyspace@0__: ...

  8. jar word 模板操作比较好用的工具

    个人觉得比较好用的java word 模板 http://deepoove.com/poi-tl/

  9. spring管理事务

    2.1 事务管理器 Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现. Spring事务管理器 ...

  10. C中的继承和多态

    昨天同学面试被问到这个问题,很有水平,以前都没有遇到过这个问题,一时自己也不知道怎么回答. 网上学习了一下,记录以备后用! C/C++ Internals : 里面的问题都写的不错,可以读读! Ref ...