Duilib 使用的一些记录-01
2016-12-21 11:04
302 查看
Duilib 使用的一些记录-01
基本使用
基本的使用不多说了,网上的教程应该写的很好。这里做个统计与整理。GitHub上搜索下就可以获取到最新的库版本。有很多改版库的,大家都可以看看。搜索一下或者认真看看源码带的Demo也基本上能了解个大概。
这里记录下,我使用时候遇到的一些问题。
开始
基本介绍
先弄清楚怎么运行的最重要了。先来个简单的duilib框架吧。这个框架图我在网上找的 应该是比较老的了。但是总体上来说是没有问题的。
整体结构
基本模块和基本的类继承情况如图。大体上的情况下图已经写的清楚了。可能近来有更新的情况,有点不同。但是大体上应该相同。库的组成
Duilib库组成,可以简单的分为三块。分别是工具类;主要指的是基本的绘图元素(cpoint等),简单的容器(cduistring等),简单的第三方库(zip)
控件类;所有UI的实现控件。
核心类;XML解析,绘图渲染等
控件的基类
CControlUI 是所有控件的基类。也是组成控件树的基本元素,控件树中所有的节点都是一个CControlUI。它基本包括了所有控件公共的属性,如:位置,大小,颜色,是否有焦点,是否被启用等等。当然这个类中还提供了非常多的基础函数,用于重载来实现子控件,如获取控件名称和ClassName,是否显示等等。
容器的基类
有了基本的控件基类之后,我们就需要容器来将他管理起来,这个容器就是CContainerUI,其内部用一个数组来保存所有的CControlUI的对象,后续的所有工作,就都是基于这个对象来进行的了。 子控件的管理,例如查找与其生命周期的问题,都是在此类中完成。
窗口的创建
窗口的窗口跟WIN32差不多。如下详细情况在注释中有写的。整体来说窗口创建的情况还是很清晰的。
创建过程中其中较为重要是XML的解析加载绘制了。推荐可以跟着代码进去看看整个流程过一遍,这样能够更好的了解duilib。
intAPIENTRY WinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow) { CPaintManagerUI::SetInstance(hInstance); // 第一步: 实例句柄与渲染类关联 CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));//指定资源目录 HRESULTHr = ::CoInitialize(NULL); // 第二步:初始化COM库, 为加载COM库提供支持 if( FAILED(Hr) ) return0; CMainFrameWnd* pFrame = newCMainFrameWnd(); // 第三步:创建窗口类 if( pFrame == NULL ) return0; pFrame->Create(NULL, _T("主程序"), UI_WNDSTYLE_FRAME, 0L, 0, 0, 800, 600); // 第四步:注册窗口类与创建窗口 // 实际上这里调用Create操作和Win32创建窗体一样,内部实际上做了以下操作: // -> RegisterSuperclass (注册一个超类 即已有一个窗口类的基上再注册一个窗口类) // -> RegisterWindowClass (注册窗口类) // -> ::CreateWindowEx (创建窗口,此时触发 WM_CREATE 消息) // -> HandleMessage ( WM_CREATE消息处理OnCreate) pFrame->CenterWindow(); // 第五步:窗口居中显示 ::ShowWindow(*pFrame, SW_SHOW); CPaintManagerUI::MessageLoop();// 第六步:处理消息循环 ::CoUninitialize(); // 第七部:退出程序并释放COM库 return0; }
消息响应
第一步:注册消息处理函数在CWindowWnd注册窗口(RegisterWindowClass())里,注册消息回调函数(__WndProc);
第二步:消息分发
消息回调函数(处理所有系统发送的消息),然后回调函数通过子类的CMainFrameWnd::HandleMessage对消息进行分发。 非窗口消息通过CMainFrameWnd::HandleMessage调用CPaintManagerUI::MessageHandler进行分发。
第三步:消息循环
在CPaintManagerUI类的MessageLoop处理消息循环; 接收到消息以后,进入消息回调函数(__WndProc);
第四步:处理控件消息
(注:以下内容以鼠标单机Button事件为例)
例如:鼠标按下时(WM_LBUTTONDOWN),查找鼠标点击的控件。 处理控件的鼠标按下消息:通过调用基类CControlUI:: DoEvent,引起子类如CButtonUI::DoEvent事件。 子类的DoEvent对不同类型的事件进行处理。通过CPaintManagerUI:: SendNotify回调控件注册的事件。
Duilib 01
很不善于表达啊,很多都是前人已经完成的,写的挺好的。直接copy了。
相关文章推荐
- 使用XML记录数据的一些体会
- GridView使用一些记录
- spring使用的一些记录
- MS chart 使用的一些记录
- [项目过程中所遇到的各种问题记录]ORM篇——使用NHibernate配置对象实体的一些小问题 22
- VS2005 && MasterPage && Form 的一些相关使用记录
- 【转】在vs中使用ZedGraph控件的一些记录
- 使用PHP记录一些排序算法[折半查找]
- 记录:树形控件的一些使用方法(和sql server 结合显示)
- 在vs中使用ZedGraph控件的一些记录
- 在vs中使用ZedGraph控件的一些记录
- ASP.NET新手使用记录01
- 在vs中使用ZedGraph控件的一些记录
- 如下主要记录在学习使用EXTJS结合WCF的时候的一些心得
- Linux命令的一些记录(四):rpm命令的一些使用
- 虚拟主机使用记录(01)
- Oracle SQLPlus 一些使用经验记录(设置环境变量和字符串比较)
- 记录一些BCB6的使用心得
- [项目过程中所遇到的各种问题记录]ORM篇——使用NHibernate配置对象实体的一些小问题
- [记录]在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法