mfc - 检测 CComboBox 编辑控件内的键盘热键

标签 mfc ccombobox

我有这个代码:

BOOL CChristianLifeMinistryStudentMaterialDlg::PreTranslateMessage(MSG* pMsg)
{
    BOOL    bNoDispatch, bDealtWith;

    bDealtWith = FALSE;

    if (IsCTRLpressed() &&
        pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('I')))
    {
        if (EncodeText(pMsg->hwnd, _T("i")))
        {
            // Eat it.
            bNoDispatch = TRUE;
            bDealtWith = TRUE;
        }
    }
    else if (IsCTRLpressed() &&
        pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('B')))
    {
        if (EncodeText(pMsg->hwnd, _T("b")))
        {
            // Eat it.
            bNoDispatch = TRUE;
            bDealtWith = TRUE;
        }
    }

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

    return bNoDispatch;
}

最初,我的对话框上有 3 个 CEdit 控件。当您使用此键时,它会对编辑控件中的选择执行如上所述的操作。

我将控件从 CEdit 更改为 CComboBox。它们是可编辑类型。我调整了 EncodeText 以使用 GetEditSelSetEditSel

现在唯一的问题是当我在组合框中编辑文本时。我选择了一些文本并按 CTRL + I,但没有任何反应。我的对话框的 PTM 没有被拦截。

视觉示例

在此 CEdit 控件中,我可以选择文本:

Select Text

然后我使用其中一个热键,例如:CTRL + B,它仍然有效:

Results for CEdit

但是,当我在可编辑的 CComboBox 中选择一些文本并使用相同的热键时:

Use hot key on CComboBox

在这种情况下它不起作用。

我认为这是因为从技术上讲我位于组合的嵌入式“编辑”控件内。现在我在组合中使用选定的文本,如何仍然检测热键?

最佳答案

不确定我喜欢WM_KEYDOWN hack。如果你有真正的热键,我建议你正确处理它们:

BEGIN_MESSAGE_MAP(CEncodedCombBox, CCombBox)
    ON_WM_HOTKEY()
END_MESSAGE_MAP()

void CEncodedCombBox::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
    if (nHotKeyId == idForHotKey_I)
        HandleCode(_T("i"));
    else if (nHotKeyId == idForHotKey_B)
        HandleCode(_T("b"));
}

void CEncodedCombBox::HandleCode(CString strCode)
{
    DWORD dwSel = GetEditSel();

    CMeetingScheduleAssistantApp::EncodeText(strText, strCode, LOWORD(dwSel), HIWORD(dwSel));
    SetWindowText(strText);
    SetEditSel(LOWORD(dwSel), HIWORD(dwSel) + 7);
}

关于mfc - 检测 CComboBox 编辑控件内的键盘热键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46817844/

相关文章:

c++ - 使用 MFC 拦截来自 child 的 child 的消息

c++ - diceroll 的位图

c++ - 如何使用 ATL::CImage 旋转并同时使图像半透明?

c++ - 有什么方法可以将 CString 以外的对象添加到 MFC 中的 CComboBox 中吗?

winapi - C++ MFC 从小部件 ID 添加组合框字符串项

c++ - 如何在CCombobox中添加背景文字

c++ - MFC中如何将BYTE数组转换为CString?

c++ - 在分层窗口的子对话框中未单击 CMFCButton

c++ - 使用水平滚动条手动设置 MFC CComboBox 下拉高度

c++ - MFC/C++ 组合框 : disable drawing of Dropdown closing & opening (UI freeze)