Pergunta

Eu tenho uma classe clistctrl e, no momento em que um usuário seleciona um dos sub -itens, estou exibindo um combobox sobre o subitem do qual o usuário pode fazer uma seleção.

No entanto, eu tenho um problema. Quando o usuário fizer uma seleção, preciso que a caixa combinada desapareça (ou seja, intercepto cbn_selchange). O problema é que preciso fazer do Combobox um filho do Clistctrl (caso contrário, recebo problemas estranhos com a lista de desenho sobre a caixa de combinação, mesmo que eu defina a caixa combinada como o topo). Portanto, a mensagem CBN_SELCHANGE é enviada para a visualização da lista que, compreensivelmente, a ignora. Como posso obter a visualização da lista para passar essa mensagem para a janela dos pais.

Eu realmente preciso derivar minha própria classe Clistctrl que simplesmente intercepta a mensagem CBN_SELCHANGE e a passa para a janela dos pais? Existe uma maneira melhor de fazer isso do que criar um manipulador de OnWndmsg?

Obrigado por qualquer ajuda!

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

Mas eu realmente gostaria de saber se há uma maneira mais agradável de fazer isso.

Foi útil?

Solução

Você pode subclasse combobox, de modo que ele lide com a mensagem CBN_CLOSOSEUP. Sua combinação personalizada saberá sobre o gerente, ou seja, o objeto que o criou em primeiro lugar e terá que destruí -lo após o close (janela de nível superior ou o que for, deve ser fornecido como um argumento para o seu construtor personalizado) ... então Ao criar o ComboBox em uma parte superior do item da lista, você criará a instância deste ComboBox personalizado em vez do MFC padrão. O manipulador de eventos da Combobox poderia ficar assim:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top