2009-03-30 11 views
6

Dies ist so einfach wie es geht.Abfangen, wenn Benutzer ein Element aus einer CComboBox auswählt

Ich möchte fangen, wenn der Benutzer ein Element aus einer CComboBox (eigentlich eine Unterklasse von CComboBox) auswählt.

Versucht viele Kombinationen von OnCblSelChange, OnCommand. Ich denke, ich habe noch nicht die richtige Kombination getroffen (kein Wortspiel beabsichtigt).

OS ist Vista, aber ich bin zwingt einen XP-Stil-Dialog (Das sollte keine Rolle spielen, sollte es?)

Ich bin in der Lage Veranstaltungen für Klassen von CEdit und CFileDialog abgeleitet zu fangen.

Ich bin bei meinem Verstand hier zu Ende. Jede Hilfe würde immer geschätzt werden.

Jeder Quellcode wäre natürlich mehr als je zuvor - so geschätzt.

+0

Code zu meiner Antwort unten hinzugefügt. Ich hoffe es hilft! – mwigdahl

Antwort

1

CBN_SELENDOK sollte die Nachricht sein, die Sie suchen. Es wird gesendet, nachdem die Benutzerauswahl abgeschlossen ist, aber bevor das Kombinationsfeld geschlossen wird (falls dies der Fall ist). CBN_SELCHANGE wird gesendet vor die Auswahl wird tatsächlich in das Kombinationsfeld Steuerelement gespeichert.

This MSDN link hat mehr Informationen (Sie haben es wahrscheinlich schon gesehen ...)

Hier ist der Code, den ich Ihnen versprochen. Eine Sache, die ich beim Zusammentragen bemerkt habe, ist, dass es möglich ist, diese Nachricht zu unterdrücken, wenn Sie einen ON_CONTROL_REFLECT Handler innerhalb der von CComboBox abgeleiteten Klasse verwenden. Dies würde dazu führen, dass das Steuerelement selbst die Nachricht verarbeitet und sie nicht an das übergeordnete Element weitergibt. Sie können dieses Problem umgehen, indem Sie ON_CONTROL_REFLECT_EX mit dem richtigen Rückgabecode verwenden, wodurch sowohl die Box selbst als auch die übergeordnete Nachricht die Nachricht erhalten.

Wie auch immer, hier ist der Code-Schnipsel:

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

Danke. CBN_SELENDOK versucht, aber immer noch kein Glück. Sicherlich vermisse ich etwas Grundlegendes. Jemand da draußen hat ein Codebeispiel? –

+0

Ich werde versuchen, einen zu erschrecken und es morgen zu posten, wenn ich mich an die Arbeit mache. – mwigdahl

+0

Danke für Ihre Probe. Ich wusste nichts über DoDataExchange. Ich habe es ausprobiert und kann immer noch nicht das Dropdown-Ereignis ändern/auswählen (s?), Aber der DoDataExchange wird mir zusätzliche Möglichkeiten zum Erkunden geben. Es muss etwas Dummes sein - einfach, ich übersehe es. –

6

Leider scheint es, dass alle Nachrichten (auch SELEND_OK) für Kombinationsfeld werden vor wurde der Text tatsächlich geändert gesendet Ändern, so DoDataExchange Sie geben die vorheriger Text in der CComboBox. Ich habe die folgende Methode verwendet, as suggested by 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(); 
} 

Es scheint ganz gut zu funktionieren.

Verwandte Themen