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


    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

    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可以这么实现:


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

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

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

    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():

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

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

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

    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的

    这样挂上虚拟页的:

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


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


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

    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
  • 相关阅读:
    Swing-文本输入组件(一)
    JFrame常用属性设置模板
    Swing-BoxLayout用法-入门
    linux创建和查看用户命令
    elasticsearch,http://ip:9200访问不到的解决办法
    U盘制作Linux系统盘
    Linux中oracle的安装,亲测
    Linux中yum的安装
    Linux中oracle安装时候报ora-00119解决办法
    eclipse中多个工程编译到同一个目录下
  • 原文地址:https://www.cnblogs.com/dps001/p/4479157.html
Copyright © 2020-2023  润新知