Параметр BEGIN_MSG_MAP

Можем ли мы иметь BEGIN_MSG_MAP принимает параметр как некоторый другой класс? Как в примере ниже, BEGIN_MSG_MAP в CMyEmbeddedWnd может иметь CMainWindow в качестве параметра? Я читал, что параметр BEGIN_MSG_MAP должен быть именем класса, в котором он написан. Так что-то вроде ниже возможно, и что может произойти, если мы напишем код, как показано ниже?

class ATL_NO_VTABLE CBaseEmbeddedWnd: public CComControl<CBaseEmbeddedWnd>,
    public CComObjectRootEx<CComSingleThreadModel>
{
};

class CMyEmbeddedWnd: public CBaseEmbeddedWnd
{
public:
    CMyEmbeddedWnd();
    virtual ~CMyEmbeddedWnd();

    // window message map    
    BEGIN_MSG_MAP(CMainWindow)
        MESSAGE_HANDLER(WM_MESSAGE, OnMessage)
        CHAIN_MSG_MAP(CBaseEmbeddedWnd)
    END_MSG_MAP()

    // public functions
    HRESULT Init(CMainWindow* pWndParent);

    // message handlers
    LRESULT OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

protected:
    CMainWindow* m_pWndParent;
};

class CMainWindow: public CWindowImpl<CMainWindow>
{
public:
    // constructor and destructor
    CMainWindow();
    ~CMainWindow(){}

    // window message map    
    BEGIN_MSG_MAP(CMainWindow)
        MESSAGE_HANDLER(WM_CREATE, OnCreate)
        MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    END_MSG_MAP()
    ...

private:
    CComObject<CMyEmbeddedWnd>* m_pwndEmbedded;
}

1 ответ

Решение

Даже если вы не объясняете конечную цель, ответ - "Нет". Предполагается, что этот параметр разрешает внутреннюю передачу в ваш класс и не подходит для пересылки между классами. В случае этого конкретного макроса параметр игнорируется вообще. Чтобы передать обработку сообщений между классами, вы должны использовать другие макросы: ALT_MSG_MAP, CHAIN_MSG_MAP, CHAIN_MSG_MAP_MEMBER и т.п.

Другие вопросы по тегам