zoukankan      html  css  js  c++  java
  • [原]MFC中DIALOG(对话框)程序响应加速键(快捷键)

    [原]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);

  • 相关阅读:
    CSS基础应用学习系列(3)——图像的CSS阴影效果
    激活flash控件
    用一句SQL取出第 m 条到第 n 条记录的方法
    javascript检测浏览器和操作系统detect.js
    开始学习VS2008+.net3.5咯 :)
    用GridView编辑更新独立的单元格
    征服ASP.NET Ajax典型应用 (试读)
    CSS基础应用学习系列(4)――用CSS对列表应用样式
    Android SQLite学习指南
    Java内部类使用总结
  • 原文地址:https://www.cnblogs.com/dengpeng1004/p/4530298.html
Copyright © 2011-2022 走看看