接下来,分析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. maven log4g 用法

    <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> & ...

  2. 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析

    SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...

  3. Kinect之彩色图像数据

    彩色图像很有用,很有用!!说到图像识别,未来肯定是个大方向!在机器人视觉和一些智能识别在应用很广,而获取下来的数据再加上Opencv就能做出很多很好玩很有趣的功能.这个以后等我进一步成长后再回来慢慢记 ...

  4. Spring,Mybatis 整合Memcache

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  5. 带有runat="server" 的服务器控件通过 ClientID 获取Id

    带有runat="server" 的服务器控件 获取Id <input type="text" id="txtName" runat= ...

  6. 2016百度之星 初赛2B ACEF

    做了1001 1003 1005 1006 看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=702 交题:http://acm ...

  7. php php-5.6.4.tar.bz2 apache 兼容问题 child pid 27858 exit signal Segmentation fault

    环境 [root envirotar]# uname -a Linux i2..el6.x86_64 # SMP Thu Jul :: UTC x86_64 x86_64 x86_64 GNU/Lin ...

  8. 关于Spring的核心组件以及概念

    1.什么是企业级应用 大型企业级应用的结构是非常复杂的,涉及外部资源非常多,事务密集,数据规模大,用户数量多,有较强的安全性考虑和较高的性能要求.   2.Spring概念理解 Spring是一个轻量 ...

  9. 软工实践——github文件整理

    软工实践中,整理github上文件遇到的一些问题 先扔github链接Transcend/ActivityHelper 1.原来呢我们团队的github上的文件的安排十分凌乱,没有归档.把说明文档.源 ...

  10. angularjs $scope.$apply 方法详解

    myApp.controller('firstController',function($scope,$interval){ $scope.date = new Date(); setInterval ...