1

我的 mainCDialog有时会显示一个像这样的子无模式对话框:

在此处输入图像描述

仅当用户将其配置为自动显示时才会显示。


OnInitDialog它通过调用此函数的主对话框显示:

void CChristianLifeMinistryEditorDlg::DisplayAssignHistoryDialog()
{
    BOOL    bShowAssignHistoryDialog;
    bShowAssignHistoryDialog = theApp.GetNumberSetting(_T("Options"), _T("SM_ShowAssignHist"), TRUE);
    if (bShowAssignHistoryDialog)
    {
        m_pAssignHistoryDlg = std::make_unique<CAssignHistoryDlg>(); // .release();
        if (m_pAssignHistoryDlg != nullptr)
        {
            m_pAssignHistoryDlg->SetAssignHistMap(&m_mapSPtrHist, &m_HistoryOriginal);
            m_pAssignHistoryDlg->Create(IDD_DIALOG_ASSIGN_HISTORY, this);
            m_pAssignHistoryDlg->ShowWindow(SW_SHOWNORMAL);
            m_pAssignHistoryDlg->UpdateWindow();
            m_pAssignHistoryDlg->EnableTree(false);
        }
    }
}

我注意到我的一些主窗口加速器热键并不总是有效。然后我意识到这是因为弹出窗口具有焦点。如果我单击主对话框上的任意位置以使其获得焦点,那么我的加速器热键将起作用。


即使无模式窗口可能有焦点,我们是否仍然可以轻松地允许主编辑器处理它的热键?一个标准的方法来满足这个?


主窗口像这样处理加速器:

BOOL CChristianLifeMinistryEditorDlg::PreTranslateMessage(MSG * pMsg)
{
    if (m_hAccelTable)
    {
        if (::TranslateAccelerator(GetSafeHwnd(), m_hAccelTable, pMsg))
            return TRUE;
    }
}

并且弹出的无模式窗口也使用PreTranslateMessage(如果它是相关的):

BOOL CAssignHistoryDlg::PreTranslateMessage(MSG* pMsg)
{
    BOOL    bNoDispatch{}, bDealtWith = bDealtWith = FALSE ;

    if ( (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP || 
        pMsg->message == WM_CHAR) 
        && pMsg->wParam == VK_RETURN)
    {
        // Eat it.
        bNoDispatch = TRUE ;
        bDealtWith = TRUE ;
    }

    if (!bDealtWith)
        bNoDispatch = CResizingDialog::PreTranslateMessage(pMsg);

    return bNoDispatch ;
}
4

1 回答 1

2

我会将您的m_hAccelTablefrom CChristianLifeMinistryEditorDlgto传递给CAssignHistoryDlg并将其添加到的开头CAssignHistoryDlg::PreTranslateMessage

if (m_hAccelTable)
{
    if (::TranslateAccelerator(GetParent()->GetSafeHwnd(), m_hAccelTable, pMsg))
        return TRUE;
}
于 2022-01-06T01:36:58.033 回答