如何使用 Visual C++ 中的 [] 對話方塊上的對應鍵和主功能表

文章翻譯 文章翻譯
文章編號: 100770 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

許多應用程式使用強制回應對話方塊作為主應用程式視窗。使用這項技術的應用程式可能也包含對話方塊上的主功能表。通常,一或多個功能表項目有與其相關聯的快速鍵。本文將告訴您,將功能表和鍵盤快速鍵新增至 MFC 應用程式精靈] 對話方塊方塊為主應用程式所需的步驟。

其他相關資訊

一般應用程式,由使用 Visual C++ 和 Microsoft Windows 軟體開發套件 (SDK) 開發 Microsoft Windows 作業系統,並使用鍵盤快速鍵在其主訊息迴圈呼叫 TranslateAccelerator() 函式。不過,在使用強制回應對話方塊作為主視窗時, 應用程式並沒有主訊息迴圈,改,應用程式用來翻譯和分派訊息的對話方塊方塊管理員訊息迴圈 (內建於 Windows)。當然因為此訊息迴圈不是為了處理加速器,它不會呼叫 TranslateAccelerator() 函式。

若要處理在 MFC 中的強制回應對話方塊中的對應鍵,您必須覆寫 CWinApp::ProcessMessageFilter() 函式。架構呼叫 ProcessMessageFilter() 之前處理訊息。

若要修改中正確地處理對應鍵的 Visual C++.NET 的 MFC 應用程式精靈] 對話方塊方塊為基礎的應用程式類型,請依照下列步驟執行:
  1. 在 Visual 的 Studio.NET 中建立一個新的 MFC 應用程式。MFC 應用程式精靈左方按一下 [應用程式類型,並確定 應用程式類型] 設為 [對話方塊架構]。
  2. 在資源檢視連按兩下對話方塊資源,以開啟對話方塊資源編輯器]。對話方塊資源的資源 ID 就像 IDD_ MYPROJECT _DIALOG (其中 MYPROJECT 是您在建立時,指定為您的應用程式專案的名稱)。
  3. 與對話方塊資源在對話方塊資源編輯器中開啟時,找出 [屬性] 視窗。編輯對話方塊 框線 屬性,並指定 的框線樣式。這個步驟是必要的對話方塊,其中包含功能表。
  4. 建立新的功能表資源包含名為的最上層項目 (& I) 檔案和功能表項目命名 & Exit\tCTRL + E (CTRL + X 是通常與剪下文字相關聯因此而是使用 CTRL + E)。
  5. 在功能表] 編輯器中按一下新建立的 Exit 功能表項目。在 [屬性] 視窗中確定 [結束] 功能表項目的 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. 在.cpp 檔包含 CWinApp 衍生實作,尋找 InitInstance() 類別方法。立即在基底類別 CWinApp::InitInstance() 呼叫後新增下行:
    ghAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_ACCELERATOR1));
    					
    附註: 此處使用的資源 ID (IDR_ACCELERATOR1) 是會加入對應鍵對應表資源的識別碼在步驟 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 Standard Edition
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Visual C# .NET 2002 Standard Edition
關鍵字:?
kbmt kbacceleratorkey kbhowto kbkeyaccel kbmenu kbui KB100770 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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