CBrowseEditUI、CInplaceBrowseEditUI
如何点击搜索按钮时弹出一个模式对话框
如图,点击放大镜时弹出一个对话框,必须点击里面的取消按钮才会关闭,点击对话框以外的区域无法关闭。
要点:由于对话框需要一个ITrancodeManager传递给基类WindowImplBaseEx,所以这种类型的CBrowseEditUI跟正常类型的多了一个成员变量ITrancodeManager* m_pTrancodeManager;并增加了一个成员函数:void SetTranManager(ITrancodeManager* pTrancodeManager);可以参考CBrowseEditEcnmrUI。
需要在使用该控件的页面类中调用SetTranManager。
如果没有调用SetTranManager,则显示正常的下拉列表而不是模态对话框。
Tab键及焦点跳转的问题
如图,当用户通过UP、DOWN按键选择一个选项按回车后,有两种需求:
-
下拉列表框收起,焦点自动跳转到下一个控件,比如颜色上
1、需要将属性wantreturntab设为true
2、在派生类的OnDropdownClose()函数中,需要加上if (IsWantReturnTab()) NextCtrl(true);
参考CBrowseEditMUI。
-
下拉列表框收起,焦点仍在该控件上,比如用户希望选择物料后再按一次回车键就可以直接执行查询
1、需要将属性wantreturntab设为false
2、在派生类的OnDropdownClose()函数中,需要加上if (IsWantReturnTab()) NextCtrl(true);
3、在页面的DUI_MSGTYPE_RETURN通知处理函数,根据当前焦点控件进行判断处理,参考CDuiPageVa10LS::Notify函数。
如何实现回车或文本输入弹出下拉框、点击放大镜弹出模式对话框
在CBrowseEditUI::OnClick函数中,判断m_DropdownReason的值。
DUI_MSGTYPE_RETURN通知
因为CBrowseEditUI继承自CEditUIEx,继而继承自CEditUI,CEditUI默认情况下(wantreturn=true)回车时会发送DUI_MSGTYPE_RETURN通知,但是我们不希望CBrowseEditUI在回车时直接发送DUI_MSGTYPE_RETURN通知,而是希望先显示下拉列表供用户选择数据,选中后再根据需要是发送DUI_MSGTYPE_RETURN通知还是跳转到下一个控件。
为此
1、重载虚拟函数IsWantReturn()返回false,因为父类会根据它的返回值决定是否发送DUI_MSGTYPE_RETURN通知,返回false就禁止父类发送通知了。
2、在CBrowseEditUI::OnReturn()中,根据wantreturntab决定是跳转到下一个控件还是发送DUI_MSGTYPE_RETURN通知。OnReturn()是在CBrowseEditUI::DoEvent()中调用的。