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 4
void 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);
}
				

属性

文章编号: 145698 - 最后修改: 2014年3月1日 - 修订: 5.1
这篇文章中的信息适用于:
  • Microsoft Foundation Class Library 4.2?当用于
    • Microsoft Visual C++ 4.0 标准版
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft OLE Control Developer's Kit (CDK)
    • Microsoft Visual C++ 2005 Express Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
    • Microsoft Visual C++ .NET 2002 标准版
关键字:?
kbnosurvey kbarchive kbmt kbinfo kbhowto kbtshoot kbacceleratorkey kbcode kbctrlcreate kbkeyaccel kbprb KB145698 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 145698
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