MFC非模态对话框无焦点对话框使用PreTranslateMessage做加速键

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

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com