MFC快捷键的编程

来源:互联网 发布:网络病毒营销案例 编辑:程序博客网 时间:2024/06/07 15:10

     

      最近在做一个即时通信软件,用到了类似QQ中按下 Alt+S键就可以把消息发送出去的功能,本来以为这个功能很简单,在PreTranslateMessage中截获S键然后判断Alt键是否按下就可以了,可是Ctrl或者Shift 都可以,Alt 不行,也就是说这种方法不能实现Alt+S的功能,最后换个思路,用如下的方法解决了,希望对您有所帮助,呵呵.

 

       如何使用 Visual C++ 中的模式对话框中的加速键

 

      键盘加速键处理应用程序的主消息循环中调用 TranslateAccelerator() 函数。 但是,模式对话框框管理器消息循环 (内置 Windows) 用于转换和调度消息。 当然,由于此消息循环不处理加速键,它不会调用 TranslateAccelerator() 函数。

若要处理模式对话框中的加速键,您必须覆盖对话框 PreTranslateMessage() 函数,并尝试通过调用作为快捷键处理消息:: TranslateAccelerator()。 如果该方法将失败,然后处理将继续通过调用基类 PreTranslateMessage()

     下面的例子,我们添加到 MFC MDI 应用程序的 AboutBox 对话框的加速键功能:

创建一个名为测试的 MFC MDI 应用程序。

添加按钮与资源 ID"IDC_BUTTON1"AboutBox 对话框框资源。

双击按钮以添加该按钮处理程序,并为加速键的一个标记中插入以下代码: 

    AfxMessageBox("Hello");

插入新的加速器表资源。

通过关联 F 5 将加速键添加到表键为资源 ID"IDC_BUTTON1"

向类添加成员变量,m_hAccelTable 中,CAboutBox 

    HACCEL  m_hAccelTable;

7   初始化 m_hAccelTable CAboutBox::CAboutBox 中的: 

     m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle   (), MAKEINTRESOURCE(IDR_ACCELERATOR1));

使用代码向导 (在类向导在 Visual C++6.0 及更早版本) 为该 CAboutDlg 中添加该 PreTranslateMessage 的重写。

在 CAboutBox::PreTranslateMessage() 方法中添加代码以下行: 

     BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) 

    {

     if (m_hAccelTable) 

      {

      if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) {

         return(TRUE);

        }

       }

     return CDialog::PreTranslateMessage(pMsg);

 

     }

10  编译并运行 CTestApp

结果在 CAboutBox 处于活动状态时,快捷键 F 5 键立即触发 button 1 处理程序。 

 

   

     这篇文章中的信息适用于:

       Microsoft Foundation Class Library 4.2 当用于

 

Microsoft Visual C++ 4.1 Subscription

Microsoft Visual C++ 4.2 企业版

Microsoft Visual C++ 5.0 企业版

Microsoft Visual C++ 6.0 企业版

Microsoft Visual C++ 4.2 专业版

Microsoft Visual C++ 5.0 专业版

Microsoft Visual C++ 6.0 专业版

Microsoft Visual C++, 32-bit Learning Edition 6.0

Microsoft Visual C++ .NET 2002 标准版

Microsoft Visual C++ .NET 2003 Standard Edition

 

原创粉丝点击