7

这是最基本的。

我想捕捉用户从CComboBox(实际上是 的子类CComboBox)中选择项目的时间。

尝试了很多 , 的OnCblSelChange组合OnCommand。猜猜我还没有击中正确的组合(没有双关语)。

操作系统是 Vista,但我强制使用 XP 样式的对话框(这不重要,应该吗?)

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

我在这里束手无策。任何帮助将不胜感激。

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

4

2 回答 2

9

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

它似乎工作得很好。

于 2009-11-04T00:43:35.970 回答
1

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 ...
}
于 2009-03-30T20:43:16.537 回答