【duilib进阶】自定义控件响应指定命令
2016-03-01 15:23
525 查看
duilib在UIManager.h里的EVENTTYPE_UI枚举里定义了很多控件命令,如字符输入、双击、鼠标离开等等,然而这些事件不是在所有控件上都会得到处理,所以当我们有需要响应这些事件而对应的原生控件又没有处理时,那就要自己派生一个控件去处理这个的事情了。方法很简单:继承需要的控件,然后覆盖它的虚函数virtual void DoEvent(TEventUI& event),调用SendNotify函数,把要处理的事件告诉UIManager。这样控件所在的对话框就能收到对应该事件的消息。
下面举个例子,让CHorizontalLayoutUI响应鼠标进入事件,效果如下:
第一步:自定义新控件,继承CHorizontalLayoutUI
第二步:实现DoEvent()函数,转发UIEVENT_MOUSEENTER通知
第三部:在使用该控件的界面类响应上一步通知的消息
头文件声明:
cpp实现:
大功告成!
下面举个例子,让CHorizontalLayoutUI响应鼠标进入事件,效果如下:
第一步:自定义新控件,继承CHorizontalLayoutUI
class CHorizontalLayoutUIEx : public CHorizontalLayoutUI { public: virtual void DoEvent(TEventUI& event); //覆盖处理UI事件的虚函数 const static CDuiString controlLabel; };
第二步:实现DoEvent()函数,转发UIEVENT_MOUSEENTER通知
void CHorizontalLayoutUIEx::DoEvent( TEventUI& event ) { if( event.Type == UIEVENT_MOUSEENTER ) { //告诉UIManager这个消息需要处理 m_pManager->SendNotify(this, DUI_MSGTYPE_MOUSEENTER); return; } //其他事件用父类方法处理 __super::DoEvent(event); }
第三部:在使用该控件的界面类响应上一步通知的消息
头文件声明:
class MainDlg: public WindowImplBase { public: DUI_DECLARE_MESSAGE_MAP(); //声明<消息,响应函数>映射 void OnMouseEnter(TNotifyUI& msg); //声明鼠标进入响应函数 }
cpp实现:
//定义<消息,响应函数>映射关系 DUI_BEGIN_MESSAGE_MAP(MainDlg,WindowImplBase) DUI_ON_MSGTYPE(DUI_MSGTYPE_MOUSEENTER,OnMouseEnter) DUI_END_MESSAGE_MAP() //鼠标进入响应函数实现 void MainDlg::OnMouseEnter( TNotifyUI& msg ) { CDuiString controlName = msg.pSender->GetName(); if ( controlName == _T("optALayout") || controlName == _T("optBLayout") || controlName == _T("optCLayout") || controlName == _T("optDLayout")) { CHorizontalLayoutUI* layout = dynamic_cast<CHorizontalLayoutUI*>(msg.pSender); layout->SetBorderColor(0xFF58A1CC); //设置描边颜色 layout->SetBorderSize(1); //设置描边宽度 CControlUI* deleteBtn = layout->FindSubControl(_T("delete")); deleteBtn->SetVisible(true); } }
大功告成!
相关文章推荐
- 被忽视的控件UIToolbar
- SAP query生成的程序名
- IOS(UI)_模态推送
- UILabel相关
- UIKit框架(22)UITableView之静态单元格
- IOS(UI)_相框动画(动画轮播)
- question_005-JAVA之class-装饰者
- select, iocp, epoll,kqueue及各种I/O复用机制
- UIKit框架(21)UITableView实现复杂单元格(二)
- iOS---Bluetooth工作流程
- iOS---Bluetooth工作流程
- UIButton中imageView和titleLabel的位置调整
- iOS ----Bluetooth
- discuz代码分析之左连接 t1 left join t2 on t1.id=t2.uid where...
- Gradle 中 buildConfigField的巧妙应用
- String、StringBuffer与StringBuilder之间区别
- We could not complete your iTunes Store request
- 深入理解requestAnimationFrame
- UICollectionViewController相关
- UIMenuController的使用