用户从CComboBox中选择项目时捕获

7 mfc ccombobox

这是基本的.

当用户从CComboBox(实际上是子类CComboBox)中选择一个项时,我想要捕获.

试过很多组合OnCblSelChange,OnCommand.猜猜我还没有打到正确的组合(没有双关语意).

操作系统是Vista,但我正在强制进行XP风格的对话(这应该不重要,不是吗?)

我能够捕获从CEdit和派生的类的事件CFileDialog.

我在这里结束了我的智慧.任何援助都将永远受到赞赏.

当然,任何源代码都会比以往更受欢迎.

Sma*_*ery 7

不幸的是,似乎所有SELEND_OK用于组合框更改的消息(偶数)都是文本实际更改之前发送的,因此DoDataExchange将为您提供之前的文本CComboBox.我按照MSDN的建议使用了以下方法:

void MyDialog::DoDataExchange(CDataExchange* pDX)
{
    DDX_Text(pDX, IDC_COMBO_LOCATION, m_sLocation);
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_CBN_SELENDOK(IDC_COMBO1, &MyDialog::OnComboChanged)
    ON_CBN_EDITUPDATE(IDC_COMBO1, &MyDialog::OnComboEdited) // This one updates immediately
END_MESSAGE_MAP()

...

void MyDialog::OnComboChanged()
{
    m_myCombo.GetLBText(m_myCombo.GetCurSel(), m_sSomeString);
}

void MyDialog::OnComboEdited()
{
    UpdateData();
}
Run Code Online (Sandbox Code Playgroud)

它看起来工作得很好.


mwi*_*ahl 3

CBN_SELENDOK应该是您正在寻找的消息。它在用户选择完成之后、组合框关闭之前发送(如果关闭的话)。 在将选择实际保存到组合框控件之前CBN_SELCHANGE发送。

此 MSDN 链接包含更多信息(您可能已经看到过......)

这是我向你承诺的代码。ON_CONTROL_REFLECT在收集这些内容时我注意到的一件事是,如果您在从 派生的类中使用处理程序,则可以抑制此消息CComboBox。这将导致控件本身处理消息而不是将其传递给父级。您可以通过使用正确的返回代码来解决该问题ON_CONTROL_REFLECT_EX,这将使框本身和父框都收到消息。

无论如何,这是代码片段:

class SPC_DOCK_CLASS ProcessingExceptionDockDlg : public CSPCDockDialog
{
    SPC_DOCK_DECLARE_SERIAL(ProcessingExceptionDockDlg);

public:
    // ... redacted ...

    //{{AFX_DATA(ProcessingExceptionDockDlg)
    CComboBox                   m_comboFilter;
    //}}AFX_DATA

    //{{AFX_VIRTUAL(ProcessingExceptionDockDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    //}}AFX_VIRTUAL

protected:

    //{{AFX_MSG(ProcessingExceptionDockDlg)
    afx_msg void OnSelendokComboTreeFilter();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

/****************/

// ProcessingExceptionDockDlg.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"
#include "ProcessingExceptionDockDlg.h"

// ... much code redacted ...

void ProcessingExceptionDockDlg::DoDataExchange(CDataExchange* pDX)
{
    CSPCDockDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(ProcessingExceptionDockDlg)
    DDX_Control(pDX, IDC_COMBO_TREE_FILTER, m_comboFilter);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(ProcessingExceptionDockDlg, CSPCDockDialog)
    //{{AFX_MSG_MAP(ProcessingExceptionDockDlg)
    ON_CBN_SELENDOK(IDC_COMBO_TREE_FILTER, OnSelendokComboTreeFilter)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void ProcessingExceptionDockDlg::OnSelendokComboTreeFilter() 
{
    // ... code redacted ...
}
Run Code Online (Sandbox Code Playgroud)