Pregunta

Tengo una clase CListCtrl y en el momento cuando un usuario selecciona uno de los sub elementos estoy mostrando una CComboBox sobre el subtema los que el usuario puede hacer una selección de.

Sin embargo, tengo un problema. Cuando el usuario ha hecho una selección necesito el cuadro combinado a desaparecer (es decir CBN_SELCHANGE de intercepción). El problema es que necesito para hacer el CComboBox un niño de la CListCtrl (De lo contrario tengo problemas extraños con la lista de dibujos sobre el cuadro combinado, incluso si fijo el cuadro combinado a ser más alta). Así que el mensaje es enviado CBN_SELCHANGE a la vista de lista, que, como es comprensible, lo ignora. ¿Cómo puedo obtener la vista de lista para pasar ese mensaje hasta la ventana padre.

¿Es realmente necesario para obtener mi propia clase CListCtrl que simplemente intercepta el mensaje CBN_SELCHANGE y lo pasa a la ventana padre? ¿Hay una mejor manera de hacerlo que creando un gestor de OnWndMsg?

Gracias por cualquier ayuda!

Edit: Este código funciona

class CPassThroughListCtrl : public CListCtrl
{
protected:
    virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
        if ( message == WM_COMMAND )
        {
            GetParent()->SendMessage( message, wParam, lParam );
        }
        return CListCtrl::OnWndMsg( message, wParam, lParam, pResult );
    }
public:
    CPassThroughListCtrl()
    {
    };
};

Pero lo que realmente me gustaría saber si hay una manera más agradable de hacer esto.

¿Fue útil?

Solución

Puede subclase CComboBox tal que se encargará de mensaje CBN_CLOSEUP. Su Combo encargo sabrá sobre el gerente es decir, el objeto que se creó en el primer lugar y tendrá que destruirla a primer plano (ventana de nivel superior o lo que sea, debe ser proporcionado como argumento para su constructor cuadro combinado personalizado) ... Así que cuando se crea un cuadro combinado en la parte superior del elemento de la lista que va a crear instancia de este cuadro combinado personalizado en lugar del predeterminado MFC uno. controlador de eventos cuadro combinado podría parecerse a lo siguiente:

BEGIN_MESSAGE_MAP(CNotifyingComboBox, CComboBox)
 ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseUp)
END_MESSAGE_MAP()

void CNotifyingComboBox::OnCloseUp()
{
    // _manager is pointer to the object that created this combobox, 
    // and is responsible for its destruction, 
    // should be passed into CNotifyingComboBox cosntructor
    if( NULL != _manager )
    {
        _manager->OnCloseUpComboBox(this);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top