MFC 4.0 和 Visual Basic 4.0 助记键区别的说明

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

145698
本文已归档。它按“原样”提供,并且不再更新。
注意 Microsoft Visual c + +.net 2002年和 Microsoft Visual c + +.net 2003年支持托管的代码模型所提供的 Microsoft.net 框架和非托管本机 Windows 代码模型。本文中的信息仅适用于非托管的 Visual c + + 代码。Microsoft Visual c + + 2005年支持托管的代码模型所提供的 Microsoft.net 框架和非托管本机 Windows 代码模型。
症状
在 MFC 4.0 和 Visual Basic 4.0 OLE 控件容器中不起作用的 COleControl::OnGetControlInfo 描述 OLE 控件的助记键的方式提供一个快捷键对应表。
原因
Visual Basic 4.0 和 MFC 4.0 提供了处理实现,因此它们需要不同的快捷键对应表项的不同助记键。
解决方案
创建快捷键对应表项,以便处理了 Visual Basic 4.0 和 MFC 4.0 OLE 控件容器中控件的助记键。
状态
此行为是设计使然。
更多信息
OLE 控件重写虚拟的 COleControl::OnGetControlInfo 方法,以允许其容器获取控件的助记键的说明。OnGetControlInfo 方法返回类型,除了做其他事情外包含快捷键对应表的句柄 CONTROLINFO 填充出的结构。此快捷键对应表由容器用于执行检查的助记键。当容器确定控件的助记键按下了键时,它调用控件的 IOleControl::OnMnemonic 方法。这将导致 MFC 框架中调用该控件可以重写到执行特殊处理该虚拟 COleControl::OnMnemonic 方法。

Visual Basic 4.0 和 MFC 4.0 OLE 控件助记键处理实现具有 OnGetControlInfo 的方式返回该快捷键对应表中的各项的不同要求。

在快捷键对应表中使用加速键由加速结构定义。在加速结构具有以下定义:
   typedef struct tagACCEL   {       BYTE   fVirt;       WORD   key;       WORD   cmd;   } ACCEL;				
的 fVirt 成员指定加速键标志。此成员可以是下列值的组合:
   Value       Meaning   ---------------------------------------------------------------------   FALT        The ALT key must be held down when the accelerator key is               pressed.   FCONTROL    The CTRL key must be held down when the accelerator key               is pressed.   FNOINVERT   Specifies that no top-level menu item is highlighted when               the accelerator is used. If this flag is not specified, a               top-level menu item will be highlighted, if possible,               when the accelerator is used.   FSHIFT      The SHIFT key must be held down when the accelerator key               is pressed.   FVIRTKEY    The key member specifies a virtual-key code. If this flag               is not specified, key is assumed to specify an ASCII               character code.				
的键成员指定加速键。此成员可以是一个虚拟键代码或一个 ASCII 字符的代码。

cmd 成员指定加速键标识符。在加速键被按下时,此值被放置在低序位字,wParam 参数的 WM_COMMAND 或 WM_SYSCOMMAND 消息。

Visual Basic 4.0 有用于处理助记键的快捷键对应表项为以下要求:

  • fVirt 成员必须的组合 (FVIRTKEY | FALT) 或 (FVIRTKEY | FALT | FSHIFT)。
  • 键成员必须大写。
  • cmd 成员不能等于 0。
MFC 4.0 有用于处理助记键的快捷键对应表项为以下要求:

  • fVirt 成员必须 FALT 或 0。
  • 键成员必须为小写。
  • cmd 成员将被忽略。
MFC 4.0 OLE 控件容器与可视化的基本 4.0 它们处理助记键处理,当控件处于活动状态的用户界面的方式也不同。 处理键盘输入的 MFC 容器时, 首先检查 OLE 控制具有焦点。如果是这样,框架将调用其 IOleInPlaceActiveObject::TranslateAccelerator 方法。在该 COleControl 中控件的 PreTranslateMessage 函数调用此方法的实现。为了 OLE 控件以使其助记键功能正确时该控件是活动的 UI OLE 控件必须重写 PreTranslateMessage 并检查其特殊的键组合。

: 覆盖 PreTranslateMessage 不是必需的如果控件生成与 Visual c + + 5.0 或更高,因为该控件是活动的方式在 COccManager::IsDialogMessage SendMnemonic UI 时,将调用 OnMnemonic。

下面的代码示例显示一个重写的 OnGetControlInfo、 PreTranslateMessage 和 OnMnemonic 允许在一个 MFC 4.0 OLE 控件容器以及 Visual Basic 4.0 容器中正常工作的控件的助记键。

示例代码

/* Compile options needed: None*/ #define NUM_ENTRIES 4void CMnemonicCtrl::OnGetControlInfo(LPCONTROLINFO lpi){  HACCEL hAccel = NULL;  TCHAR ch = 'm';   // Hard code the mnemonic key to 'm' for this                    // example.  ACCEL accKey[NUM_ENTRIES];  // Accel table entries 0 and 1 are to work with Visual Basic 4.0 as a  // container. Visual Basic 4.0 has the following requirements for  // accel table entries for a control's mnemonics:  //   //  (fVirt == FVIRTKEY | FALT) || (fVirt == FVIRTKEY | FALT | FSHIFT)  //  key must be uppercase  //  (cmd != 0)  accKey[0].fVirt = FVIRTKEY | FALT;  accKey[1].fVirt = FVIRTKEY | FALT | FSHIFT;  accKey[0].key = accKey[1].key = LOBYTE(VkKeyScan(ch));  accKey[0].cmd = accKey[1].cmd = 1;  // Accel table entries 2 and 3 are to work with MFC 4.0 containers.  // MFC containers have the following requirements for accel table  // entries for a control's mnemonics:  //   //  (fVirt == FALT) || (fVirt == 0)  //  key should be lowercase  //  cmd is ignored  accKey[2].fVirt = FALT;  accKey[3].fVirt = 0;  accKey[2].key = accKey[3].key = ch;  accKey[2].cmd = accKey[3].cmd = 1;  // Create the accel table.  hAccel = CreateAcceleratorTable(accKey, NUM_ENTRIES);  if (hAccel != NULL)  {    // Fill in the CONTROLINFO structure passed in.    lpi -> hAccel = hAccel;    lpi -> cAccel = NUM_ENTRIES;    lpi -> dwFlags = 0;  }  else    COleControl::OnGetControlInfo(lpi);}// NO need to override PreTranslateMessage if the control is generated in// Visual C++ 5.0 or above.BOOL CMnemonicCtrl::PreTranslateMessage( MSG * pMsg ){  // Check for ALT-M key combination.  if(pMsg->message == WM_SYSKEYDOWN) {    if((pMsg->wParam == 'm')||(pMsg->wParam == 'M'))    {      // Do mnemonic key processing here.      return TRUE;    }  }  return COleControl::PreTranslateMessage(pMsg);}void CMnemonicCtrl::OnMnemonic(LPMSG pMsg){  if ((pMsg->message == WM_SYSKEYDOWN)||      (pMsg->message == WM_SYSCHAR))  {    if ((pMsg->wParam == 'm')||(pMsg->wParam == 'M'))    {      // Do mnemonic key processing here.      return;    }  }  COleControl::OnMnemonic(pMsg);}				

警告: 本文已自动翻译

属性

文章 ID:145698 - 上次审阅时间:03/01/2014 12:52:35 - 修订版本: 5.1

  • Microsoft Foundation Class Library 4.2
  • kbnosurvey kbarchive kbmt kbinfo kbhowto kbtshoot kbacceleratorkey kbcode kbctrlcreate kbkeyaccel kbprb KB145698 KbMtzh
反馈