[ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
来源:互联网 发布:淘宝订单怎么没法评价 编辑:程序博客网 时间:2024/05/03 14:22
场景
- 有时候我们需要单独对某个窗口消息进行拦截,比如CEdit响应回车, 这时候就需要拦截窗口处理过程了. 当然MFC的界面可以重载:
- 也比如CEdit设置ES_MULTILINE属性后并不支持ctrl+a全选, 这时候也需要自己过滤消息增加全选.
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){
但是WTL的CEdit并不支持这种方式,WTL如果想在 PreTranslateMessage 里拦截消息,必须继承 CMessageFilter 后还要把这个控件注册到消息循环里才行,也就是必须写子类 或者从父窗口拦截这个CEdit的消息.
CMessageLoop* pLoop = _Module.GetMessageLoop();ATLASSERT(pLoop != NULL);pLoop->AddMessageFilter(this);
方案
- 通过使用 SetWindowLong来改变窗口处理过程来处理相关的消息,其他消息使用原过程继续处理.
static WNDPROC OldWndProc = NULL;static UiPreviewListDialog* gDialog = NULL;static LRESULT CALLBACK NewEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) // 该对话框新的窗口回调函数,过滤WM_KEYDOWN消息。{ switch(message) { case WM_GETDLGCODE: { return (DLGC_WANTALLKEYS | CallWindowProc(OldWndProc, hWnd, message, wParam, lParam)); // 注意这里,否则没有办法捕获Tab/方向键 } case WM_KEYDOWN: { if(wParam == VK_RETURN) { std::cout << "Enter: " << std::endl; BOOL handle; gDialog->OnSearch(message,wParam,hWnd,handle); } } break; default: break; } return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);} gDialog = this; OldWndProc = (WNDPROC)edit_.SetWindowLong(GWL_WNDPROC, (LONG)NewEditProc);
- 全选,使用ES_MULTILINE后默认不能使用ctrl+a全选.
static std::map<HWND,WNDPROC> gProcs;static LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){ if(msg == WM_CHAR && wParam==1) { SendMessage(hwnd,EM_SETSEL,0,-1); return 1; } else { return CallWindowProc(gProcs[hwnd],hwnd,msg,wParam,lParam); }}WNDPROC p_code = (WNDPROC)edit_code_.SetWindowLong(GWL_WNDPROC, (LONG)Edit_Prc); WNDPROC p_email = (WNDPROC)edit_email_.SetWindowLong(GWL_WNDPROC, (LONG)Edit_Prc); gProcs[edit_code_.m_hWnd] = p_code; gProcs[edit_email_.m_hWnd] = p_email;
参考:
CEdit中对于回车键的响应
SetWindowLong function
CallWindowProc
select-all-text-in-edit-contol-by-clicking-ctrla
0 0
- [ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
- [ATL/WTL]_[初级]_[Win32实现Cocoa的dispatch_async到主线程的异步消息处理]
- [ATL/WTL]_[初级]_[拖放文件到窗口]
- [ATL/WTL]_[初级]_[Windows消息循环初解]
- [ATL/WTL]_[初级]_[环境搭建]
- [ATL/WTL]_[初级]_[转发消息让CStatic支持点击消息操作]
- [ATL/WTL]_[初级]_[窗口如何实现WM_MOUSELEAVE和WM_MOUSEHOVER]
- [ATL/WTL]_[初级]_[SDI程序关闭的注意事项]
- [ATL/WTL]_[初级]_[常用的界面对象操作]
- [ATL/WTL]_[初级]_[选择目录对话框]
- [ATL/WTL]_[初级]_[CBitmap复制图片-截取图片-平铺图片]
- [ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]
- [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]
- [ATL/WTL]_[初级]_[如何使用GetOpenFileName多选文件-根据文件名长度计算lpstrFile长度]
- [wxWidgets]_[初级]_[自定义按钮]
- [Cocoa]_[初级]_[自定义NSTableHeaderView]
- VisualFC使用 - 处理WTL窗口消息
- [ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]
- Glide加载bitmap
- (java)使用redis的第一个简单实例
- java.lang.Class.getResource()这个方法主要是做什么用
- 关于table的一些非主流操作
- C++抽象数据类型
- [ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
- Python哈希查找,构建简单哈希表
- web.xml配置详解
- 欢迎使用CSDN-markdown编辑器
- iOS 开发 一些常用的公共方法
- 遍历Map的四种方法
- linux curl 命令详解
- 常用的MIME类型
- 激光