2009-03-30 8 views
6

से किसी आइटम का चयन करता है तो यह पकड़ना उतना ही बुनियादी है जितना इसे प्राप्त होता है।जब उपयोगकर्ता CComboBox

जब मैं उपयोगकर्ता को CComboBox (वास्तव में, CComboBox का उप-वर्ग) से कोई आइटम चुनता है तो मैं पकड़ना चाहता हूं।

OnCblSelChange, OnCommand के कई संयोजनों का प्रयास किया। मान लीजिए मैंने अभी तक सही कॉम्बो नहीं मारा है (कोई इरादा नहीं है)।

ओएस विस्टा है, लेकिन मैं (यह है कि कोई फर्क नहीं करना चाहिए, चाहिए?) एक XP शैली संवाद के लिए मजबूर कर रहा हूँ

मैं CEdit और CFileDialog से प्राप्त वर्गों के लिए घटनाओं को पकड़ने के लिए सक्षम हूँ।

मैं यहां अपने विट्स पर हूं। किसी भी सहायता की हमेशा सराहना की जाएगी।

किसी भी स्रोत कोड, निश्चित रूप से, कभी भी सराहना की तुलना में अधिक होगा।

+0

नीचे दिए गए मेरे उत्तर में कोड जोड़ा गया। आशा करता हूँ की ये काम करेगा! – mwigdahl

उत्तर

1

CBN_SELENDOK वह संदेश होना चाहिए जिसे आप ढूंढ रहे हैं। यह उपयोगकर्ता चयन को अंतिम रूप देने के बाद भेजा जाता है लेकिन कॉम्बो बॉक्स बंद होने से पहले (यदि ऐसा होता है)। CBN_SELCHANGE से पहले भेजा गया है, चयन वास्तव में कॉम्बो बॉक्स नियंत्रण में सहेजा गया है।

This MSDN link अधिक जानकारी (आप की संभावना पहले से ही देखा है ...)

यहाँ कोड मैं तुम्हें देने का वादा किया है। इस बात को इकट्ठा करते समय मैंने देखा कि एक बात यह है कि यदि आप CComboBox से प्राप्त कक्षा के भीतर ON_CONTROL_REFLECT हैंडलर का उपयोग कर रहे हैं तो यह संदेश दबाया जा सकता है। यह नियंत्रण को संदेश को संभालने का कारण बनता है और इसे माता-पिता को पास नहीं करता है। आप उचित रिटर्न कोड के साथ 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

धन्यवाद। CBN_SELENDOK का प्रयास किया लेकिन अभी भी कोई भाग्य नहीं है। निश्चित रूप से मैं कुछ मौलिक याद कर रहा हूँ। कोई भी कोड नमूना है? –

+0

मैं एक बार डरने की कोशिश करूंगा और कल जब मैं काम में जाऊंगा तो इसे पोस्ट करूंगा। आपके नमूने के लिए – mwigdahl

+0

Thanx। मुझे DoDataExchange सामान के बारे में पता नहीं था। मैंने कोशिश की और अभी भी ड्रॉपडाउन बदल गया/चयनित घटना (एस?) नहीं पकड़ सकता है लेकिन DoDataExchange मुझे अन्वेषण के लिए अतिरिक्त मार्ग देगा। यह कुछ गूंगा-सरल होना चाहिए जो मैं देख रहा हूं। –

6

दुर्भाग्य से, ऐसा लगता है कि कॉम्बो बॉक्स के लिए सभी संदेशों (यहां तक ​​कि SELEND_OK) बदलने से पहले पाठ वास्तव में बदल गया है भेजे जाते हैं ताकि DoDataExchange आप दे देंगे CComboBox में पिछले पाठ।

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

यह काफी अच्छी तरह से काम करने के लिए लगता है: मैं निम्न विधि, as suggested by MSDN इस्तेमाल किया है।

संबंधित मुद्दे