[原]MFC中DIALOG(对话框)程序响应加速键(快捷键)

2014-8-6阅读266 评论0

新建一个对话框程序,项目名为Test,删除默认确定,取消和静态文本框控件。添加一个按钮,Caption修改为“打开”,ID为IDC_Open,双击该按钮添加响应函数,响应函数如下:

void CTestDlg::OnBnClickedOpen()
{
MessageBox("打开 被按下");
}

即程序运行之后点击“打开”则弹出一个对话框。

下面为这个按钮添加快捷键ctrl+o。左下角切换到“资源视图”,然后项目名上右键>添加>资源

其中IDR_ACCELERATOR1 为加速键资源ID,在它上面右键>属性,打开“快捷键节点”窗口,可以在这个窗口中修改这个ID,这个ID在后面的代码中会用到


此时窗口中间是快捷键编辑窗口,点击其中一行则右侧显示这一行响应的编辑器,注意右侧窗口的标题

切换到“类视图”,在CTestDlg上右键>添加>添加变量

CTestDlg的构造函数中添加加速键初始化代码,注意LoadAccelerators()参数中的IDR_ACCELERATOR1要和之前提到的加速键资源ID要一样

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CTestDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//加速键初始化
hAccKey=LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
}

为CTestDlg类添加PreTranslateMessage虚函数,项目>类向导


BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)

{
if(TranslateAccelerator(m_hWnd,hAccKey,pMsg)){
return true;
} return CDialogEx::PreTranslateMessage(pMsg);
}

Ctrl+F5,程序运行起来之后点击Ctrl+o就会弹出对话框,和点击“打开”效果一样。

下面通过响应键盘消息的方式让这个程序对按下字母a也响应“打开”事件。

项目>类向导

void CTestDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if('a' == nChar){
OnBnClickedOpen();
}
CDialogEx::OnChar(nChar, nRepCnt, nFlags);
}

但是这样是不能响应按键消息的,因为对话框程序中键盘消息会被拦截。还需要在刚才的PreTranslateMessage(MSG*pMsg)函数中用SendMessage重新发送键盘消息。修改之后的PreTranslateMessage(MSG*pMsg)函数如下

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if(TranslateAccelerator(m_hWnd,hAccKey,pMsg)){
return true;
}
SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
return 0;
//return CDialogEx::PreTranslateMessage(pMsg);
}

这样程序就能够响应键盘消息。运行程序,按a或者ctrl+o都会弹出对话框。

总结

对话框中使用加速键的步骤:

1.添加Accelerator资源,绑定控件ID和快捷键,这里控件ID也可以使菜单ID,如果为菜单添加加速键的话。

2.添加HACCEL类型的变量,假设变量名为hAccKey,在构造函数或初始化函数中对该变量初始化,hAccKey=LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));//这里IDR_ACCELERATOR1要和步骤1新建的Accelerator资源ID相同

3.添加PreTranslateMessage函数,函数中通过下面的语句捕获加速键

if(TranslateAccelerator(m_hWnd,hAccKey,pMsg)){

return true;

}

对话框程序响应OnChar的关键点是在PreTranslateMessage函数中使用SendMessage重新发送键盘消息。SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);

[原]MFC中DIALOG(对话框)程序响应加速键(快捷键)的更多相关文章

  1. VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)

    基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情 ...

  2. MFC中文件对话框类CFileDialog详解及文件过滤器说明

    当前位置 : 首页 » 文章分类 :  开发  »  MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为 ...

  3. MFC中模态对话框和非模态对话框的差别

    在MFC中有模态对话框和非模态对话框,那这两种有什么差别呢. 又都是用于什么场合呢. 首先,要弄清楚2种对话框是怎样创建的. 然后要弄清楚2种对话框有什么差别,可能从表面上看,模态会堵塞主对话框.可原 ...

  4. MFC中为菜单或按钮添加快捷键功能

    1.新建一快捷键资源,ACCELERATOR,关联相应的ID号,下图所示中,其中,第一个ID为自定义快捷键ID,按CTRL+R,此时响应该ID以应的消息响应函数, 第二个ID为菜单ID,此时按CTRL ...

  5. MFC中菜单的命令响应顺序

    响应只可以由Doc,View,MainFrame以及APP四个类完成. 响应顺序是: 点击某菜单项,框架类最先接到菜单命令消息. 框架类把接收到得这个消息交给它的子窗口,即视图类. 视图类根据命令消息 ...

  6. MFC中不同对话框间使用SendMessage发送自定义消息的具体实现

    1. 基本知识 SendMessage的基本结构如下: SendMessage(     HWND hWnd,  //消息传递的目标窗口或线程的句柄.     UINT Msg, //消息类别(这里可 ...

  7. Android中Dialog对话框的调用及监听

    Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter, ...

  8. MFC中设置对话框/窗体大小固定

    对话框:1.响应WM_GETMINMAXINFO消息(设置lpMMI->ptMinTrackSize和lpMMI->ptMaxTrackSize)2.响应消息WM_SYSCOMMAND,屏 ...

  9. Android中Dialog对话框

    布局文件xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

随机推荐

  1. dig---域名查询

    dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. QUESTION SECTION 这部分是提问,显示你要查询的域名 ANSWER SECTION 即答案,显示查询到的域名对应的IP ...

  2. 算法导论——lec 12 平摊分析与优先队列

    在平摊分析中,运行一系列数据结构操作所须要的时间是通过对运行的全部操作求平均得出.反映在不论什么情况下(即最坏情况下),每一个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方 ...

  3. 比较s+=4;和s=s+4;的不同

    1.s=s+4: public class Test { public static void main(String[] args){ short s=3; // s=s+4; //描述 资源 路径 ...

  4. Angularjs: 封装layDate指令

    [摘要]由于业务需要,将bootstrap-datetimepicker改成了layDate. layDate是一个较成熟且便于操作的jQuery日期插件,支持同一个视图内范围选择.封装成一个指令在多 ...

  5. 【hdu 1083】Courses

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=1083 [Description] 有p门的课,每门课都有若干学生,现在要为每个课程分配一名课代表, ...

  6. 【2017 Multi-University Training Contest - Team 9】FFF at Valentine

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6165 [题意] 一张有向图,n个点,m条边,保证没有重边和自环.询问任意两个点能否满足任何一方能够到达另 ...

  7. tomcat做成windows服务之后使用JMX监控的问题

    转载:http://blog.chinaunix.net/uid-20449851-id-2369842.html

  8. 常见c#正则表达式类学习整理

    1.MatchCollection类 用于输入字符串所找到的成功匹配的集合,Regex.Matches 方法返回 MatchCollection 对象 用法 //str:要搜索匹配项的字符串 patt ...

  9. 【MySQL集群】——Java程序连接MySQL集群

    上篇简介了怎样在Windows环境下建立配置MySQL集群,这里用一个实现注冊功能的小Demo通过jdbc的方式连接到MySQL集群中. 外部程序想要远程连接到mysql集群,还须要做的一个操作就是设 ...

  10. MySQL主从复制之Mycat简单配置和高可用

    什么是Mycat 1.Mycat就是MySQL Server,而Mycat后面连接的MySQL Server,就好象是MySQL的存储引擎,如InnoDB,MyISAM等.因此,Mycat本身并不存储 ...