duilib DirectUI库里面的一个简单的例子RichListDemo
1、首先来看这里的CRichListWnd
已经不再是从CWindowWnd继承了
classCRichListWnd:publicWindowImplBase
从WindowImplBase中,可以看到有三个抽象函数:
virtualCDuiStringGetSkinFolder()=0;
virtualCDuiStringGetSkinFile()=0;
virtualLPCTSTRGetWindowClassName(void)const=0;
这些都很简单,只是返回固定的string
2、看看WindowImplBase
class UILIB_API WindowImplBase
: public CWindowWnd
, public CNotifyPump
, public INotifyUI
, public IMessageFilterUI
, public IDialogBuilderCallback
{
……
}
这个类其实也是实现了CWindowWnd、INotifyUI,即一个窗体和消息,所以他含有virtualvoidNotify(TNotifyUI&msg);
但是这里又继承了CNotifyPump,所以这里的Notify可以这么实现:
void WindowImplBase::Notify(TNotifyUI& msg)
{
return CNotifyPump::NotifyPump(msg);
}
NotifyPump主要是遍历所有的虚拟窗口把消息传递出去
下面的代码列出了CRichListWnd比较重要的函数:
class CRichListWnd : public WindowImplBase
{
public: virtual void OnFinalMessage( HWND );
virtual void Notify( TNotifyUI &msg );
virtual LRESULT OnMouseWheel( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
virtual LRESULT OnSysCommand( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
virtual void InitWindow();
virtual LRESULT OnMouseHover( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
virtual LRESULT OnChar( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); DUI_DECLARE_MESSAGE_MAP()
virtual void OnClick(TNotifyUI& msg);
virtual void OnSelectChanged( TNotifyUI &msg );
virtual void OnItemClick( TNotifyUI &msg );
};
因为WindowImplBase类实现了CWindowWnd中的HandleMessage,所以我们如果需要把一些重要的消息事件给重写就行;
可以看到WindowImplBase中的OnCreate():
LRESULT WindowImplBase::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
……
InitWindow();
return 0;
}
所以我们需要把InitWindow给重写了
在InitWindow给每一个控件和XML的控件属性对应起来:
// 初始化的事件
void CRichListWnd::InitWindow()
{
m_pCloseBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("closebtn")));
m_pMaxBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("maxbtn")));
m_pRestoreBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("restorebtn")));
m_pMinBtn = static_cast<CButtonUI*>(m_PaintManager.FindControl(_T("minbtn")));
}
这就完成了初始化,窗口也就起来了
这个Demo中,是使用到了虚拟页的,也就是CPage1,如果不使用,他的消息会回到CRichListWnd中被处理,但是如果CPage1中处理了消息,CRichListWnd就不做处理了
我们来看看CPage1所要处理的消息:
同样的CRichListWnd消息
当页面发生OnClick或者OnItemClick时候,已经挂上了虚拟页CPage1,那么CRichListWnd消息的就失效了
3、关于虚拟页CPage的
这样挂上虚拟页的:
CRichListWnd::CRichListWnd(void)
{
m_Page1.SetPaintMagager(&m_PaintManager); AddVirtualWnd(_T("page1"),&m_Page1);
}
CRichListWnd::~CRichListWnd(void)
{
RemoveVirtualWnd(_T("page1"));
}
看到这里有个宏(因为继承了CNotifyPump都可以这样用):
DUI_BEGIN_MESSAGE_MAP(CPage1, CNotifyPump)
DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK, OnClick)
DUI_ON_MSGTYPE(DUI_MSGTYPE_SELECTCHANGED, OnSelectChanged)
DUI_ON_MSGTYPE(DUI_MSGTYPE_ITEMCLICK, OnItemClick)
DUI_END_MESSAGE_MAP()
这是整个消息映射的,表面我们关心这几个消息函数,同样的还可以在UIDefine.h中找到其他的消息类型的事件
在void CPage1::OnItemClick( TNotifyUI &msg )中原来是没有代码的,需要手动把CRichListWnd的那部分粘上去(或者去掉挂上虚拟页的部分)
之后我们点击进度条的时候,这个函数才会执行
同样的把鼠标停留 在操作按钮上面会执行函数CRichListWnd::OnMouseHover
同样的这个demo的其他部分也就这么回事了
duilib DirectUI库里面的一个简单的例子RichListDemo的更多相关文章
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- 关于apriori算法的一个简单的例子
apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表 ...
- fitnesse - 一个简单的例子(slim)
fitnesse - 一个简单的例子(slim) 2017-09-30 目录1 编写测试代码(Fixture code)2 编写wiki page并运行 2.1 新建wikiPage 2.2 运行 ...
- Struts2的配置和一个简单的例子
Struts2的配置和一个简单的例子 笔记仓库:https://github.com/nnngu/LearningNotes 简介 这篇文章主要讲如何在 IntelliJ IDEA 中使用 Strut ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- 一个简单的例子了解states
在大规模的配置管理工作中,我们要编写大量的states.sls文件.top.sls是states系统的入口文件,它负责指定哪些设备调用哪些states.sls文件.statse的默认工作目录是在/sr ...
- 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...
随机推荐
- ASP.NET5中间件
小的应用组件可以包含到Http请求管道当中,ASP.NET5 集成了中间件,被包在了应用程序的Configure方法当中. 1. 什么是中间件 中间件是一组被装到应用程序管道的请求和响应中的组件.每一 ...
- javascript判断值是否undefined
function isUndefined(variable) { return typeof variable == 'undefined' ? true : false; }
- mysql操作1
一.连接MYSQL.格式: mysql -h主机地址 -u用户名 -p用户密码1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root - ...
- 【USACO 1.3.2】修理牛棚
[描述] 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
- 巧用Session Manager还原Firefox丢失会话
今天Firefox Crash之后,我的会话全部丢失了.按照以往来说,Firefox在重新启动之后或者Crash之后会有一个会话还原的页面.但今天确实没有.后来我进行Google查阅,试了很多种办法. ...
- ueditor 1.4.3.2 独立/单独 上传图片框原理
其实简单的说就是编辑框很多按钮,所有按钮的功能都是以command形式提供,所以execCommand就是执行这些功能的命令.有些按钮是能弹出显示一个对话框,他的基类就是dialog,而所有被弹出的d ...
- wamp虚拟机配置
1.找到httpd.conf 里面:找到 # Virtual hosts 开启虚拟机Include conf/extra/httpd-vhosts.conf 2 编辑httpd-vhosts.con ...
- day06
一.configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件 1.获取所有节点 import configparser config = conf ...
- UVA 1594 Ducci Sequence(两极问题)
Ducci Sequence Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu D ...
- Tomat部署Web运用
在Tomcat部署Web运用的方式主要有如下几种 >利用Tomcat的自动部署 >利用控制台部署 >增加自定义的Web部署文件 >修改server.xml问价部署Web运 ...