Interceptar mensagens de um filho de uma criança com MFC
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.
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);
}
}