我们可以让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;
}
答案 0 :(得分:0)
即使你没有解释最终目标,答案仍然是“不”。该参数应该允许对您的类进行内部向上转换,并且不适合在类之间转发。在该特定宏的情况下,该参数完全被忽略。要在类之间传递消息处理,您可以使用其他宏:ALT_MSG_MAP
,CHAIN_MSG_MAP
,CHAIN_MSG_MAP_MEMBER
等。