如何使用 Visual c + + 中的对话框上的加速键和主菜单

文章翻译 文章翻译
文章编号: 100770 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

许多应用程序使用与主应用程序窗口的一个模式对话框。使用此技术的应用程序可能还包括对话框上的主菜单。通常,一个或多个菜单项都有与之相关联的键盘加速键。本文介绍在将菜单和键盘加速键添加到 MFC 应用程序向导对话框基于框中的应用程序所需的步骤。

更多信息

典型的应用程序的通过使用 Visual c + + 和 Microsoft Windows 软件开发工具包 (SDK) 开发的 Microsoft Windows 操作系统和使用的键盘加速键,请在其主消息循环中调用 TranslateAccelerator() 函数。但是时您可以使用一个模式对话框作为主窗口,, 在应用程序不具有主消息循环,该应用程序而,使用对话框框中管理器消息循环 (Windows 中内置) 翻译和发送信息。当然,此消息循环不旨在处理加速器,因为它没有调用 TranslateAccelerator() 函数。

若要处理一个模式对话框,在 MFC 中的加速键,您必须重写 CWinApp::ProcessMessageFilter() 函数。框架调用 ProcessMessageFilter() 之前处理一条消息。

若要修改一个 MFC 应用程序向导对话框基于框中的应用程序类型正确处理快捷键的 Visual c + +.net 中,请按照下列步骤操作:
  1. 在 Visual Studio.net 中,创建新的 MFC 应用程序。在 MFC 应用程序向导的左窗格中单击 应用程序类型,然后确保 应用程序类型 设置为 基于对话框
  2. 在资源视图中双击要打开对话框资源编辑器对话框资源。对话框资源的资源 ID 与类似 IDD_ MYPROJECT _DIALOG (其中 MYPROJECT 是您在创建时提供给您的应用程序的项目名称)。
  3. 在对话框资源编辑器中打开该对话框资源找到的属性窗口。编辑对话框 边框 属性,并指定最 的边框样式。此步骤是必需的一个对话框,其中包含一个菜单。
  4. 创建包含一个顶级项名为新菜单资源和文件和一个名为菜单项和 Exit\tCTRL + E (因此而使用 CTRL + E,CTRL + X 将是通常与剪切文本相关联)。
  5. 在菜单编辑器中单击将新创建的 退出 项。在属性窗口中确保 退出 菜单项的 ID 属性被设置为 ID_FILE_EXIT
  6. 通过在 $ 对话框资源 菜单 属性中输入菜单 ID 关联对话框中的新菜单。打开对话框编辑器中的对话框资源并在属性窗口中查找 菜单 属性。将它设置为在步骤 4 中的菜单创建该资源 ID。若要执行此操作,单击下拉列表 菜单 属性行中的,然后单击以在列表中选择该菜单的资源标识号。
  7. 在菜单编辑器,用鼠标右键单击 和 Exit\tCTRL + E,然后单击 添加事件处理程序
  8. 在事件处理程序向导中选择 命令 消息类型。在 列表中选择 CDialog 派生的主类中生成处理程序。请确保函数处理程序名称是相应,然后单击 添加和编辑 为其创建菜单项事件处理程序。
  9. 退出 菜单项事件处理程序方法在第 8 步中生成的函数中插入以下行:
    PostMessage(WM_COMMAND, IDOK, 0L);
    					
    这会产生的效果等同于在用户单击 文件 菜单上的 退出 时,请单击 确定。单击 确定 关闭对话框框中应用程序。

  10. 创建一个新的加速键资源并将相关联的 CTRL + E 组合键与 ID_FILE_EXIT。保存所做的更改。
  11. 编辑 Stdafx.h 文件之后 # include 语句, 声明以下的全局变量:
    extern HWND    ghDlg;          // Handle to main dialog box.
    extern HACCEL  ghAccelTable;   // Handle to accelerator table.
    					
  12. 在.cpp 文件中包含 CWinApp 派生的类实现 (通常在.cpp 文件基名称与您的项目名称的基名称相同),添加以下全局变量的初始化:
    HWND    ghDlg = 0;          // Handle to main dialog box.
    HACCEL  ghAccelTable = 0;   // Handle to accelerator table.
    					
  13. 在主 CDialog 派生的类 (不在对话框类的实现默认 关于 对话框),查找 OnInitDialog() 方法。如有必要,您可以添加 OnInitDialog() 方法重写。要这样做单击以选中类视图窗口中的 CDialog 派生类,然后单击在属性窗口中的 覆盖。查找 OnInitDialog 行,然后单击右侧的列。如果此类没有重写 OnInitDialog(),您可以创建一个重写。
  14. 编辑要包括下面的代码行前面添加的函数:
    ghDlg = m_hWnd;
    					
  15. 包含 CWinApp 派生实现该.cpp 文件中查找 InitInstance() 类方法。在调用基类 CWinApp::InitInstance() 之后立即添加以下行:
    ghAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_ACCELERATOR1));
    					
    注意: 此处使用的资源 ID (IDR_ACCELERATOR1) 是添加的快捷键对应表资源的 ID 在步骤 10。

  16. 添加对 ProcessMessageFilter() 类方法 CWinApp 派生类重写。若要执行此操作,在类视图窗口,请选择 CWinApp 派生的类在项目中。然后,在属性窗口中单击 覆盖。在属性窗口中找到 ProcessMessageFilter 的行并选择行的最右边的列。单击下拉菜单项箭头,然后单击添加为 ProcessMessageFilter 方法重写选项。
  17. 编辑 ProcessMessageFilter() 方法重写,以便它具有以下实现:
    BOOL CMyProjectApp::ProcessMessageFilter(int code, LPMSG lpMsg)
           {
              if (code < 0)
                 CWinApp::ProcessMessageFilter(code, lpMsg);
    
              if (ghDlg && ghAccelTable)
                 {
                 if (::TranslateAccelerator(ghDlg, ghAccelTable, lpMsg))
                    return(TRUE);
                 }
    
             return CWinApp::ProcessMessageFilter(code, lpMsg);
          }
    					
  18. 编译并运行该应用程序。请注意它有一个菜单。 当您单击 退出,在 文件 菜单上,或按 CTRL + E 时, 在应用程序将关闭,按预期的方式。

属性

文章编号: 100770 - 最后修改: 2006年11月21日 - 修订: 3.1
这篇文章中的信息适用于:
  • Microsoft Foundation Class Library 4.2?当用于
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 标准版
    • Microsoft Visual C++ 5.0 标准版
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Visual C# .NET 2002 标准版
关键字:?
kbmt kbacceleratorkey kbhowto kbkeyaccel kbmenu kbui KB100770 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 100770
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com