接下来,分析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—(前期准备四)的更多相关文章

  1. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备三)

    接下来,我们将继续分析UIlib.h文件中其他的文件, UIContainer.h, UIRender.h, WinImplBase.h, UIManager.h,以及其他布局.控件等: 1. UIR ...

  2. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)

    接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...

  3. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备一)

    上节中提到在遍历创建控件树后,执行了以下操作:      1. CDialogBuilder构建各控件对象并形成控件树,并返回第一个控件对象pRoot:     2. m_pm.AttachDialo ...

  4. Duilib源码分析(四)绘制管理器—CPaintManagerUI

    接下来,分析uilib.h中的UIManager.h,在正式分析CPaintManagerUI前先了解前面的一些宏.结构: 枚举类型EVENTTYPE_UI:定义了UIManager.h中事件通告类型 ...

  5. Duilib源码分析(三)XML解析器—CMarkup

    上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...

  6. Duilib源码分析(六)整体流程

    在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...

  7. Duilib源码分析(一)整体框架

    Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...

  8. Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)

    Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...

  9. Memcached源码分析之内存管理

    先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...

随机推荐

  1. New Plan!

    很久无写过blogs,荒废得差不多了,在博客园虽开bolg 5年多,但由于自己工作的问题,从开始的热情记录,到冷却冰冻,再到现在重拾起来,有一番感受:从大学刚毕业的制作网页菜鸟,开始接触DIV,CSS ...

  2. 华硕win10文档类文件点击右键时会闪一下,没法用右键打开文件

    华硕的win10系统,把系统自带的福昕软件Foxit PhantomPDF卸载了就好了

  3. Windows 服务的安装(1)

    在上一篇文章中创建了window服务 http://www.cnblogs.com/netqq/p/4182259.html 在本篇中将教会你如何安装这个服务 服务程序的开发和运行环境均为:windo ...

  4. shc

    A tool  for encrytion of bash shell scripts . Install: wget http://www.datsi.fi.upm.es/~frosal/sourc ...

  5. mysql语句入门

    show databases;      展示可以用的数据库: use employees;        进入数据库: show tables;             展示可用的列表.   sho ...

  6. 12.Linux软件安装 (一步一步学习大数据系列之 Linux)

    1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...

  7. AngularJs:Service、Factory、Provider依赖注入使用与区别

           本教程使用AngularJS版本:1.5.3        AngularJs GitHub: https://github.com/angular/angular.js/       ...

  8. Learning Spark 第四章——键值对处理

    本章主要介绍Spark如何处理键值对.K-V RDDs通常用于聚集操作,使用相同的key聚集或者对不同的RDD进行聚集.部分情况下,需要将spark中的数据记录转换为键值对然后进行聚集处理.我们也会对 ...

  9. required - HTML5里的input标签的required属性提示文字修改

    input 里面增加这样的语句: <input type="text" placeholder="您的姓名" required oninvalid=&qu ...

  10. Visual Studio的背景插件

    分享一个Visual Studio的背景插件,让堆码更富情趣..哈哈   忘记一件重要的事情,我使用的是VS 2012版,其他更高版本应该是可以找到的,以下版本就不清楚了.有可能找不到,见谅,也不是我 ...