第一步:调用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); //将虚拟键消息转换为字符消息。GetMessagePeekMessage时被读出
    ::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的实现结构的更多相关文章

  1. React Native APP结构探索

    APP结构探索 我在Github上找到了一个有登陆界面,能从网上获取新闻信息的开源APP,想来研究一下APP的结构. 附上原网址:我的第一个React Native App 具体来讲,就是研究一个复杂 ...

  2. ECshop 数据库表结构

    -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...

  3. PPP模式下的融资结构优化

    PPPcode{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && d ...

  4. ECSSHOP表结构

    ECSSHOP表结构 -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint ...

  5. ECshop 表结构

    -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...

  6. 【转】-ECshop数据库表结构

    -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...

  7. Ecshop数据表结构

    -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...

  8. XStream 数组(List)输出结构

    <!-- 期望的DOM树 --> <Articles> <item> <Title>微信SDK初步结构</Title> <Descri ...

  9. Micro LED巨量转移技术研究进展

    近年来,Micro LED因其功耗低.响应快.寿命长.光效率高等特点,被视为继LCD.OLED之后的新一代显示面板技术.Micro LED的英文全名是Micro Light Emitting Diod ...

随机推荐

  1. 《剑指offer》第五十六题(数组中只出现一次的两个数字)

    // 面试题56(一):数组中只出现一次的两个数字 // 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序 // 找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度 ...

  2. php 建站 多域名配置 自定义重定向

    1. 申请一个域名 , 当多个域名使用. 比如 申请一个顶级域名为 .com 后缀的一级域名 :mine.com, 一般允许绑定四五个二级域名,比如 www.mine.com  . mine.mine ...

  3. vue中使用vw适配移动端

    推荐看看大漠老师的文章,非常的有收获 如何在Vue项目中使用vw实现移动端适配 1.首先在项目中安装依赖 npm i postcss-aspect-ratio-mini postcss-px-to-v ...

  4. Linux下HBase和Maven的环境搭建

    Maven环境部署如下: maven下载并进行环变量配置 export MAVEN_HOME=/home/hadoop/app/apache-maven-3.3.9export PATH=$MAVEN ...

  5. bitbucket工程改名导致 repository does not exist. fatal: Could not read from remote repository.

    在bitbucket上把工程改名了,就忘了. 结果同步时报错. 先在本地查看一下 git remote -v 果然是工程的老名字 origin git@bitbucket.org:XXX/oldnam ...

  6. Tqdm 进度条可视化模块

    2018-12-04 14:34:25 使用python Tqdm进度条库让你的python进度可视化 Tqdm在阿拉伯语表示进步,在西班牙语中表示我非常爱你.是一个快速,可扩展的Python进度条, ...

  7. 下一个更大的数 Next Greater Element

    2018-09-24 21:52:38 一.Next Greater Element I 问题描述: 问题求解: 本题只需要将nums2中元素的下一个更大的数通过map保存下来,然后再遍历一遍nums ...

  8. Access大数据高效分页语句

    Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...

  9. 20165303 2017-2017-2《Java程序设计》课程总结

    1.我期待的师生关系 20165303我期望的师生关系 2.学习基础和C语言基础调查 20165303学习基础和C语言基础调查 3.linux安装及学习 20165303 预备作业3 Linux安装及 ...

  10. Centos6.5 升级Openssl + Openssh

    xu言: 平时很懒,都不想写blog.今天(2018.05.15)开始尝试每天写一篇吧,看我自己能坚持多久! 准备工作: 为了防止在操作过程中导致ssh远程中断,首先安装一个telnet-server ...