Duilib源码分析(四)绘制管理器—CPaintManagerUI
接下来,分析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程序则可能导致资源路径不匹配、被修改的风险,
在程序中可以修改资源相关的静态成员为非静态或是统一资源在某一个路径并保持文件不冲突即可,以避免被修改的风险;
Duilib源码分析(四)绘制管理器—CPaintManagerUI的更多相关文章
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备四)
接下来,分析uilib.h中的WinImplBase.h和UIManager.h: WinImplBase.h:窗口实现基类,已实现大部分的工作,基本上窗口类均可直接继承该类,可发现该类继承于多个类, ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备三)
接下来,我们将继续分析UIlib.h文件中其他的文件, UIContainer.h, UIRender.h, WinImplBase.h, UIManager.h,以及其他布局.控件等: 1. UIR ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)
接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备一)
上节中提到在遍历创建控件树后,执行了以下操作: 1. CDialogBuilder构建各控件对象并形成控件树,并返回第一个控件对象pRoot: 2. m_pm.AttachDialo ...
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- Duilib源码分析(六)整体流程
在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...
- Duilib源码分析(一)整体框架
Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- Memcached源码分析之内存管理
先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...
随机推荐
- 如何在MyEclipse上添加更换JRE
如何在myeclipse上添加更换JRE 由于兼容性的问题,有些WEB项目会依赖jdk的版本.如果需要更换jdk,那么,知道如何更换JRE的方法很有必要. 一种在myeclipse上添加和更换JRE的 ...
- web主题公园版权信息破解:script.js加密文件
很多人会使用web主题公园网站的免费worldpress主题,但它的主题又都被加了版权信息,故意让人找不到版权信息的修改位置. 你如果去footer.php里面删除版权信息(技术支持:web主题公园) ...
- [Unity3D]UI界面之瞄准镜设置说明
9空格设计 : 比如说4个角的图案固定,拉伸的时候不受影响 通过设置 左上右下来: 通过创建Image对象,将设置好的图片关联到Source Image 调整瞄准镜跟随飞机, 注意这里设置的Z轴向量是 ...
- jquery1.7.2的源码分析(三)$.Deferred
例子的详细讲解 Filter Resolve var filterResolve = function() { var defer = $.Deferred(), filtered = defer.t ...
- webpack踩坑之路——构建基本的React+ES6项目
转自:http://www.cnblogs.com/ghost-xyx/p/5483464.html webpack是最近比较火的构建工具,搭配上同样比较火的ReacJS与ES6(ES2015)一定是 ...
- 跟我一起学习VIM
跟我一起学习VIM - The Life Changing Editor 前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程.虽然准备有限,但分享过程中大家大多带着一种惊叹 ...
- Python *与** 参数问题
问题: Python的函数定义中有两种特殊的情况,即出现*,**的形式. 如:def myfun1(username, *keys)或def myfun2(username, **ke ...
- 常用function() 收集
1.随机数生成函数(来源-微信支付demo案例) /** * * 产生随机字符串,不长于32位 * @param int $length * @return 产生的随机字符串 */ public st ...
- oracle DML(数据管理语言)sql 基本语句
- [Evolutionary Algorithm] 进化算法简介
进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...