2012-05-22 97 views
3

我發現這個鏈接:http://support.microsoft.com/kb/222829在MFC中添加加速器(快捷方式) - 如何?

但我不明白這一點。

好吧,我明白我需要把它添加到我的頭文件:

HACCEL m_hAccelTable; 

,然後這樣的:

m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1)); 

我的主要的.cpp

但是,在這不走?

BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) { 
    if (m_hAccelTable) { 
     if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) { 
     return(TRUE); 
     } 
    } 
    return CDialog::PreTranslateMessage(pMsg); 

} 

我需要大約6快捷鍵(Ctrl + U加載的東西,CTRL + O加載其他不便),我不明白這是如何工作的,需要幫助的

回答

11

現在,MSDN文章是誤導性的。它顯示瞭如何將加速器添加到「關於」框,並且只有「關於」框才能夠處理加速器,在這種情況下,等同於使用IDC_BUTTON1 ID按下按鈕。

您需要做一些非常不同的事情,允許應用程序中的所有對象都有機會處理此消息。這在MDI/SDI應用程序中爲您完成。

一旦在資源中創建加速器表,您必須添加加速器:組合鍵配對加速鍵組合在使用時會生成具有適當ID的命令消息。一旦完成添加,您必須爲每個ID創建命令消息處理程序。 使用加速器時,調用處理程序,您可以添加所需的代碼。 現在執行此操作: 將HACCEL類型變量聲明爲您的應用程序類。在InitInstance中調用LoadAccelerators。 使用嚮導在應用程序類中插入PreTranslateMessage覆蓋。加入以下內容:

 if (m_hAccelTable) 
     { 
       if (::TranslateAccelerator(*m_pMainWnd, m_hAccelTable, pMsg)) 
       { 
          return(TRUE); 
       } 
     } 

這將允許主對話框處理加速器。注* m_pMainWnd。這是你的對話句柄(自動鑄造)。 現在,您可以將任何加速器的處理程序添加到對話框或應用程序類中。您還可以使用OnCmdMsg將命令消息路由到應用程序中的任何窗口。

我對未來的建議。 當您決定讓您的應用程序成爲基於對話框時,請考慮使用CFormView派生類創建SDI應用程序。 您可以將框架樣式更改爲不允許調整大小,它看起來像基於對話框但是。 。 。 您將可以免費使用工具欄菜單,最重要的是您可以免費獲得所有加速器和命令路由。

0

頁一點點您引用的內容描述了將加速器表添加到基於對話框的應用程序中。

你正在創建一個基於對話框的應用程序或只是一個普通的MFC框架的應用程序與菜單欄?

如果您正在做前者,那麼您所引用的頁面建議您需要重寫PreTranslateMessage對話框方法。

如果您正在做的更晚,那麼您只需要撥打CFrameWnd::LoadAccelTable函數。

+0

您不需要向由嚮導創建的MDI/SDI應用程序添加任何內容。框架處理所有錯綜複雜的加速器和命令處理/路由。 MSDN示例沒有指定它是什麼類型的應用程序。它顯示瞭如何將「加速器」添加到「關於」框中,而是顯示了一些更有意義的其他示例。 – JohnCz

相關問題