对话框处理TAB按键事件的三种方法
来源:互联网 发布:淘宝属于媒介消费吗 编辑:程序博客网 时间:2024/05/16 06:50
对话框(Dialog)分为模态对话框和非模态对话框(Modeless Dialog)。非模态对话框不能处理TAB键、快捷键等按键事件,也就是说用户不能在非模态对话框中通过按TAB键切换各控件之间的焦点(Focus)。但这也不是没有解决办法的。
方法一
在MSDN中,让非模态对话框处理TAB按键事件的经典代码如下:
其主要解决方案是让非模态对话框hwndDlgModeless的父窗口hwndMain,在其主消息循环中通过调用IsDialogMessage函数来通知hwndDlgModeless TAB按键事件。可是,如果hwndMain没有明确写出的主消息循环,由该怎么办呢?
方法二
譬如,当hwndMain指向的是一个模态对话框时,其WinMain函数通常实现如下:
资源文件中,IDD_MAINDIALOG定义的对话框只有标题栏、默认的OK(IDOK)键和Cancel(IDCANCEL)键。对话框的主消息循环在系统API DialogBox中,我们无法动其分毫。于是,只有修改WinMain函数,还得添加三个全局变量:
因为将父窗口hwndMain创建为非模态对话框,所以在其主消息循环处除了调用IsDialogMessage函数处理非模态对话框hwndDlgModeless的消息外,还要调用该函数处理hwndMain的消息。另外要特别注意的是,调用DestroyWindow函数销毁对话框hModelessDlg和hwndMain,只能在退出主消息循环之后进行,千万不能放到对话框过程函数DialogFunc中对消息WM_CLOSE和WM_QUIT的处理模块中,否则会引起整个进程陷在主消息循环里,无法退出。在处理消息WM_CLOSE时,只需调用函数PostQuitMessage即可。消息WM_QUIT就不用处理了。以下是让非模态对话框处理TAB按键事件全部代码(除去注释):
方法三
还可以用函数FindResource、LoadResource、LockResource、UnlockResource、FreeResource来加载和释放对话框资源,用函数CreateDialogIndirect创建非模态父对话框hwndMain。要使用这种方法的话,大部分代码都相同或类似,但查找、加载、锁定、释放对话框资源这些代码实现起来颇为麻烦,还不如直接调用函数CreateDialog来得方便、简洁。这里就不详细说明了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/BlackMonkey/archive/2005/09/17/483543.aspx
- 让非模态对话框处理TAB按键事件的三种方法
- 对话框处理TAB按键事件的三种方法
- BCB处理Tab按键事件
- MFC对话框中处理Enter或Esc按键事件方法
- MFC对话框中处理Enter或Esc按键事件方法
- 按键事件的处理
- 按键事件的处理
- Javascript 处理 Ctrl+s 和 Tab 按键响应事件
- 王学岗按键事件的处理
- JAVA事件处理的三种不同方法
- JAVA事件处理的三种不同方法
- IOS--UIAlertViewDelegate对对话框的事件处理方法
- ListView的长按键事件的处理
- BREW按键及其他事件的处理
- symbian 按键事件的处理1
- symbian 按键事件的处理2
- BREW按键及其他事件的处理
- 弹出窗口的返回按键事件处理
- pkg-config使用
- enq: TX - row lock contention(二)
- gcc命令详解
- 为什么有些Office对象的事件无法使用
- enq: TX - row lock contention(三)
- 对话框处理TAB按键事件的三种方法
- 获取iapId
- [转]U盘文件夹 .exe 病毒清理
- 梁咏琪-有时候
- strust2 标签的使用
- 【转】Protocol Buffers 简介
- Jacorb 在 eclipse 中运行 调试 配置
- 争议黄鸣
- SVN服务器的搭建及简易管理