MFC를 사용하여 자녀의 자녀로부터 메시지 가로채기
문제
CListCtrl 클래스가 있고 사용자가 하위 항목 중 하나를 선택하는 순간 사용자가 선택할 수 있는 하위 항목 위에 CComboBox를 표시합니다.
그러나 문제가 있습니다.사용자가 선택을 하면 콤보 상자가 사라지도록 해야 합니다(예: CBN_SELCHANGE 차단).문제는 CComboBox를 CListCtrl의 자식으로 만들어야 한다는 것입니다. 그렇지 않으면 콤보 상자를 최상위로 설정하더라도 콤보 상자 위에 목록을 그리는 데 이상한 문제가 발생합니다.따라서 CBN_SELCHANGE 메시지는 당연히 이를 무시하는 목록 보기로 전송됩니다.해당 메시지를 상위 창으로 전달하기 위해 목록 보기를 어떻게 얻을 수 있습니까?
단순히 CBN_SELCHANGE 메시지를 가로채서 상위 창에 전달하는 자체 CListCtrl 클래스를 파생시켜야 합니까?OnWndMsg 처리기를 만드는 것보다 더 좋은 방법이 있습니까?
어떤 도움을 주셔서 감사합니다!
편집하다:이 코드는 작동합니다
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()
{
};
};
하지만 이보다 더 좋은 방법이 있는지 알고 싶습니다.
해결책
CBN_CLOSEUP 메시지를 처리하도록 CComboBox를 서브클래싱할 수 있습니다.사용자 정의 콤보는 관리자에 대해 알게 됩니다.처음에 그것을 생성하고 닫을 때 그것을 파괴해야 하는 객체(최상위 창 등은 사용자 정의 콤보 상자 생성자에 인수로 제공되어야 함)...따라서 목록 항목 상단에 콤보박스를 생성하면 MFC 기본 콤보박스 대신 이 사용자 정의 콤보박스의 인스턴스가 생성됩니다.콤보박스 이벤트 핸들러는 다음과 같습니다:
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);
}
}