[英]Handling accelerator in a dialog
我錯過了什么步驟?
我有一個加速器表:
我在我的app類中添加了一個成員變量:
HACCEL m_hAccel;
我添加了以下覆蓋:
BOOL CMeetingScheduleAssistantApp::ProcessMessageFilter(int code, LPMSG lpMsg)
{
if (m_hAccel)
{
if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_hAccel, lpMsg))
{
AfxMessageBox(_T("Found"));
return(TRUE);
}
}
return CWinAppEx::ProcessMessageFilter(code, lpMsg);
}
我只使用彈出消息框進行調試,它確認正在檢測按鍵。
我的菜單資源設置正確:
所以我的菜單是菜單處理程序的操作。 我已經設置了加載加速表的程序。 如果我按下,例如Ctrl + Shift + X,而加速器表檢測到它,為什么我的彈出對話框沒有實際處理它?
我應該指出,我的主應用程序對話框顯示兩個編輯器之一。 因此,當顯示編輯器時,我為該編輯器加載加速器表。
我錯過了什么步驟? 為什么對話框沒有處理加速器?
我找到了這個答案如何使子控件處理父CView的加速器命令 。
我發現如果我直接在我的彈出對話框中添加一個HACCEL
,然后只使用PreTranslateMessage
:
if (m_hAccelTable)
{
if (::TranslateAccelerator(GetSafeHwnd(), m_hAccelTable, pMsg))
return TRUE;
}
有用。
對於對話框中的鍵盤加速器,我這樣做:
在OnInitDialog中
BOOL CMyDlg::OnInitDialog()
{
...
m_hAccel = LoadAccelerators ( AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_DLGACCEL));
...
}
的PreTranslateMessage
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if (m_hAccel)
{
if (::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
return(TRUE);
else
return CDialog::PreTranslateMessage(pMsg);
}
else
return CDialog::PreTranslateMessage(pMsg);
}
在OnDestroy中
void CMyDlg::OnDestroy()
{
...
VERIFY(DestroyAcceleratorTable(m_hAccel)) ;
CDialog::OnDestroy();
}
消息地圖:
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
...
ON_COMMAND(IDC_SOMECOMMANDID, OnDoSomething)
ON_UPDATE_COMMAND_UI(IDC_SOMECOMMANDID, OnUpdateDoSomething)
...
END_MESSAGE_MAP()
命令處理程序
void CMyDlg::OnUpdateDoSomething(CCmdUI* pCmdUI)
{
...
pCmdUI->Enable(...) ;
}
void CMyDlg::OnDoSomething()
{
...
}
.rc文件中的加速器表
IDR_DLGACCEL ACCELERATORS
BEGIN
"A", IDC_SOMECOMMANDID, VIRTKEY, CONTROL, NOINVERT // Ctrl+A
...
END
就這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.