2009-03-30 8 views
6

Esto es lo más básico posible.Captura cuando el usuario selecciona un elemento de un CComboBox

Quiero capturar cuando el usuario selecciona un elemento de un CComboBox (en realidad, una subclase de CComboBox).

Se han probado muchas combinaciones de OnCblSelChange, OnCommand. Supongo que todavía no he tocado el combo correcto (sin juego de palabras).

OS es Vista, pero estoy forzando un cuadro de diálogo de estilo XP (Eso no debería importar, en caso de que?)

soy capaz de atrapar eventos para clases derivadas de CEdit y CFileDialog.

Estoy en mi ingenio final aquí. Cualquier asistencia sería tan apreciada.

Cualquier código fuente sería, por supuesto, más que nunca, tan apreciado.

+0

Agregué el código a mi respuesta a continuación. ¡Espero eso ayude! – mwigdahl

Respuesta

1

CBN_SELENDOK debería ser el mensaje que está buscando. Se envía después de que se finaliza la selección del usuario, pero antes de que se cierre el cuadro combinado (si es así). CBN_SELCHANGE se envía antes de la selección se guarda realmente en el control de cuadro combinado.

This MSDN link tiene más información (lo más probable es que ya lo ha visto ...)

Aquí está el código que te prometí. Una cosa que noté al recopilar esto es que es posible tener este mensaje suprimido si está utilizando un controlador ON_CONTROL_REFLECT dentro de la clase derivada de CComboBox. Esto haría que el control maneje el mensaje y no lo pase al padre. Puede solucionar ese problema utilizando ON_CONTROL_REFLECT_EX con el código de retorno adecuado, que hará que tanto el cuadro como el padre reciban el mensaje.

De todos modos, aquí está el fragmento de código:

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

Gracias. Intenté CBN_SELENDOK pero todavía no tuve suerte. Claro que me estoy perdiendo algo fundamental. ¿Alguien tiene una muestra de código? –

+0

Trataré de asustar a uno y publicarlo mañana cuando entre al trabajo. – mwigdahl

+0

Gracias por su muestra. No sabía acerca de las cosas de DoDataExchange. Lo intenté y todavía no puedo ver el evento desplegable/seleccionado (s?) Pero el DoDataExchange me dará avenidas adicionales para explorar. Tiene que ser algo tonto, simple, lo estoy pasando por alto. –

6

Por desgracia, parece que todos los mensajes (incluso SELEND_OK) para cuadro combinado cambiantes son enviados antes el texto ha cambiado realmente, por lo DoDataExchange le dará la texto anterior en el CComboBox. He utilizado el siguiente método, 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(); 
} 

Parece que funciona bastante bien.

Cuestiones relacionadas