MFC 4.0 和 Visual Basic 4.0 之間助憶鍵的差異的說明

文章翻譯 文章翻譯
文章編號: 145698 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
附註 Microsoft Visual C++.NET 2002年和 Microsoft Visual C++.NET 2003年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。Microsoft Visual C++ 2005年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 以及未受管理的原生 Microsoft Windows 程式碼模型。
全部展開 | 全部摺疊

在此頁中

徵狀

提供的說明 OLE 控制項的助憶鍵的 COleControl::OnGetControlInfo 快速鍵對應表不適用於 MFC 4.0 和 Visual Basic 4.0 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 中。

在對應鍵對應表中使用快速鍵是由 ACCEL 結構定義。[ACCEL 結構具有下列定義:
   typedef struct tagACCEL
   {
       BYTE   fVirt;
       WORD   key;
       WORD   cmd;
   } ACCEL;
				
的 fVirt 成員指定對應鍵 (Accelerator) 對應旗標。這個成員可以是下列值的組合:
   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 成員指定對應鍵識別項。按下對應鍵時,這個值會處於 WM_COMMAND 或 WM_SYSCOMMAND 訊息的 wParam 參數的低序位文字。

Visual Basic 4.0 具有對應鍵對應表項目用於助憶鍵字處理下列需求:

  • fVirt 成員必須是兩者的組合 (FVIRTKEY | FALT) 或 (FVIRTKEY | FALT | FSHIFT)。
  • 索引鍵成員必須是大寫。
  • cmd 成員必須不等於 0。
MFC 4.0 具有對應鍵對應表項目用於助憶鍵字處理下列需求:

  • fVirt 成員必須 FALT 或 0。
  • 索引鍵成員必須小寫。
  • cmd 成員會被略過。
MFC 4.0 OLE 控制項容器也不同於 Visual 基本 4.0,它們處理助憶鍵字處理,當控制項是使用中的使用者介面的方式。 處理鍵盤輸入的 MFC 容器時, 首先檢查 OLE 控制有焦點。如果是這樣架構會呼叫其 IOleInPlaceActiveObject::TranslateAccelerator 方法。在 [COleControl 控制項的 PreTranslateMessage 函式會呼叫這個方法的實作。OLE 控制項正確有它的助憶鍵函式,當控制項為作用中的使用者介面以便 OLE 控制項必須覆寫 PreTranslateMessage,並檢查其特殊的按鍵組合。

注意: 不需要如果控制項產生與 Visual C++ 5.0 或以上,因為當控制項為 UI 的 SendMnemonic COccManager::IsDialogMessage 在作用中,將會呼叫 OnMnemonic 覆寫 PreTranslateMessage。

下列的範例程式碼示範一個覆寫的 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 Standard Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • 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 Standard Edition
關鍵字:?
kbnosurvey kbarchive kbmt kbinfo kbhowto kbtshoot kbacceleratorkey kbcode kbctrlcreate kbkeyaccel kbprb KB145698 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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