现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

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

2020-04-21 09:21 工业·编程 ⁄ 共 3835字 ⁄ 字号 暂无评论

接下来,分析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来默认处理;以上每一个步骤,都可以直接处理并返回,否则最终会调用默认处理函数处理;

给我留言

留言无头像?