BEGIN_MSG_MAP参数

时间:2013-11-28 18:35:26

标签: c++ winapi com atl

我们可以让BEGIN_MSG_MAP将参数作为其他类吗? 就像下面的例子一样,CMyEmbeddedWnd中的BEGIN_MSG_MAP可以有 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 个答案:

答案 0 :(得分:0)

即使你没有解释最终目标,答案仍然是“不”。该参数应该允许对您的类进行内部向上转换,并且不适合在类之间转发。在该特定宏的情况下,该参数完全被忽略。要在类之间传递消息处理,您可以使用其他宏:ALT_MSG_MAPCHAIN_MSG_MAPCHAIN_MSG_MAP_MEMBER等。