博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
duilib DirectUI库里面的一个简单的例子RichListDemo
阅读量:5923 次
发布时间:2019-06-19

本文共 3113 字,大约阅读时间需要 10 分钟。

http://blog.csdn.net/zengraoli/article/details/9993153

 

 

目录

 

1、首先来看这里的CRichListWnd

已经不再是从CWindowWnd继承了

classCRichListWnd:publicWindowImplBase

从WindowImplBase中,可以看到有三个抽象函数:

virtualCDuiStringGetSkinFolder()=0;

virtualCDuiStringGetSkinFile()=0;

virtualLPCTSTRGetWindowClassName(void)const=0;

这些都很简单,只是返回固定的string

 

 

2、看看WindowImplBase

[cpp] 
 
  1. class UILIB_API WindowImplBase  
  2.     : public CWindowWnd  
  3.     , public CNotifyPump  
  4.     , public INotifyUI  
  5.     , public IMessageFilterUI  
  6.     , public IDialogBuilderCallback  
  7. {  
  8. ……  
  9. }  

 

这个类其实也是实现了CWindowWnd、INotifyUI,即一个窗体和消息,所以他含有virtualvoidNotify(TNotifyUI&msg);

但是这里又继承了CNotifyPump,所以这里的Notify可以这么实现:

 

[cpp] 
 
  1. void WindowImplBase::Notify(TNotifyUI& msg)  
  2. {  
  3.     return CNotifyPump::NotifyPump(msg);  
  4. }  

 

NotifyPump主要是遍历所有的虚拟窗口把消息传递出去

 

下面的代码列出了CRichListWnd比较重要的函数:

[cpp] 
 
  1. class CRichListWnd : public WindowImplBase  
  2. {  
  3. public:  
  4.   
  5.     virtual void OnFinalMessage( HWND );  
  6.     virtual void Notify( TNotifyUI &msg );  
  7.     virtual LRESULT OnMouseWheel( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  8.     virtual LRESULT OnSysCommand( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );  
  9.     virtual void InitWindow();  
  10.     virtual LRESULT OnMouseHover( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );  
  11.     virtual LRESULT OnChar( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );  
  12.   
  13.     DUI_DECLARE_MESSAGE_MAP()  
  14.     virtual void OnClick(TNotifyUI& msg);  
  15.     virtual void OnSelectChanged( TNotifyUI &msg );  
  16.     virtual void OnItemClick( TNotifyUI &msg );  
  17. };  

因为WindowImplBase类实现了CWindowWnd中的HandleMessage,所以我们如果需要把一些重要的消息事件给重写就行;

 

可以看到WindowImplBase中的OnCreate():

[cpp] 
 
  1. LRESULT WindowImplBase::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)  
  2. {  
  3. ……  
  4.     InitWindow();  
  5.     return 0;  
  6. }  

 

所以我们需要把InitWindow给重写了

在InitWindow给每一个控件和XML的控件属性对应起来:

[cpp] 
 
  1. // 初始化的事件  
  2. void CRichListWnd::InitWindow()  
  3. {  
  4.     m_pCloseBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("closebtn")));  
  5.     m_pMaxBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("maxbtn")));  
  6.     m_pRestoreBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("restorebtn")));  
  7.     m_pMinBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("minbtn")));  
  8. }  

 

这就完成了初始化,窗口也就起来了

 

这个Demo中,是使用到了虚拟页的,也就是CPage1,如果不使用,他的消息会回到CRichListWnd中被处理,但是如果CPage1中处理了消息,CRichListWnd就不做处理了

 

我们来看看CPage1所要处理的消息:

 

 

同样的CRichListWnd消息

 

 

当页面发生OnClick或者OnItemClick时候,已经挂上了虚拟页CPage1,那么CRichListWnd消息的就失效了

 

3、关于虚拟页CPage的

这样挂上虚拟页的:

[cpp] 
 
  1. CRichListWnd::CRichListWnd(void)  
  2. {  
  3.     m_Page1.SetPaintMagager(&m_PaintManager);  
  4.   
  5.     AddVirtualWnd(_T("page1"),&m_Page1);  
  6. }  

 

[cpp] 
 
  1. CRichListWnd::~CRichListWnd(void)  
  2. {  
  3.     RemoveVirtualWnd(_T("page1"));  
  4. }  

 

 

看到这里有个宏(因为继承了CNotifyPump都可以这样用):

[cpp] 
 
  1. DUI_BEGIN_MESSAGE_MAP(CPage1, CNotifyPump)  
  2.     DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK, OnClick)  
  3.     DUI_ON_MSGTYPE(DUI_MSGTYPE_SELECTCHANGED, OnSelectChanged)  
  4.     DUI_ON_MSGTYPE(DUI_MSGTYPE_ITEMCLICK, OnItemClick)  
  5. DUI_END_MESSAGE_MAP()  

 

这是整个消息映射的,表面我们关心这几个消息函数,同样的还可以在UIDefine.h中找到其他的消息类型的事件

 

在void CPage1::OnItemClick( TNotifyUI &msg )中原来是没有代码的,需要手动把CRichListWnd的那部分粘上去(或者去掉挂上虚拟页的部分)

 

之后我们点击进度条的时候,这个函数才会执行

 

 

同样的把鼠标停留 在操作按钮上面会执行函数CRichListWnd::OnMouseHover

 

 

 

同样的这个demo的其他部分也就这么回事了

 

 
4

转载于:https://www.cnblogs.com/dps001/p/4479157.html

你可能感兴趣的文章
AI重新定义Web安全
查看>>
C语言学习入门01
查看>>
证书类型原理及转换方式
查看>>
2017-09-17 前端日报
查看>>
面向对象编程
查看>>
基于swiper的Tab选项卡
查看>>
Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)
查看>>
简易扒一下zepto的源码
查看>>
React组件懒加载
查看>>
Vue-cli创建vue项目以及配置文件梳理
查看>>
CentOS6.5系统下RPM包安装MySQL5.6
查看>>
一个简单有趣的微信聊天机器人
查看>>
【Mybatis系列】从源码角度理解Mybatis的$和#的作用
查看>>
vue 实现 ios 原生picker 效果(实现思路分析)
查看>>
动手写个数字输入框1:input[type=number]的遗憾
查看>>
关于Node.js的__dirname,__filename,process.cwd(),./文件路径的一些坑
查看>>
快速了解统计结论是否可信--统计检验方法速查手册
查看>>
linux知识随记
查看>>
好雨云帮开发者大赛第二期:「Beego」
查看>>
JFinal+idea实现简单的增删改查功能
查看>>