[原]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. WinForm无边框窗体移动方法

    C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...

  2. logwatch日志监控

    1. 介绍 在维护Linux服务器时,经常需要查看系统中各种服务的日志,以检查服务器的运行状态. 如登陆历史.邮件.软件安装等日志.系统管理员一个个去检查会十分不方便:且大多时候,这会是一种被动的检查 ...

  3. chsh---更换登录系统时使用的shell

    chsh命令   chsh命令用来更换登录系统时使用的shell.若不指定任何参数与用户名称,则chsh会以应答的方式进行设置. 语法 chsh(选项)(参数) 选项 -s<shell 名称&g ...

  4. 玩转阿里云server——安装WebserverTomcat7

    1. 以root用户身份登录阿里云server 2. 使用apt-get install安装Tomcat7 sudo apt-get install tomcat7 3.安装后.Tomcat在启动时报 ...

  5. MySQL具体解释(13)------------事务

    一. 什么是事务 事务就是一段sql 语句的批处理.可是这个批处理是一个atom(原子) .不可切割,要么都运行,要么回滚(rollback)都不运行. 二.为什么出现这样的技术 为什么要使用事务这个 ...

  6. Irrlicht 3D Engine 笔记系列 之 教程5- User Interface

    作者:i_dovelemon 日期:2014 / 12 / 18 来源:CSDN 主题:GUI 引言 今天.博主学习了第五个教程. 这个教程解说了怎样使用Irrlicht内置的一个基础模块.GUI模块 ...

  7. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 托管代码(.NET)

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览  托管代码(.NET)         在SP2010中,微软提 ...

  8. JavaScript中的*top、*left、*width、*Height具体解释

    来源:http://www.ido321.com/911.html html代码 1: <body> 2: <div class="father" id=&quo ...

  9. ubuntu-date命令的使用

    date命令是关于时间的命令.它可以用来查看.更改系统时间 它的基本格式为 date "+ %H" 注意 "+"是不可以省略的.结果如下 zhangshuli@ ...

  10. android.graphics.Paint方法setXfermode (Xfermode x...

    mPaint = new Paint(); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); 常见的Xfermod ...