当无模式弹出窗口具有焦点时,加速键不起作用
Accelerator keys not working when modeless popup has the focus
我的主 CDialog
有时会显示一个子无模式对话框,如下所示:
只有在用户配置为自动显示时才会显示。
它通过调用此函数的主对话框 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);
}
}
}
我注意到我的一些主要 windows 加速器热键并不总是有效。然后我意识到这是因为弹出 window 有焦点。如果我单击主对话框上的任意位置以使其获得焦点,那么我的加速器热键就会起作用。
有什么方法可以让主编辑器轻松处理它的热键,即使无模式 window 可能有焦点?满足此要求的标准方法?
主要 window 像这样处理加速器:
BOOL CChristianLifeMinistryEditorDlg::PreTranslateMessage(MSG * pMsg)
{
if (m_hAccelTable)
{
if (::TranslateAccelerator(GetSafeHwnd(), m_hAccelTable, pMsg))
return TRUE;
}
}
并且弹出式无模式 window 也使用了 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 ;
}
我会将你的 m_hAccelTable
从 CChristianLifeMinistryEditorDlg
传递到 CAssignHistoryDlg
并将其添加到 CAssignHistoryDlg::PreTranslateMessage
的开头:
if (m_hAccelTable)
{
if (::TranslateAccelerator(GetParent()->GetSafeHwnd(), m_hAccelTable, pMsg))
return TRUE;
}
我的主 CDialog
有时会显示一个子无模式对话框,如下所示:
只有在用户配置为自动显示时才会显示。
它通过调用此函数的主对话框 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);
}
}
}
我注意到我的一些主要 windows 加速器热键并不总是有效。然后我意识到这是因为弹出 window 有焦点。如果我单击主对话框上的任意位置以使其获得焦点,那么我的加速器热键就会起作用。
有什么方法可以让主编辑器轻松处理它的热键,即使无模式 window 可能有焦点?满足此要求的标准方法?
主要 window 像这样处理加速器:
BOOL CChristianLifeMinistryEditorDlg::PreTranslateMessage(MSG * pMsg)
{
if (m_hAccelTable)
{
if (::TranslateAccelerator(GetSafeHwnd(), m_hAccelTable, pMsg))
return TRUE;
}
}
并且弹出式无模式 window 也使用了 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 ;
}
我会将你的 m_hAccelTable
从 CChristianLifeMinistryEditorDlg
传递到 CAssignHistoryDlg
并将其添加到 CAssignHistoryDlg::PreTranslateMessage
的开头:
if (m_hAccelTable)
{
if (::TranslateAccelerator(GetParent()->GetSafeHwnd(), m_hAccelTable, pMsg))
return TRUE;
}