在CComboBox

时间:2017-10-18 19:31:59

标签: 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没有被截获。

Visual Example

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

Select Text

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

Results for CEdit

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

Use hot key on CComboBox

在这种情况下,它无法正常工作。

我认为这是因为从技术上讲我是在嵌入式"编辑"控制组合。现在我在组合中使用选定的文本时,如何检测热键?

2 个答案:

答案 0 :(得分:2)

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

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);
}

答案 1 :(得分:0)

我最终创建了一个新的类CEncodedCombBox,派生自CComboBox,如下所示:

// EncodedComboBox.cpp : implementation file
//

#include "stdafx.h"
#include "Meeting Schedule Assistant.h"
#include "EncodedComboBox.h"


// CEncodedComboBox

IMPLEMENT_DYNAMIC(CEncodedComboBox, CComboBox)

CEncodedComboBox::CEncodedComboBox()
{

}

CEncodedComboBox::~CEncodedComboBox()
{
}


BEGIN_MESSAGE_MAP(CEncodedComboBox, CComboBox)
END_MESSAGE_MAP()



// CEncodedComboBox message handlers


BOOL CEncodedComboBox::PreTranslateMessage(MSG* pMsg)
{
    BOOL    bNoDispatch, bDealtWith;
    DWORD   dwSel = GetEditSel();
    CString strCode = _T(""), strText;

    GetWindowText(strText);

    bDealtWith = FALSE;

    if (IsCTRLpressed() &&
        pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('I')))
    {
        strCode = _T("i");

        bNoDispatch = TRUE;
        bDealtWith = TRUE;
    }
    else if (IsCTRLpressed() &&
        pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('B')))
    {
        strCode = _T("b");

        bNoDispatch = TRUE;
        bDealtWith = TRUE;
    }

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

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

    return bNoDispatch;
}

正如您所看到的,它包含PreTranslateMessage并且有效:

Hot keys now work

如果有更好的方法,那么我欢迎你的评论或回答。

更新

我必须针对编辑控件句柄进行测试,而不是针对我自己的CDialog的组合框句柄进行测试:

if (::GetParent(hWnd) == m_cbMaterialAssignment1.GetSafeHwnd())

不再需要派生的组合类。