duilib DirectUI库里面的一个简单的例子RichListDemo

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

2013-08-16 00:08 3289人阅读 评论(2) 收藏 举报

目录(?)[+]

1、首先来看这里的CRichListWnd

已经不再是从CWindowWnd继承了

classCRichListWnd:publicWindowImplBase

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

virtualCDuiStringGetSkinFolder()=0;

virtualCDuiStringGetSkinFile()=0;

virtualLPCTSTRGetWindowClassName(void)const=0;

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

2、看看WindowImplBase

[cpp] view plaincopyprint?

  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] view plaincopyprint?

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

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

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

[cpp] view plaincopyprint?

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

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

可以看到WindowImplBase中的OnCreate():

[cpp] view plaincopyprint?

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

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

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

[cpp] view plaincopyprint?

  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] view plaincopyprint?

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

[cpp] view plaincopyprint?

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

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

[cpp] view plaincopyprint?

  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
时间: 2024-10-10 21:45:46

duilib DirectUI库里面的一个简单的例子RichListDemo的相关文章

DuiLib学习笔记2——写一个简单的程序

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新建一个win32项目 去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录.再把这个项目添加进我们解决方案中. 从教程里面把以下代码粘贴到我们项目的stdafx.h中 // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN

Android Handler的一个简单使用例子

在前面 开启一个线程Thread并用进度条显示进度 这篇文章里,我们用线程实现了这么一个简单的功能,就是点击按钮,加载进度条.但是有没有发现,点击一次之后,再次点击就会没效.我们可是需要每次点击都要显示下一张图片的.永盈会娱乐城 这里就需要引入 Android 的消息机制了,简单来说,就是 Handler.Looper 还有 Message Queue的使用.这里我们用一个简单的例子来说明 Handler 的使用,就是每次点击按钮,给消息队列发送一个数字 5.还是在 PaintingActivi

【Python】一个简单的例子

问题描述: Python基础篇 参考资料: (1)http://www.cnblogs.com/octobershiner/archive/2012/12/04/2801670.html (2)http://www.cnblogs.com/itech/archive/2010/06/20/1760345.html 例子: 求解Fibonacci glb_var.py gl_count=1 path.py # coding:utf-8 ''' Created on 2014-4-28 @autho

关于apriori算法的一个简单的例子

apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表一个事务数据库D,其中最小支持度为50%,最小置信度为70%,求事务数据库中的频繁关联规则. Tid 项目集 1  面包,牛奶,啤酒,尿布 2  面包,牛奶,啤酒 3  啤酒,尿布 4  面包,牛奶,花生 apriori算法的步骤如下所示: (1)生成候选频繁1-项目集C1={{面包},{牛奶},{

一个简单的例子让你了解React-Redux

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 一个简单的例子让你了解React-Redux - 小平果的欢乐谷 - 博客频道 - CSDN.NET 小平果的欢乐谷 你的到来会让我很意外,谢谢光临! 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的Python,终于等

Linux内核中的信号机制--一个简单的例子【转】

本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123(http://blog.csdn.NET/ce123) 信号机制是类UNIX系统中的一种重要的进程间通信手段之一.我们经常使用信号来向一个进程发送一个简短的消息.例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网络因素当前主机还没有收到相应的数据,当前进程被设置

一个简单的例子搞懂ES6之Promise

ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步是这样的: * 每当我需要执行一次异步操作的时候,我都需要new一个promise对象 * 每一个异步操作的Promise对象都需要设定一个成功执行的条件和成功的回调.一个失败的条件和失败的回调 * Promise对象可通过执行then()方法获得成功的回调信息 * Promise对象可通过执行ca

如何设计Java框架----一个简单的例子【翻译】

原文:http://www.programcreek.com/2011/09/how-to-design-a-java-framework/ 原文和翻译都只是参考,如有不对,欢迎指正. 你可能会好奇框架是如何工作的,我会创建一个简单的框架来演示一下. 框架的目标首先,为什么我们需要框架而不是库呢?框架的目标是定义一个让开发者实现基于个性化需求的某些功能的过程,换句话说,框架定义了骨架而开发者进行填补. 简单的框架在下面的例子中,前三个类是框架的一部分,第四个类是该框架的客户端代码. Main.j

020: class, objects and instance: 一个简单的例子,压缩文件中内容的替换

这个例子是对前面学习的知道的一个简单总结. 在设计类的时候,并非所有的类都是埋头干活的类,同时也需要有很多类似于管理的类,这样的类的功能就是调用其他的类来共同的完成任务. import sys import os import shutil import zipfile class ZipReplace(object): def __init__(self, file_name, search_string, replace_string): self.file_name = file_name