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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本: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 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);}				

警告:本文為自動翻譯

內容

文章識別碼:145698 - 最後檢閱時間:03/01/2014 10:00:48 - 修訂: 5.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbinfo kbhowto kbtshoot kbacceleratorkey kbcode kbctrlcreate kbkeyaccel kbprb KB145698 KbMtzh
意見反應