문제

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);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top