簡體   English   中英

在對話框中處理加速器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM