Параметр 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
и т.п.