Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备四)
接下来,分析uilib.h中的WinImplBase.h和UIManager.h;
WinImplBase.h:窗口实现基类,已实现大部分的工作,基本上窗口类均可直接继承该类,可发现该类继承于多个类,我们将对其父类逐一分析,然后整合分析该窗口实现基类,我们按照继承顺序开始
接下来的分析;
CWindowWnd:UIBase.h中的窗口类,已在前面章节作了分析,主要实现了基本的窗口注册、创建、显示、消息处理等基本的封装显示,这样WindowImplBase已具备窗口类的基本特征;
CNotifyPump:UIBase.h中的通告消息泵类,主要用于对虚拟窗口以及对继承树的各个添加到_messageEntries的消息映射遍历分发,并执行相应的处理函数,这样WindowImplBase就具备该消息泵类的特性;
INotifyUI:UIManager.h中的消息通告抽象基类,提供最基本的单一接口参数msg为TNotifyUI消息的Notify,作为消息监听并分发的作用;
IMessageFilterUI:UIManager.h中的消息过滤器抽象基类,提供了单一接口MessageHandler,主要提供对某些用户感兴趣的消息、过滤、整合;
IDialogBuilderCallback:UIDlgBuilder.h中的控件构造器回调基类,提供了单一接口CreateControl,参数pstrClass为创建的控件名字符串其真实的作用是创建用户自定义控件的一个接口,这样用户可以
实现自己的控件在控件被创建的时候将调用该接口,并返回该创建的控件对象(该对象类应继承于CControlUI)。
基本上继承了以上几个类,就可以实现窗口类,故本类需要实现的是父类相应的接口实现还有一些其他的消息处理等接口实现;
依次顺序:
InitWindow:在开始初始化窗口OnCreate后的对窗口相关操作可以放在该函数中,并根据需要实现该接口;
OnFinalMessage:来自于类CWindowWnd,提供在窗口销毁后最后的一个消息WM_NCDESTROY时调用的接口,可以用来处理窗口释放后需要释放的其他资源或是其他的收尾操作,在本类中用于移除m_PaintManager
对象中的对应本窗口对象的预处理消息过滤器以及本窗口对象的通告消息者、计时器、异步消息发布者;
Notify:消息通告接口,来自于类INotifyUI,在本类中未作特殊处理,调用基类实现;
(题外话:DUI_DECLARE_MESSAGE_MAP,声明UI消息映射,主要增加_messageEntries、messageMap、GetMessageMap、_GetBaseMessageMap这几个静态类成员对象、函数,在消息传递、查找的过程中可以找到
本类对象需要处理的消息对应的消息处理函数(基本上类似于MFC的那一套消息机制),DUI_BEGIN_MESSAGE_MAP,DUI_END_MESSAGE_MAP在cpp文件中并增加了DUI_MSGTYPE_CLICK<->OnClick间的消息映射。)
OnClick:点击消息处理函数,内部实现了对关闭按钮、最小化按钮、最大化按钮、以及恢复还原按钮的处理,参数msg各成员含义见TNotifyUI(见绘制管理器(前期准备一) ),这些值如何得到将在UIManager.h中分析到;
GetSkinFolder:获取控件皮肤目录路径,纯虚函数,子类须提供实现,用以加载XML文件资源;
GetSkinFile:获取控件皮肤文件路径,纯虚函数,子类须提供实现,用以加载xml文件资源;个人认为对于以上两个函数接口命名不够友好,表达的含义不够明确。
GetWindowClassName:获取窗口类名,来自于CWindowWnd,纯虚函数,子类须提供实现,主要用来注册窗口类用的;
ResponseDefaultKeyEvent:默认的按键相应事件处理,事实上处理WM_KEYDOWN虚拟键VK_RETURN、VK_ESCAPE,其中VK_RETURN:不做任何处理直接返回,VK_ESCAPE:将调用Close,发送WM_CLOSE消息关闭本窗口,
该函数在消息过滤器处理MessageHandler中被调用;
m_PaintManager:CPaintManagerUI类对象,其主要担任了重要的界面绘制工作、消息预处理、过滤,具体实现将在UIManager.h中分析;
m_lpResourceZIPBuffer:静态成员数据,为资源的zip压缩包数据缓冲区;
GetClassStyle:获取类风格,来自于CWindowWnd,纯虚函数,子类可提供自己的实现,主要用来注册窗口类用的;
GetResourceType:获取资源类型,枚举UILIB_RESOURCETYPE中提供了UILIB_FILE、UILIB_ZIP、UILIB_RESOURCE、UILIB_ZIPRESOURCE四种资源类型,
GetZIPFileName:获取压缩资源文件名称;
GetResourceID:获取资源ID,主要用来获取可执行文件或资源DLL中的资源;
CreateControl:创建控件对象,来自于IDialogBuilderCallback,纯虚函数,提供自定义空间对象接口;
MessageHandler:消息过滤器,来自于IMessageFilterUI,纯虚函数,提供预处理、过滤消息的接口;
OnClose:窗口关闭时WM_CLOSE对应的消息处理函数(未处理);
OnDestroy:窗口销毁时WM_DESTROY对应的消息处理函数(未处理);
OnNcActivate:将要显示或非激活时重绘非客户区WM_NCACTIVATE对应的消息处理函数(当窗口为最小化时不作处理);
OnNcCalcSize:窗口重新设置边缘宽度时WM_NCCALCSIZE对应的消息处理函数(最大化时设置窗口为默认显示器合适高宽度);
OnNcPaint:绘制非客户区时WM_NCPAINT对应的消息处理函数(未处理);
OnNcHitTest:命中测试,用来获取鼠标当前命中的位置,会根据鼠标当前的坐标来判断鼠标命中了窗口的哪个部位,消息响应函数的返回值指出了部位;
OnGetMinMaxInfo:获取当前窗口最大化时候的大小,计算正确原点坐标位置,对应WM_GETMINMAXINFO消息处理函数;
OnMouseWheel:鼠标滚轮时鼠标滚轮的消息,WM_MOUSEWHEEL对应的消息处理函数(未处理);
OnMouseHover:鼠标停留在窗口一定时间后产生的WM_MOUSEHOVER消息对应的处理函数(未处理);
OnSize:窗口大小改变或第一次显示时,产生的WM_SIZE消息对应的消息处理函数(处理计算窗口新的圆角矩形大小);
OnChar:键盘按下输入有效字符后产生的WM_CHAR消息对应消息处理函数(未处理);
OnSysCommand:系统命令(窗口菜单、最大、最小化、还原关闭按钮时)WM_SYSCOMMAND消息对应消息处理函数(对于SC_CLOSE消息,则发送WM_CLOSE消息关闭窗口,
其他系统命令消息则交给了父类CWindowWnd::HandleMessage来处理);
OnCreate:窗口创建时,产生的WM_CREATE消息对应的消息处理函数(包括设置窗口风格类型、位置、解析资源文件并创建各控件等);
OnKeyDown:键盘按下时产生的WM_KEYDOWN对应的消息处理函数(未处理);
OnKillFocus:窗口失去焦点时产生的WM_KILLFOCUS消息对应的消息处理函数(未处理);
OnSetFocus:窗口获取到焦点时产生的WM_SETFOCUS消息对应的消息处理函数(未处理);
OnLButtonDown:鼠标左键按钮时产生的WM_LBUTTONDOWN消息对应的消息处理函数(未处理);
OnLButtonUp:鼠标左键按下后抬起时产生的WM_LBUTTONUP消息对应的消息处理函数(未处理);
OnMouseMove:鼠标在窗口上移动时产生的WM_MOUSEMOVE消息对应的消息处理函数(未处理);
HandleMessage:消息分发处理函数,内部处理各种收到的消息或处理或分发;
HandleCustomMessage:用户自定义的消息处理函数,专门提供给用户处理自定义消息的接口;
GetStyle:获取窗口风格,给予客户修改创建后的窗口风格的接口(获取到内部将窗口的WS_CAPTION取消了的风格);
总结消息调用流程:首先HandleMessage内部先处理是否为当前窗口的消息,若不处理则调用HandleCustomMessage来处理是否为用户自定义消息,若不是或不处理则调用m_PaintManager.MessageHandler当作内部控件消息来处理,
若不处理则继续调用基类的CWindowWnd::HandleMessage来处理,即调用DefWindowProc来默认处理;以上每一个步骤,都可以直接处理并返回,否则最终会调用默认处理函数处理;
Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备四)的更多相关文章
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备三)
接下来,我们将继续分析UIlib.h文件中其他的文件, UIContainer.h, UIRender.h, WinImplBase.h, UIManager.h,以及其他布局.控件等: 1. UIR ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)
接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备一)
上节中提到在遍历创建控件树后,执行了以下操作: 1. CDialogBuilder构建各控件对象并形成控件树,并返回第一个控件对象pRoot: 2. m_pm.AttachDialo ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI
接下来,分析uilib.h中的UIManager.h,在正式分析CPaintManagerUI前先了解前面的一些宏.结构: 枚举类型EVENTTYPE_UI:定义了UIManager.h中事件通告类型 ...
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- Duilib源码分析(六)整体流程
在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...
- Duilib源码分析(一)整体框架
Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...
- Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)
Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...
- Memcached源码分析之内存管理
先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...
随机推荐
- HTML5的Audio标签打造WEB音频播放器
目前,WEB页面上没有标准的方式来播放音频文件,大多数的音频文件是使用插件来播放,而众多浏览器都使用了不同的插件.而HTML5的到来,给我们提供了一个标准的方式来播放WEB中的音频文件,用户不再为浏览 ...
- NancyFX 简介
Nancy是.NET 平台的微框架.在受到Ruby社区的Sinatra框架启发下,NancyFx框架提供一个.NET平台下的低门槛.易上手的可用于Web开发工具包. 请注意我说的是可用于Web开发,这 ...
- SQL Sever无法打开链接对话框,未将对象引用设置到对象的实例。(AppIDPackage)
前几天刚做完系统,先装的是SQL Sever2008,装完后还试了一下,OK~没问题,然后就继续装VS2012等一些软件.搞到很晚没有继续试试就睡了,第二天运行SSMS出问题了..(如图 1.0 所示 ...
- poj Flip Game 1753 (枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27005 Accepted: 11694 Descr ...
- Ubuntu14.04 lamp环境 php mongodb扩展安装
安装pecl支持: sudo apt-get install php5-dev php5-cli php-pear 安装mongo驱动 sudo pecl install mongo 修改php.in ...
- ueditor 1.4.3 gbk asp 上传中文乱码 终极解决方法 ie6 ie8 也适用
[摘要:百度编纂器1.43 gbk asp 题目 1.firefox3.0下 单图上传 面没有了 面多图上传 中央的蓝色按钮(即 面击挑选图片)没有表现(附件上传出那个题目) 没有晓得我的水狐吃翔了 ...
- easyui Datagrid查询报错Uncaught TypeError:Cannot read property 'length' of undefined
1.问题描述 easyui中datagrid执行loadData方法出现如下异常:Cannot read property 'length' of undefined 2.一开始怀疑是js或者页面的问 ...
- 第三篇 基于.net搭建热插拔式web框架(重造Controller)
由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并且http上下文不支持跨域,所以我们要重造一个contro ...
- KVM 虚拟机联网方式:NAT 和 Bridge
KVM 客户机网络连接有两种方式: 用户网络(User Networking):让虚拟机访问主机.互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整.NA ...
- JavaScript的==和===运算符
JavaScript提供两个相等运算符:==和 ===. 简单说,它们的区别是相等运算符( ==)比较两个值是否相等,严格相等运算符( ===)比较它们是否为“同一个值”.如果两个值不是同一 ...