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

时间:2022-08-08 00:11:29

接下来,分析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源码分析&lpar;四&rpar;绘制管理器—CPaintManagerUI—&lpar;前期准备三&rpar;

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

  2. Duilib源码分析&lpar;四&rpar;绘制管理器—CPaintManagerUI—&lpar;前期准备二&rpar;

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

  3. Duilib源码分析&lpar;四&rpar;绘制管理器—CPaintManagerUI—&lpar;前期准备一&rpar;

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

  4. Duilib源码分析&lpar;四&rpar;绘制管理器—CPaintManagerUI

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

  5. Duilib源码分析&lpar;三&rpar;XML解析器—CMarkup

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

  6. Duilib源码分析&lpar;六&rpar;整体流程

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

  7. Duilib源码分析&lpar;一&rpar;整体框架

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

  8. Solr4&period;8&period;0源码分析&lpar;23&rpar;之SolrCloud的Recovery策略&lpar;四&rpar;

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

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

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

随机推荐

  1. Java系列笔记&lpar;2&rpar; - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...

  2. ABP框架详解(一)ABPBootstrapper

    在ABP框架的AbpBootstrapper主要用于框架的基本配置的注册和初始化,在Web应用启动阶段实例化一个AbpBootstrapper并调用Initialize方法初始化,该类主要包含两个公有 ...

  3. Atitit&period;如何避免公司破产倒闭的业务魔咒

    Atitit.如何避免公司破产倒闭的业务魔咒 1. 大型公司的衰落或者倒闭破产案例1 1.1. 摩托罗拉1 1.2. 诺基亚2 1.3. sun2 2. 为什么他们会倒闭?? 常见的一些倒闭元素2 2 ...

  4. Python For Data Analysis -- NumPy

    NumPy作为python科学计算的基础,为何python适合进行数学计算,除了简单易懂,容易学习 Python可以简单的调用大量的用c和fortran编写的legacy的库 Python科学计算的这 ...

  5. 如何在magento后台增加一个自定义订单状态

    magento后台订单状态(order status)只有Pending.Processing.On Hold.Closed.Canceled.Pending Payment 等等,如何在magent ...

  6. 别人的的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. LBS云端数据删除和上传

    这里采用C#模拟表单提交,实现LBS云端删除和csv格式文件的上传. 删除: /// <summary> /// 从LBS云端删除数据 /// </summary> /// & ...

  8. python cmd命令调用

    关于python调用cmd命令: 主要介绍两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.sy ...

  9. angular学习笔记01

    angular.js路由功能 用于实现单页应用 //html 代码 <div ng-view></div> //js代码 angular.module('myM1',['ng' ...

  10. Common-used commands in Docker

    1. Start running a image in background mode docker run -it -d <image>:<tag> e.g. docker ...