一,概念

传统的Windows窗口程序对每一个控件都会创建一个句柄,而DUI技术奖所有控件都绘制在一个窗体上,这些控件的逻辑和绘图方式必须自己进行编写和封装,所以这些控件都是无句柄的。

DUI技术的实现步骤和难点:

1,窗口的子类化,截获窗口的消息。

2,封装自己的控件,并将自己的控件绘制到该窗口上。

3,封装窗口的消息,并分发到自己的控件上,让自己的控件响应消息。

4,根据不同的行为发送自定义消息给窗口,比便程序进行调用。

5,一般窗口上控件的组织使用XML来描述。

二,消息分发过程

以一个窗口基类CWindowWnd为例,注册窗口时,调用这个类的成员函数
 bool RegisterWindowClass();

注册时指定窗口处理函数

 static LRESULT CALLBACK __WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

然后再以一个成员函数创建窗口

HWND CWindowWnd::Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, int x, int y, int cx, int cy, HMENU hMenu)
{if( GetSuperClassName() != NULL && !RegisterSuperclass() ) return NULL;if( GetSuperClassName() == NULL && !RegisterWindowClass() ) return NULL;m_hWnd = ::CreateWindowEx(dwExStyle, GetWindowClassName(), pstrName, dwStyle, x, y, cx, cy, hwndParent, hMenu, CPaintManagerUI::GetInstance(), this);ASSERT(m_hWnd!=NULL);return m_hWnd;
}

创建时将this指针传入到CreateWindowEx的最后一个参数。响应WM_NCCREATE消息时就能取到this指针的值,进而调用虚函数,子类重写这个虚函数就能实现不同的消息处理。

LRESULT CALLBACK CWindowWnd::__WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{CWindowWnd* pThis = NULL;if( uMsg == WM_NCCREATE ) {LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);pThis = static_cast<CWindowWnd*>(lpcs->lpCreateParams);pThis->m_hWnd = hWnd;::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LPARAM>(pThis));} else {pThis = reinterpret_cast<CWindowWnd*>(::GetWindowLongPtr(hWnd, GWLP_USERDATA));if( uMsg == WM_NCDESTROY && pThis != NULL ) {LRESULT lRes = ::CallWindowProc(pThis->m_OldWndProc, hWnd, uMsg, wParam, lParam);::SetWindowLongPtr(pThis->m_hWnd, GWLP_USERDATA, 0L);if( pThis->m_bSubclassed ) pThis->Unsubclass();pThis->m_hWnd = NULL;pThis->OnFinalMessage(hWnd);return lRes;}}if( pThis != NULL ) {//HandleMessage为虚函数return pThis->HandleMessage(uMsg, wParam, lParam);} else {return ::DefWindowProc(hWnd, uMsg, wParam, lParam);}
}

消息转发过程和传统的Windows程序也不一样。比如在一个传统的窗口上左键点击一个按钮时,将会发送一个WM_COMMAND的消息给窗口,wParam的低字节为按钮ID,高字节为BN_CLICKED,而lParam为按钮句柄。而在DUI里面是怎样的呢?首先系统发送一个WM_LBUTTONDOWN消息给窗口,lParam为点击的坐标信息,根据这个坐标找到相应的按钮。然后将一些必要的信息(比如控件指针,名称,消息类型)组成一个Notify发送给窗口,窗口再根据Notify里面的信息作出相应处理。

三、界面绘制过程

窗口接收到WM_PAINT消息时,先绘制自身,然后根据控件树的组织由Parent节点到Child节点依次绘制。绘制每一个元素时一般是按以下步骤:

void CControlUI::DoPaint(HDC hDC, const RECT& rcPaint)
{if( !::IntersectRect(&m_rcPaint, &rcPaint, &m_rcItem) ) return;// 绘制循序:背景颜色->背景图->状态图->文本->边框if( m_cxyBorderRound.cx > 0 || m_cxyBorderRound.cy > 0 ) {CRenderClip roundClip;CRenderClip::GenerateRoundClip(hDC, m_rcPaint,  m_rcItem, m_cxyBorderRound.cx, m_cxyBorderRound.cy, roundClip);PaintBkColor(hDC);PaintBkImage(hDC);PaintStatusImage(hDC);PaintText(hDC);PaintBorder(hDC);}else {PaintBkColor(hDC);PaintBkImage(hDC);PaintStatusImage(hDC);PaintText(hDC);PaintBorder(hDC);}
}

DirectUI实现原理相关推荐

  1. DirectUI,标准界面的又一次挑战!

    DirectUI 现在开始火了,它最早出现在微软的msn上,现在此技术已经应用到office等大型产品中. 国内近来随着知名的qq,迅雷采用此技术,更是把DirectUI彻底推向了前台.那么什么叫Di ...

  2. 【HTMLayout学习】学习缘由、什么是HTMLayout?

    作为一名喜欢耍耍程序玩的人,编写一个小软件是家常便饭,但是作为一个酷爱C++的人,编写了一个感觉非常好的程序,但是界面看的自己都烦死了,就好像是正吃饭遇上了一坨便便,恶心又晦气. 我承认,自己没有美的 ...

  3. DirectUI介绍

    最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是有距离的,不过其实现还是很有意思的 ...

  4. 以 DirectUI 方式实现的ImageButton

    [文章归类] C++,Windows 应用程序开发. 这是一篇比较简单的文章,主要讲解的是用 DirectUI 方式实现的对话框上的按钮.例如,QQ界面上的按钮.我在前一篇文章中讲解的 PS 油画滤镜 ...

  5. DirectUI与QQ界面

    原文地址::http://blog.csdn.net/querw/article/details/6048524 前言 今天心血来潮想跟踪一下界面编程, 发现DirectUI现在挺火的. 用逻辑窗口代 ...

  6. DirectUI技术与无句柄窗口应用

    原文地址::http://fpcfjf.blog.163.com/blog/static/554697932010513101057323/ DirectUI技术与无句柄窗口应用 这两天在网上闲逛,发 ...

  7. 使用IAccessible接口,遍历DirectUI窗口控件的问题?

    前一段时间,做一个程序,需要完成一个小功能,即对鼠标监视,当左键单击某个文件选中时,获得该文件文件名称. 折腾了好久,最终在windowsXP下完美实现了.实现的思路是: 1.下鼠标钩子,获得鼠标左键 ...

  8. DirectUI的初步分析

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 最近由于 ...

  9. DirectUI浅谈

    DirectUI是一个软件设计思想,这个思想来源于Windowless理念,这个思想可以表述为"只有主窗口有句柄,其他的窗口都是以控件的形式被绘制出来",所有采用这个思想设计的开发 ...

最新文章

  1. 领导让我重构代码_领导不是由代码构成
  2. Slf4j 包老冲突,每次排查半天,是什么原因?怎么解决?
  3. 51nod 1038 X^A Mod P( N 次剩余)
  4. 第二十二课.DeepGraphLibrary(三)
  5. tensorflow 多输入 多输出 模型
  6. [转]总不能一辈子做助理
  7. Visual Studio 2015 for Linux更好地支持Linux下的开发
  8. javascript高级程序设计之变量、作用域和内存问题
  9. linux内核模块编译
  10. python加颜色_python如何给指定的词语加上颜色,并写入Excel文档?
  11. CSS3 选择器——属性选择器
  12. 分布式数据库中间件Mycat百亿级数据存储(转)
  13. DexClassLoader的使用
  14. HOOK学习笔记与心得
  15. Educational Codeforces Round 108 (Rated for Div. 2) D. Maximum Sum of Products 思维 + dp
  16. 面试中的 10 大排序算法总结
  17. fvdm 跟驰模型 matlab仿真_MATLAB数值计算在光学仿真和教学中的应用
  18. php网站模板怎么改动,ECshop网站模板修改详细教程 and 模板对应的文件
  19. win7共享文件服务器设置密码,Win7局域网共享文件夹添加密码保护文件安全的方法...
  20. 世界地图各大洲鼠标移入切换显示

热门文章

  1. 中国计量大学python期末试卷_中国大学慕课mooc用Python玩转数据期末考试搜题公众号答案...
  2. vue配合html中实现四舍五入数值后保留原始数值的方法
  3. CORBA-基本概念
  4. SQL Server 实验七 数据完整性及数据库程序设计
  5. 微信小程序、uniapp、vue生成随机边框颜色十六进制
  6. linux中access数据库操作,Access数据库及其基本操作(转)
  7. Ubuntu20.04系统离线安装ssh-server
  8. 制作一大片文字的水印图片
  9. 软件测试人员如何去分析及提高用户体验?
  10. 三星S4相机声音去除办法,需要ROOT权限