![](/img/trans.png)
[英]MFC SDI changed menu using SetMenu but how to change accelerators?
[英]Adding accelerators(shortcuts) in MFC - HOW?
我找到了這個鏈接: http : //support.microsoft.com/kb/222829
但我無法理解那么多。
好的,我知道我需要將它添加到我的頭文件中:
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加載其他東西),我無法理解這是如何工作的,需要一點幫助
現在,MSDN文章具有誤導性。 它顯示了如何將加速器添加到“關於”框中,只有“關於”框將能夠處理加速器,在這種情況下,相當於按下具有IDC_BUTTON1 ID的按鈕。
您需要做一些非常不同的事情,允許應用程序中的所有對象都有機會處理此消息。 這是在MDI / SDI應用程序中為您完成的。
在資源中創建加速器表后,必須添加加速器:組合密鑰組合加速器組合鍵,在使用時生成具有適當ID的命令消息。 完成添加后,必須為每個ID創建命令消息處理程序。 使用加速器時,將調用處理程序,您可以添加所需的代碼。 現在執行此操作:向您的app類聲明HACCEL類型變量。 在InitInstance中調用LoadAccelerators。 使用向導在應用程序類中插入PreTranslateMessage覆蓋。 添加以下:
if (m_hAccelTable)
{
if (::TranslateAccelerator(*m_pMainWnd, m_hAccelTable, pMsg))
{
return(TRUE);
}
}
這將允許主對話框處理加速器。 注意* m_pMainWnd。 它是您的對話框句柄(自動轉換)。 現在,您可以將任何加速器的處理程序添加到對話框或應用程序類。 您還可以使用OnCmdMsg將命令消息路由到應用程序中的任何窗口。
我對未來的建議。 當您決定使應用程序成為基於對話框時,請考慮使用CFormView派生類創建SDI應用程序。 您可以更改框架樣式以不允許調整大小,它看起來像基於對話框但是。 。 。 您將能夠免費使用工具欄菜單,最重要的是,您將免費獲得所有加速器和命令路由。
您引用的頁面描述了將加速器表添加到基於對話框的應用程序。
您是使用菜單欄創建基於對話框的應用程序還是僅使用普通的基於MFC幀的應用程序?
如果您正在執行前者,那么當您引用的頁面建議您需要覆蓋PreTranslateMessage對話框方法時。
如果您正在執行稍后操作,則只需調用CFrameWnd :: LoadAccelTable函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.