MFC非模态对话框无焦点对话框使用PreTranslateMessage。无焦点对话框是不是无法使用PreTranslateMessage翻译?我反正没找到方法。
这是其中一个方法,思路:
1、在App里重载 PreTranslateMessage
2、在Dlg里记录所有的子窗体 dialog hwnd,做成全局函数 dispatchmymessage(),里面使用sendmessage把App的数据发到每个窗口
3、在app的 PreTranslateMessage 调用 dispatchmymessage()
4、在对应的窗口中接收该消息,调用 TranslateAccelerator 即可响应加速键。
代码来了:
BOOL CxxApp::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN) {
if (m_hAccel) {
TranslateMessageToDialogs(pMsg, m_hAccel);
}
}
return CWinApp::PreTranslateMessage(pMsg);
}// app 统一把keydown消息发过来
BOOL TranslateMessageToDialogs(MSG *pMsg, HACCEL lparam)
{
for (UINT i = 0; i < G_ChildDlgIdx; i++)
::SendMessage(G_AllChildDialogWnd[i]->GetSafeHwnd(), WM_MSG_PRE_KEY_DOWN, (WPARAM)pMsg ,(LPARAM)lparam);
return TRUE;
}afx_msg LRESULT CxxDlg1::On_WM_MSG_PRE_KEY_DOWN(WPARAM wParam, LPARAM lParam)
{
MSG *pMsg = (MSG*)wParam;
HACCEL hAccel = (HACCEL)lParam;
if (hAccel) {
if (::TranslateAccelerator(m_hWnd, hAccel, pMsg)) {
return(TRUE);
}
}
return TRUE;
}afx_msg LRESULT CxxDlg2::On_WM_MSG_PRE_KEY_DOWN(WPARAM wParam, LPARAM lParam)
{
MSG *pMsg = (MSG*)wParam;
HACCEL hAccel = (HACCEL)lParam;
if (hAccel) {
if (::TranslateAccelerator(m_hWnd, hAccel, pMsg)) {
return(TRUE);
}
}
return TRUE;
}这样无论窗口是隐藏还是显示,都可以响应自己的热键/加速键了。
注意,热键和加速键是不一样的,热键是全局有效,会把QQ等的冲突掉,加速键只对当前程序有效。