duilib DirectUI库里面的一个简单的例子RichListDemo
来源:互联网 发布:php 文件上传ajax代码 编辑:程序博客网 时间:2024/06/15 22:52
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
- duilib DirectUI库里面的一个简单的例子ListDemo
- directui界面库 Duilib是开源的
- DirectUI开源库 - DuiLib 的使用
- 一个简单的Duilib程序
- 用gnuplot画图,扔latex里面。一个简单的例子。
- 一个简单的开源DIRECTUI界面框架
- 【VC】各种免费、开源的directui库,duilib,REDUI,UiFeature,sharpui等
- 开源的DirectUI界面开发库DUILIB试用demo (Win32程序)
- 一个简单的例子
- 提供一个免费的directui界面库(已开源)
- 一个简单的java反射例子(获得javabean里面的字段)
- java se tutorials 里面的一个很简单的例子,高手请指点一下
- 推荐一个directui介绍的文章
- 【个人收藏】Direct UI 与一个简单的开源DIRECTUI界面框架
- CImg库的一个简单例子
- duilib个简单的文档
- UIPro 一个DirectUI库
- 实现FusionChart动态获取数据(一)
- 加快activity显示速度,提高用户体验
- DesignPattern- 代理模式
- 英语中的非谓语动词小结
- ubuntu phpmyadmin 404 not found
- duilib DirectUI库里面的一个简单的例子RichListDemo
- linux c 网络编程 并发
- hdu 1099 数学
- 单片机下最小多任务程序
- Makefile中赋值运算符 = 与 := 的区别
- 链接、装载与库
- HDOJ题目分类
- ASP.NET MVC 验证方式
- [算法思考]关于2-sat判定求解中“同一组内必须选择”问题的思考