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

问题描述 投票:0回答:3

这是最基本的。

我想捕获用户何时从

CComboBox
(实际上是
CComboBox
的子类)中选择一个项目。

尝试了很多

OnCblSelChange
OnCommand
的组合。我想我还没有打出正确的组合(没有双关语的意思)。

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

我能够捕获从

CEdit
CFileDialog
派生的类的事件。

我已经无计可施了。任何帮助将不胜感激。

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

mfc ccombobox
3个回答
10
投票

不幸的是,似乎所有用于组合框更改的消息(甚至

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

看起来效果很好。


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 ... }



0
投票

© www.soinside.com 2019 - 2024. All rights reserved.