2009-11-10 6 views
1

나는 CListCtrl 클래스를 가지고 있으며 사용자가 하위 항목 중 하나를 선택하는 순간 사용자가 선택할 수있는 하위 항목 위에 CComboBox를 표시하고 있습니다.MFC가있는 자식의 메시지를 가로 채기

그러나 문제가 있습니다. 사용자가 선택을하면 콤보 상자가 없어야합니다 (예 : 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() 
    { 
    }; 
}; 

작동하지만 난 정말이 할 수있는 더 좋은 방법이 있는지 알고 싶습니다.

답변

1

CComboBox를 하위 클래스로 분류하여 CBN_CLOSEUP 메시지를 처리 ​​할 수 ​​있습니다. 사용자 지정 콤보는 관리자 즉, 처음에 만든 콤보 (즉, 최상위 창 또는 사용자 지정 콤보 상자 생성자에 대한 인수로 제공되어야하는 모든 항목)에 따라이를 파기해야하는 관리자 즉 개체에 대해 알 수 있습니다. 그래서 목록 항목의 맨 위에 콤보 상자를 만들면 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); 
    } 
} 
+0

그것의 나쁜 제안은 아직도 특정 상황을 외부에 거의 사용을 가진 사용자 정의 클래스를 만드는 끝날 동안. 또한 SubclassWindow 함수를 사용한다는 의미는 아닙니다. 메시지를 가로 챌 수 있다면 윈도우의 진정한 하위 분류를 사용하는지 궁금하게 생각합니다. 부끄러운 줄 알았어 창문을 가지고있어. ( – Goz

+0

서브 클래 싱하지 않음 :-) : 클래스 CNotifyingComboBox : public CComboBox – BostonLogan

+0

아아아 나는 여전히 제곱으로 돌아 간다. 이러한 특정 상황에서만 사용됩니다. 그건 당신의 콤보 상자는 내가 도면을 재정의하고 목록보기 하위 항목에 맞게 이점을 가지고있다 : – Goz