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等的冲突掉,加速键只对当前程序有效。