去除wxTextCtrl的右击菜单或者实现wxTextCtrl在windows下Ctrl+A热键
2015-10-13 16:45
239 查看
项目提交验收的时候发现了wxTextCtrl在空内容右击菜单功能项会出现问题,这个功能实际上是冗余的,但是wxWidgets本身并没有提供一个可以手动配置的方法去除,于是我考虑了方法重载。
声明时间表是必须的,因为时间处理机制是根据eventloop来查找下一个处理函数,没有声明处理函数,最后在事件处理表里面存在还是父级的处理函数
注意点一点如果TextCtrl具有 wxTE_Rich 属性 那么textCtrl内部实现将与基本的textCtrl的实现存在区别,我们此时去重写textCtrl的方法将无法对控件生效,
之前重写右击菜单就能很好的验证这一点。
wxTE_Rich这个属性,我之前想利用了他在windwos环境下能够提供Ctrl+A 快捷键的功能,但是发现了这些drawbacks,于是我舍弃了它,实现Ctrl+A热键我也是利用了
函数重写。
通过查看wxTextCtrl的源码,我发现在父类wxTextEntry中存在着 copy redo select等关键字,于是我推测内部wxTextCtrl内部实现复制粘贴等也是调用
wxTextEntry的对应的方法,通过注释我发现了DoSetSelection(from,to,flags) from,to入值为-1时会实现内容全部选择的功能,于是我便确定下一步需要实现的是实现
Ctrl+A监听,
在wxWigdets中间监听按键分 keydown keyup char charhook这四种方式
keydown/up的方式只能响应单键位,无法响应组合键,并且在形参keyevent中不存getModifier()这样的方法(注释:java的keyevent中提供这种方式回去修饰按键),
接下主要的区分点在于charhook和char,
char事件能够满足我们的需求,至少能够识别ctrl+a,
charhook 可以实现按键事件拦截的功能,这个事件在所有其他键盘事件之前产生并处理,如果不适用event.Skip(),那么keydown和char事件是无法处理,但是keyup事件还存在。另外在官方文档中说charhook事件将自动向上传递,目前我还没有深入理解这一特性。
最后实现自己的wxTextCtrl的ctrl+a监听的代码。
参考文章
http://www.imooo.com/kaifayuyan/program/402647.htm
class PreviewTextCtrl : public wxTextCtrl { public: PreviewTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value=wxEmptyString, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=0, const wxValidator &validator=wxDefaultValidator, const wxString &name=wxTextCtrlNameStr ):wxTextCtrl(parent,id,value,pos,size,style,validator,name){}; public: // 重写右键菜单 void OnContextMenu(wxContextMenuEvent& event){}; DECLARE_EVENT_TABLE() };
BEGIN_EVENT_TABLE(PreviewTextCtrl, wxTextCtrl) EVT_CONTEXT_MENU(PreviewTextCtrl::OnContextMenu) END_EVENT_TABLE()
声明时间表是必须的,因为时间处理机制是根据eventloop来查找下一个处理函数,没有声明处理函数,最后在事件处理表里面存在还是父级的处理函数
注意点一点如果TextCtrl具有 wxTE_Rich 属性 那么textCtrl内部实现将与基本的textCtrl的实现存在区别,我们此时去重写textCtrl的方法将无法对控件生效,
之前重写右击菜单就能很好的验证这一点。
wxTE_Rich这个属性,我之前想利用了他在windwos环境下能够提供Ctrl+A 快捷键的功能,但是发现了这些drawbacks,于是我舍弃了它,实现Ctrl+A热键我也是利用了
函数重写。
通过查看wxTextCtrl的源码,我发现在父类wxTextEntry中存在着 copy redo select等关键字,于是我推测内部wxTextCtrl内部实现复制粘贴等也是调用
wxTextEntry的对应的方法,通过注释我发现了DoSetSelection(from,to,flags) from,to入值为-1时会实现内容全部选择的功能,于是我便确定下一步需要实现的是实现
Ctrl+A监听,
在wxWigdets中间监听按键分 keydown keyup char charhook这四种方式
keydown/up的方式只能响应单键位,无法响应组合键,并且在形参keyevent中不存getModifier()这样的方法(注释:java的keyevent中提供这种方式回去修饰按键),
接下主要的区分点在于charhook和char,
char事件能够满足我们的需求,至少能够识别ctrl+a,
charhook 可以实现按键事件拦截的功能,这个事件在所有其他键盘事件之前产生并处理,如果不适用event.Skip(),那么keydown和char事件是无法处理,但是keyup事件还存在。另外在官方文档中说charhook事件将自动向上传递,目前我还没有深入理解这一特性。
最后实现自己的wxTextCtrl的ctrl+a监听的代码。
void CustomTextCtrl::OnChar(wxKeyEvent& event) { switch ( event.GetKeyCode() ) { case WXK_RETURN: { wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId); InitCommandEvent(event); event.SetString(GetValue()); if ( HandleWindowEvent(event) ) if ( !HasFlag(wxTE_MULTILINE) ) return; //else: multiline controls need Enter for themselves } break; case WXK_TAB: if ( !(m_windowStyle & wxTE_PROCESS_TAB)) { if ( FindFocus() == this ) { int flags = 0; if (!event.ShiftDown()) flags |= wxNavigationKeyEvent::IsForward ; if (event.ControlDown()) flags |= wxNavigationKeyEvent::WinChange ; if (Navigate(flags)) return; } } else { // Insert tab since calling the default Windows handler // doesn't seem to do it WriteText(wxT("\t")); return; } break; case WXK_CONTROL_A: wxTextEntry::DoSetSelection(-1,-1,0); return; } // no, we didn't process it event.Skip(); }别忘了添加事件表声明
BEGIN_EVENT_TABLE(CustomTextCtrl, wxTextCtrl) EVT_CONTEXT_MENU(CustomTextCtrl::OnContextMenu) EVT_CHAR(CustomTextCtrl::OnChar) END_EVENT_TABLE()
参考文章
http://www.imooo.com/kaifayuyan/program/402647.htm
相关文章推荐
- Matlab如何真正自如的控制legend(转!!!!)
- SQL Server ->> 存储过程sp_rename重命名数据对象
- android 教你制作音乐播放器
- KMP算法的java实现
- SQL优化(Oracle)
- C Primer plus 5th 第七章学习笔记 break 与continue
- 数据库常见面试题
- 扫描银行卡自动识别,第三方技术API接口介绍
- 触 发器 before 的写法如下
- [原创]PostgreSQL中十进制、二进制、十六进制之间的相互转换
- [iOS]应用内切换语言,本地化,国际化
- Android自定义View和自定义属性
- 将WORD文件转换成HTML文件的路径问题
- Scala教程(十二)List操作高级进阶实战
- 文章标题
- 推荐一个 angular 图像加载插件
- jquery获取文档高度和窗口高度问题
- mvn打包发布
- js闭包
- ASP学习笔记