• Duilib自定义控件响应指定命令(转载)


    转载:http://blog.csdn.net/panxianzhan/article/details/50772893

    转载:http://www.cnblogs.com/duguxue/p/3922686.html

    转载:http://blog.csdn.net/fighton/article/details/76110371

    duilib在UIManager.h里的EVENTTYPE_UI枚举里定义了很多控件命令,如字符输入、双击、鼠标离开等等,然而这些事件不是在所有控件上都会得到处理,所以当我们有需要响应这些事件而对应的原生控件又没有处理时,那就要自己派生一个控件去处理这个的事情了。方法很简单:继承需要的控件,然后覆盖它的虚函数virtual void DoEvent(TEventUI& event),调用SendNotify函数,把要处理的事件告诉UIManager。这样控件所在的对话框就能收到对应该事件的消息。

    下面举个例子,让CHorizontalLayoutUI响应鼠标进入事件,效果如下:

     第一步:自定义新控件,继承CHorizontalLayoutUI

    1 class CHorizontalLayoutUIEx : public CHorizontalLayoutUI
    2 {
    3 public:
    4     virtual void DoEvent(TEventUI& event); //覆盖处理UI事件的虚函数
    5     const static CDuiString controlLabel;
    6 };

    第二步:实现DoEvent()函数,转发UIEVENT_MOUSEENTER通知

     1 void CHorizontalLayoutUIEx::DoEvent( TEventUI& event )
     2 {
     3     if( event.Type == UIEVENT_MOUSEENTER )
     4     {
     5         //告诉UIManager这个消息需要处理
     6         m_pManager->SendNotify(this, DUI_MSGTYPE_MOUSEENTER);
     7         return;
     8     }
     9     
    10     //其他事件用父类方法处理
    11     __super::DoEvent(event);
    12 }

    第三部:在使用该控件的界面类响应上一步通知的消息

    头文件声明:

    1 class MainDlg:    public WindowImplBase
    2 {
    3 public:
    4     DUI_DECLARE_MESSAGE_MAP(); //声明<消息,响应函数>映射
    5     void OnMouseEnter(TNotifyUI& msg); //声明鼠标进入响应函数 
    6 }

    cpp实现:

     1 //定义<消息,响应函数>映射关系
     2 DUI_BEGIN_MESSAGE_MAP(MainDlg,WindowImplBase)
     3     DUI_ON_MSGTYPE(DUI_MSGTYPE_MOUSEENTER,OnMouseEnter)
     4     DUI_END_MESSAGE_MAP()
     5 
     6 //鼠标进入响应函数实现
     7 void MainDlg::OnMouseEnter( TNotifyUI& msg )
     8 {
     9     CDuiString controlName = msg.pSender->GetName();
    10     if ( controlName == _T("optALayout") || controlName == _T("optBLayout") ||
    11         controlName == _T("optCLayout") || controlName == _T("optDLayout"))
    12     {
    13         CHorizontalLayoutUI* layout = dynamic_cast<CHorizontalLayoutUI*>(msg.pSender);
    14         layout->SetBorderColor(0xFF58A1CC); //设置描边颜色
    15         layout->SetBorderSize(1); //设置描边宽度
    16         CControlUI* deleteBtn = layout->FindSubControl(_T("delete"));
    17         deleteBtn->SetVisible(true);
    18     }
    19 }
  • 相关阅读:
    JDK Integer.reverse 算法实现分析
    HomeBrew更新
    时序数据简介
    MQTT协议简析
    Maven+Spring Profile实现生产环境和开发环境的切换
    Thread与Runnable的一个小陷阱
    HashMap的内部实现机制,Hash是怎样实现的,什么时候ReHash
    该不该在C#中使用var关键词
    疑难问题解决备忘录(3)——ubuntu12.04配置vsftp本地用户登录
    疑难问题解决备忘录(2)——ubuntu12.04分配swap
  • 原文地址:https://www.cnblogs.com/chechen/p/6008282.html
Copyright © 2020-2023  润新知