这是最基本的。
我想捕获用户何时从
CComboBox
(实际上是 CComboBox
的子类)中选择一个项目。
尝试了很多
OnCblSelChange
、OnCommand
的组合。我想我还没有打出正确的组合(没有双关语的意思)。
操作系统是 Vista,但我强制使用 XP 风格的对话框(这应该不重要,不是吗?)
我能够捕获从
CEdit
和 CFileDialog
派生的类的事件。
我已经无计可施了。任何帮助将不胜感激。
当然,任何源代码都会比以往任何时候都更受赞赏。
不幸的是,似乎所有用于组合框更改的消息(甚至
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();
}
看起来效果很好。
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 ...
}