研究Duilib的实现结构
第一步:调用RegisterClassEx();
第二步:调用CreateWindowEx()
第三步:调用ShowWindow(),同时启动消息循环
说明:
1、RegisterClass,RegisterClassEx
作用:向Windows操作系统注册窗口类型
WNDCLASSEX结构体中的WNDPROC 为一回调函数,如下:
LRESULT CALLBACK CWindowWnd::__WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
在这个回调函数中,可以响应该窗口的各种系统消息、键盘鼠标消息、用户自定义的消息。
所有的窗口继承自CWindowWnd,WindowImplBase继承自CWindowWnd,(用户自定义的窗口(如CMainWnd)从WindowImplBase派生)
__WndProc回调函数中调用WindowImplBase类的HandleMessage函数,
HandleMessage函数中对各种消息进行分别处理,如OnCreate、OnDestroy、OnSize、OnLButtonDown、OnTimer等,
2、CreateWindow,CreateWindowEx
作用:创建窗口类对象
应用项目的入口函数WinMain的第一个参数HINSTANCE为实例句柄,渲染类CPaintManagerUI必须与之关联,即:
CPaintManagerUI::SetInstance(hInstance);
在RegisterClassEx、CreateWindowEx 时都需用到此句柄。
3、设置skin资源目录的位置
CPaintManagerUI::SetResourcePath,或使用压缩包:CPaintManagerUI::SetResourceZip
4、CWindowWnd::ShowModal (或ShowWindow + CPaintManagerUI::MessageLoop(),MessageLoop函数中有消息循环)
显示已Create的窗口,同时添加消息循环,
MSG msg = { 0 };
while(::GetMessage(&msg, NULL, 0, 0))
{
if( !CPaintManagerUI::TranslateMessage(&msg) )
{
::TranslateMessage(&msg); //将虚拟键消息转换为字符消息。GetMessage或PeekMessage时被读出
::DispatchMessage(&msg); //分发一个消息给窗口程序
}
if( msg.message == WM_QUIT ) break;
}
CPaintManagerUI::TranslateMessage 负责分发消息,按窗口类型分为2种:CHILD类型、非CHILD类型,
这两种类型都会遍历当期应用的所有窗口和控件,逐个与当前MSG的hwnd进行比对,然后调用对应窗口或控件的MessageHandler
CHILD类型的不同之处在于:会获取当前MSG的hwnd的父窗口,然后与缓存的所有控件或窗口进行比较。
所有的控件和窗口继承自基类:IMessageFilterUI,重写虚函数MessageHandler,在此函数中响应系统消息、键鼠消息。
CPaintManagerUI中有静态变量 static CStdPtrArray m_aPreMessages; 缓存的是所有的 CPaintManagerUI 对象
有成员变量 CStdPtrArray m_aPreMessageFilters; 缓存的是所有的窗口对象。
CPaintManagerUI::TranslateMessage 中先遍历 m_aPreMessages,找到当期MSG所属的CPaintManagerUI 对象(通过匹配HWND)
再调用该对象所属的m_aPreMessageFilters对应的所有窗口类的MessageHandler函数,
这些窗口类包括:WindowImplBase的派生窗口、CComboUI、CMenuUI等
5、SubClassWindow 子类化
(http://blog.csdn.net/weiaipan1314/article/details/51888742)
每一个Windows窗口如EDIT]都有一个窗口处理函数负责对消息处理,子类化的办法就是用我们自己的消息处理函数来替代窗口原有的、标准的处理函数。
当然我们自己的窗口处理函数只是关心那些特定的消息[WM_CHAR],而其它消息,再发给原来的窗口函数处理。
在SDK中的实现方法是调用函数SetWindowLong :
WNDPROC * oldWndProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)AfxGetAfxWndProc()); 其中AfxGetAfxWndProc()使用我们自己的窗口处理函数.
6、加载和显示图片机制
所有的图片在第一次加载时都会缓存在一个CStdStringPtrMap对象中,类似于std::map,再次使用这个图片时,使用的缓存中图片资源
所以如果我们的应用显示过的图片特别多,会导致应用占用的内存越来越大,并且是只增不减。
除非调用CPaintManagerUI中的RemoveImage函数,主动从缓存中移除不再使用的图片。
7、CRenderEngine类中汇集了DrawImage、DrawText、DrawColor、DrawLine、DrawRect等处理UI的功能函数,
DrawImage底层调用的是windows图形设备接口函数:BitBlt、StretchBlt、AlphaBlend(绘制有透明度的图像)
DrawText底层调用的是:GDI+的DrawString,或系统的DrawText。(透明窗口上的文本使用前者)
DrawColor底层调用GDI+的FillRectangle
DrawLine底层调用GDI+的DrawLine(另一个版本使用的是wingdi的 MoveToEx、LineTo)
DrawRect底层调用GDI+的DrawRectangle(另一个版本使用的是wingdi的::Rectangle)
8、CDialogBuilder 加载窗口或控件指定的xml文件,解析,然后创建对应的窗口或控件,返回窗口或控件的指针。
9、所有的控件(不包括窗口)派生自CControlUI,重写虚函数SetAttribute,在此函数中解析各自特有的属性字段,
研究Duilib的实现结构的更多相关文章
- React Native APP结构探索
APP结构探索 我在Github上找到了一个有登陆界面,能从网上获取新闻信息的开源APP,想来研究一下APP的结构. 附上原网址:我的第一个React Native App 具体来讲,就是研究一个复杂 ...
- ECshop 数据库表结构
-- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...
- PPP模式下的融资结构优化
PPPcode{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && d ...
- ECSSHOP表结构
ECSSHOP表结构 -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint ...
- ECshop 表结构
-- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...
- 【转】-ECshop数据库表结构
-- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...
- Ecshop数据表结构
-- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...
- XStream 数组(List)输出结构
<!-- 期望的DOM树 --> <Articles> <item> <Title>微信SDK初步结构</Title> <Descri ...
- Micro LED巨量转移技术研究进展
近年来,Micro LED因其功耗低.响应快.寿命长.光效率高等特点,被视为继LCD.OLED之后的新一代显示面板技术.Micro LED的英文全名是Micro Light Emitting Diod ...
随机推荐
- 1.spring基础知识讲解
引言:以下记录一些自己在使用时pringle框架时的一些自己心得合成体会时,如有侵权,请联系本博主. 1. spring基本都使用 spring是一个开源的轻量级框架,其目的是用于简化企业级应用程序开 ...
- Tomcat部署项目定时任务跑了两次
在server.xml下面找到Host这行代码 <Host name="localhost" appBase="webapps" unpackWARs=& ...
- Unity --- 如何降低UI的填充率
1.首先简单介绍一下什么叫填充率: Fill Rate(填充率)是指显卡每帧或者说每秒能够渲染的像素数.在每帧绘制中,如果一个像素被反复绘制的次数越多,那么它占用的资源也必然更多.目前在移动设备上,F ...
- 滑动拼图 Sliding Puzzle
2018-09-09 22:01:02 问题描述: 问题求解: 问题很Interesting,其实本质就是解空间遍历,使用BFS就可以很快的予以解决~ public int slidingPuzzle ...
- Ubuntu vim终端常用的快捷键
Ubuntu中常用的快捷键 Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手.在Ubuntu中打开终端的快捷键是Ctrl+Alt+T.其他的一些常用的快捷 ...
- learn python the hard way习题31~40总结以及列表的扩展知识
Python 中的列表: 形式:[ 表示打开一个列表,中间的项目用 , 隔开,然后列表以 ] 结束. for循环 两种形式: for i in ArrayName: for i in range(0, ...
- Feign二:复写Feign的默认配置
Feign二:复写Feign的默认配置 1.在启动文件加入feign注解:@EnableFeignClients FeignApp.java import org.springframework.bo ...
- GRCh38基因组和注释文件探究
ensembl/release91: cat Homo_sapiens.GRCh38.91.gtf | grep -v "#" | cut -f9 | cut -f1,3,6,8 ...
- Spring Batch 批量处理策略
为了帮助设计和实现批量处理系统,基本的批量应用是通过块和模式来构建的,同时也应该能够为程序开发人员和设计人员提供结构的样例和基础的批量处理程序. 当你开始设计一个批量作业任务的时候,商业逻辑应该被拆分 ...
- 『计算机视觉』Mask-RCNN_推断网络其六:Mask生成
一.Mask生成概览 上一节的末尾,我们已经获取了待检测图片的分类回归信息,我们将回归信息(即待检测目标的边框信息)单独提取出来,结合金字塔特征mrcnn_feature_maps,进行Mask生成工 ...