2014-02-25 15 views
3

如何將CHAIN_MSG_MAP_MEMBER用於兩個成員?
下面的例子工作正常,只有一個列表視圖和一個單獨的CHAIN_MSG_MAP_MEMBER. 兩個我都有一個崩潰。WTL如何在同一窗口中使用2自定義繪製CListViewCtr

class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>, 
     public CMessageFilter, public CIdleHandler 
{ 
public: 
    DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME) 

    virtual BOOL PreTranslateMessage(MSG* pMsg) 
    { 
     return CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg); 
    } 

    BEGIN_MSG_MAP(CMainFrame) 
     MESSAGE_HANDLER(WM_CREATE, OnCreate) 
     COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit) 
     COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew) 
     COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout) 
     CHAIN_MSG_MAP(CUpdateUI<CMainFrame>) 
     CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>) 
     CHAIN_MSG_MAP_MEMBER(m_listView)   //< 
     CHAIN_MSG_MAP_MEMBER(m_listView2)   //< ISSUE: crash with both, works with one. 
    END_MSG_MAP() 

    LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) 
    { 
     // create a list box 
     RECT r = {0,0,182,80};  
     m_listView.Create(m_hWnd,r,CListViewCtrl::GetWndClassName(),WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_REPORT, WS_EX_CLIENTEDGE ); 

     RECT r2 = {0,80,182,80+80};  
     m_listView2.Create(m_hWnd,r2,CListViewCtrl::GetWndClassName(),WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_REPORT, WS_EX_CLIENTEDGE ); 

     ... 

     populate 

    } 
} 

class MyListView : public CWindowImpl<MyListView, CListViewCtrl>, 
        public CCustomDraw<MyListView>     
{ 
public: 

    BEGIN_MSG_MAP(MyListView)  
    CHAIN_MSG_MAP(CCustomDraw<MyListView>) 
    END_MSG_MAP()   

    DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) 
    {  
     ... 
    } 

    DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) 
    { 
     ... 
    } 

    DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) 
    { 
     ... 
    } 
    ............ 
} 

回答

4

CCustomDraw是WTL類,並假定您使用BEGIN_MSG_MAP_EX,而不是ATL的BEGIN_MSG_MAP

#include <atlcrack.h> 

class MyListView : public CWindowImpl<MyListView, CListViewCtrl>, 
        public CCustomDraw<MyListView>     
{ 
public: 

BEGIN_MSG_MAP_EX(MyListView) // <<--- Here we go 
    CHAIN_MSG_MAP(CCustomDraw<MyListView>) 
END_MSG_MAP()   

}; 

經驗法則就是絕不使用BEGIN_MSG_MAP可言,只要你利用WTL。

另外值得一提的是,這種使用CHAIN_MSG_MAP_MEMBER對我來說毫無意義。

+0

你在哪裏,CHAIN_MSG_MAP_MEMBER是錯誤的路徑...謝謝。 – cprogrammer

相關問題