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

时间:2022-10-11 23:30:45

接下来,分析uilib.h中的UIManager.h,在正式分析CPaintManagerUI前先了解前面的一些宏、结构;

  枚举类型EVENTTYPE_UI:定义了UIManager.h中事件通告类型TEventUI结构中的各Type值,从UIEVENT__FIRST至UIEVENT__LAST分别定义了  键盘按键事件

  (UIEVENT__KEYBEGIN~UIEVENT__KEYEND)、鼠标事件(UIEVENT__MOUSEBEGIN~UIEVENT__MOUSEEND)、以及其他的几个事件;

  UIFLAG__XXX:宏定义了UIFLAG_TABSTOP(TAB支持)、UIFLAG_SETCURSOR(光标支持)、UIFLAG_WANTRETURN(返回值支持)提供CControlUI::GetControlFlags返回控件的标识,

   UIFIND_XXX:提供了FindControl接口的标识;

  UISTRETCH_XXX:提供了CDialogLayout扩展标识,目前未用到;

  UISTATE_XXX:提供了控制控件绘图相关的标识;

   TFontInfo:字体信息结构,hFont:字体句柄,sFontName:字体名称,iSize:字体宽度大小,bBold:字体加粗,bUnderline:字体下划线,bItalic:字体斜体,tm:当前的hFont下字体信息;

  TImageInfo:图片信息结构,hBitmap:图片句柄,nX:图片宽度,nY:图片高度,alphaChannel:是否支持alpha通道,sResType:restype资源类型,dwMask:图片掩码值;

  TEventUI:控件事件UI结构,作为控件的通告消息,Type:事件类型(EVENTTYPE_UI),pSender:当前事件控件发起者,dwTimestamp:时间戳,ptMouse:鼠标单击位置,chKey:按键

  字符,wKeyState:按钮状态(弹起、按下),wParam、lParam:附加信息;

  TRelativePosUI:父窗口相对位置结构,bRelative:是否为相对位置,szParent:父窗口大小,nMoveXPercent、nMoveYPercent:相对坐标移动位置百分比(调整left、top),nZoomXPercent、

  nZoomYPercent:相对坐标放缩位置百分比(调整bottom、right);

  INotifyUI:通告消息监听者,用以对通告消息分发;

  IMessageFilterUI:消息滤波器,用以对一些感兴趣的消息过滤、预处理;

  ITranslateAccelerator:翻译加速器,处理快捷键、tab等消息,目前仅用在UIWebBrowser.h中,CPaintManagerUI中的TranslateMessage负责对添加到的翻译加速器m_aTranslateAccelerator

  的容器进行遍历处理;

  typedef CControlUI* (*LPCREATECONTROL)(LPCTSTR pstrType);声明的函数,用在用户自定义的创建控件工厂中,用户可通过加载插件的方式来创建指定名称的自定义控件

  (即继承于CControlUI);

  CPaintManagerUI:绘制管理器类,处理了大部分的绘制工作、控件消息分发处理;以下依次按照顺序函数或数据成员进行分析;

    CPaintManagerUI:构造函数,内部主要初始化默认字体、更新区域矩形画笔、注册并初始化通用公共控件、加载msimg32.dll以支持新的API应用程序接口和GDI32相关特性,以及初始化其他

    必要的参数;
      ~CPaintManagerUI:析构函数内部,主要清理延迟清理的资源控件树结构、通告消息对象、删除对象树,释放默认字体资源、以及其他字体、图片、默认属性列表、选项组、计时器等各种资源;
     Init:初始化所维护的窗口句柄,参数hWnd即为绘制管理的窗口句柄,并维护该窗口上下文,此外将该本管理器UI对象加入内部预处理器,以处理过滤全局的消息,该函数在窗口创建时被调用;
     NeedUpdate:需要被更新,一般在需要重新布局控件时会用到;
     Invalidate:绘制指定区域;
     GetPaintDC:获取窗口上下文绘制DC;
     GetPaintWindow:获取绘制窗口句柄;
     GetTooltipWindow:获取提示信息窗口句柄;
     GetMousePos:获取最近一次鼠标的位置;
     GetClientSize:获取客户端窗口大小(宽度、高度);
     GetInitSize/SetInitSize:获取/设置窗口初始化时的大小(含非客户区);
     GetSizeBox/SetSizeBox:获取/设置窗口可拖动改变窗口大小的边距;
     GetCaptionRect/SetCaptionRect:获取/设置窗口可拖动的标题栏大小的边距,最后一个参数为离上边框的距离;
     GetRoundCorner/SetRoundCorner:获取/设置窗口的圆角大小,以创建圆角矩形区域;
     GetMinInfo/SetMinInfo/GetMaxInfo/SetMaxInfo:获取/设置窗口最小、最大大小;
     GetTransparent/SetTransparent:获取/设置窗体透明度,内部通过先获取到User32.dll中SetLayeredWindowAttributes并添加窗口扩展风格属性WS_EX_LAYERED后才能设置透明属性;
     SetBackgroundTransparent:设置窗口是否使用静态透明背景;
     IsShowUpdateRect/SetShowUpdateRect:获取/设置显示更新区域(如显示,则使用红色边框,内部透明画刷的矩形区域显示);
 
     静态成员函数(以下几个函数,这些主要是对资源相关的):
     GetInstance/SetInstance:获取/设置当前应用程序实例句柄对象(一般在创建窗口之前调用);
     GetInstancePath:获取当前应用程序实例所在目录路径;
     GetCurrentPath/SetCurrentPath:获取/设置当前目录;
     GetResourceDll/SetResourceDll:获取/设置资源DLL或应用程序资源句柄;
     GetResourcePath/SetResourcePath:获取/设置资源路径;
     GetResourceZip/SetResourceZip:获取/设置ZIP压缩资源路径;
     IsCachedResourceZip:是否使用的是缓存ZIP压缩资源;
     GetResourceZipHandle:获取ZIP压缩资源句柄;
     GetHSL/SetHSL:获取/设置当前HSL值(色调、饱和度、亮度),在设置HSL时重绘整个控件树;
     ReloadSkin:重新加载皮肤(图片);
     LoadPlugin/GetPlugins:加载/获取插件控件,参数为插件DLL,并保存内部的CreateControl接口,以便后期调用,构建用户自定义控件对象;
 
     UseParentResource:使用给定参数pm的父类资源作为当前绘制管理UI的父类资源绘制对象;
     GetParentResource:获取当前绘制管理UI的父类资源绘制对象;
     GetDefaultDisabledColor/SetDefaultDisabledColor:获取/设置默认不可用来状态颜色;若存在绘制管理UI父类资源对象,则采用该对象的默认不可用状态颜色;
     GetDefaultFontColor/SetDefaultFontColor:获取/设置默认字体颜色;若存在绘制管理UI父类资源对象,则采用该对象的默认字体颜色;
     GetDefaultLinkFontColor/SetDefaultLinkFontColor:获取/设置默认链接字体颜色;若存在绘制管理UI父类资源对象,则采用该对象的默认链接字体颜色;
     GetDefaultLinkHoverFontColor/SetDefaultLinkHoverFontColor:获取/设置默认链接停留字体颜色,若存在绘制管理UI父类资源对象,则采用该对象的默认链接停留字体颜色;
     GetDefaultSelectedBkColor/SetDefaultSelectedBkColor:获取/设置默认选择Selected背景色,若存在绘制管理UI父类资源对象,则采用该对象的默认Selected背景色;
     GetDefaultFontInfo:获取默认的字体信息,若存在绘制管理UI父类资源对象,则使用该对象的默认字体信息;
     SetDefaultFont:设置默认字体,参数pStrFontName为字体名称,nSize为字体高度,bBold为是否粗体,bUnderline为是否有下划线,bItalic为是否为斜体;
     GetCustomFontCount:获取自定义字体个数(m_aCustomFonts);
     AddFont:添加自定义字体并返回字体句柄;
     AddFontAt:在指定位置处插入自定义字体并返回字体句柄;
     GetFont:获取指定索引下字体句柄;
     GetFont:重载版本,获取指定条件的字体,若未找到且若存在绘制管理UI父类资源对象,则再从该对象的中获取该条件下的字体,否则返回NULL;
     FindFont:查找指定字体句柄是否在用户自定义的字体集中, 若未找到且若存在绘制管理UI父类;则再从该对象中获取,否则失败;
     FindFont:查找指定条件下的字体是否在用户自定义的字体集中,同前者;
     GetFontIndex:通过查找指定字体句柄所在字体集的所在索引位置;
     RemoveFont:从用户自定义字体集中移除指定字体句柄,此时不再从绘制管理UI父类查找;
     RemoveFontAt:从用户自定义字体集中移除指定索引下的字体句柄,此时不再从绘制管理UI父类查找;
     RemoveAllFonts:移除所有用户自定义字体;
     GetFontInfo:重载版本,获取指定索引或指定字体句柄的字体信息,此外对于字体句柄,则若失败且若存在父类,则从父类中获取;
     GetImage:从m_mImageHash中获取图片信息,bitmap为图片名称;
     GetImageEx:获取图片信息,若失败,则将该图片添加至m_mImageHash,若添加成功则返回该图片信息;
     AddImage:添加图片至m_mImageHash,参数bitmap为图片名称或图片索引,type为图片资源类型,mask为掩码;
     AddImage:重载版本,参数hBitmap为图片句柄,iWidth为图片宽度,iHeight为图片高度,bAlpha为是否为alpha通道;
     RemoveImage:移除指定的参数为bitmap的图片;
     RemoveAllImages:移除所有图片;
     ReloadAllImages:重新加载所有的图片(内部重新修改图片信息,并重绘所有控件);
     AddDefaultAttributeList:添加默认属性列表信息至m_DefaultAttrHash;
     GetDefaultAttributeList:获取指定名称的属性列表信息,若查找失败且存在绘制管理UI父类对象,则从该对象中查找;
     RemoveDefaultAttributeList:移除所有的默认属性列表;
     AttachDialog:将控件附加到本类绘制管理UI对象,另外内部调用InitControls初始化控件树;
     ReapObjects:主要在控件或窗口销毁时做一些清理工作,从m_mNameHash中移除自己、关闭计时器等;
     AddOptionGroup:添加属性组(一般用在属性选项控件)至m_mOptionGroup;参数pStrGroupName为组名,pControl为添加的OptionUI控件;
     GetOptionGroup:获取指定组名下的控件集(内部可能有多个控件)
     RemoveOptionGroup:从m_mOptionGroup中移除指定组名下的指定控件;
     RemoveAllOptionGroups:移除所有组名以及旗下的控件集;
     GetFocus:获取当前获取到焦点的控件对象;
     SetFocus:设置控件为当前焦点控件对象;
     SetFocusNeeded:设置控件为当前焦点控件对象且更新重绘所有控件;
     SetNextTabControl:设置下一个TAB控件,内部获取下一个控件并作为焦点控件;
     SetTimer:设置控件计时器(事实上是当前窗口的计时器,内部至多维护了255个计时器,超过255个后面的将可能覆盖或修改前面的,初始计时器ID为17,此外为了区分计时器与控件间关系,

     TIMERINFO中也保存了nLocalID,此值与m_uTimerID计时器不一定相同),并添加至m_aTimers计时器容器中;
     KillTimer:杀死指定控件与nTimerID相同的计时器;
     KillTimer:重载版本,杀死指定控件下的所有计时器;
     RemoveAllTimers:杀死所有计时器;

     SetCapture:设置当前线程里要捕获的鼠标窗口句柄为当前绘制窗口;
     ReleaseCapture:当窗口不需要所有鼠标输入时,释放鼠标;
     IsCaptured:释放当前窗口设置为被捕获的状态;
     AddNotifier:添加消息通告者监听对象至消息通告集中;
     RemoveNotifier:移除指定的消息通告者监听对象;
     SendNotify:发送通告消息,参数Msg为通告消息,bAsync为是否为异步,若为异步,则添加至异步通告消息集中,否则发送给所有通告监听者对象;
     SendNotify:重载版本,内调构造消息,并调用前者;
     AddPreMessageFilter:添加预处理消息过滤器对象至m_aPreMessageFilters过滤器集中;
     RemovePreMessageFilter:从m_aPreMessageFilters中移除指定的预处理消息过滤器对象;
     AddMessageFilter:添加消息过滤器对象至m_aMessageFilters集中;
     RemoveMessageFilter:移除m_aMessageFilters集中的指定消息过滤器对象;
     GetPostPaintCount:获取绘制控件集m_aPostPaintControls中的绘制计数;
     AddPostPaint:添加绘制计数至m_aPostPaintControls;
     RemovePostPaint:从绘制控件集m_aPostPaintControls中移除指定的绘制控件对象;
     SetPostPaintIndex:设置指定索引下绘制控件,若已存在则移除后,再插入设置的绘制控件对象;
     AddDelayedCleanup:添加延迟清除对象至m_aDelayedCleanup集中,便于后期在消息WM_APP + 1消息处理时移除该对象;
     AddTranslateAccelerator:添加翻译加速器对象至m_aTranslateAccelerator中;
     RemoveTranslateAccelerator:从m_aTranslateAccelerator中移除指定的翻译加速器对象;
     TranslateAccelerator:分发翻译消息;
     GetRoot:获取控件树根对象;
     FindControl:查找指定位置的控件对象;
     FindControl:重载版本,获取指定名称的控件对象;
     FindSubControlByPoint:获取某控件下某位置的子控件对象;
     FindSubControlByName:获取某控件下指定名称的控件对象;
     FindSubControlByClass:获取某控件下指定类名的控件对象;
     FindSubControlByClass:重载版本获取指定类名查找控件集;
     GetSubControlsByClass:获取查找控件集(函数命名个人觉得恰当);
     MessageLoop:消息循环泵,内部维护一个消息循环,先执行CPaintManagerUI类的TranslateMessage消息翻译(预先翻译以及预处理消息),再交给TranslateMessage翻译,

     此后DispatchMessage分发消息;
     Term:关闭压缩文件句柄、释放其资源;
     MessageHandler:消息处理函数,内部负责处理各消息以及分发通告消息;
     PreMessageHandler:预处理消息处理函数,内部预处理消息以及消息转化;
     UsedVirtualWnd:是否使用虚拟窗口,若使用虚拟窗口,则在分发消息通告中先执行该虚拟窗口LoopDispatch消息分发;
     __FindControlFromXXX:系列函数作为辅助函数,用于查找指定参数下的控件对象;
     私有成员:因有时候需要重新加载更新皮肤资源、此外在同一进程中可能使用多个duilib模块的程序如同一个以DLL模块加载的MFC程序则可能导致资源路径不匹配、被修改的风险,

    在程序中可以修改资源相关的静态成员为非静态或是统一资源在某一个路径并保持文件不冲突即可,以避免被修改的风险;