2013-11-28 30 views
0

我們可以用BEGIN_MSG_MAP參數作爲其他類嗎? 在下面的示例中,CMyEmbeddedWnd中的BEGIN_MSG_MAP可以具有 CMainWindow作爲參數嗎?我已經讀過BEGIN_MSG_MAP參數 應該是它寫入的類名稱。因此,類似下面的內容以及如果我們編寫如下代碼會發生什麼?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

目前尚不清楚您要求的內容。你的最終目標是什麼?你試圖解決什麼架構問題? – IInspectable

+1

BEGIN_MSG_MAP只是一個宏,您可以使用轉到定義(F12)來獲取源代碼。你會看到它實際上做了什麼,你可以重新定義一個適合你的需求的類似的。 –

回答

0

即使你沒有解釋最終目標,答案是「不」。該參數應該允許內部向您的班級上傳,不適合在班級之間轉發。在這個特定的宏的情況下,參數被忽略。要在類之間傳遞消息處理,可以使用其他宏:ALT_MSG_MAP,CHAIN_MSG_MAP,CHAIN_MSG_MAP_MEMBER等。