我有一个自绘的Listctrl,想把它应用到Listview里,上网查了一下说是把listctrl中的处理直接搬到listview中就可以了
现在的问题就是:listctrl的处理是在drawitem函数里,可是listview里没有这个虚函数啊,而且listview里也没有WM_DRAWITEM消息,我手动在listview里重载这个虚函数(drawitem函数)也不好使,不会被调用。
查了一下listctrl调用drawitem的过程,是由OnChildNotify函数接收到WM_DRAWITEM消息后调用的,然后我重载了listview的OnChildNotify函数,但他从未接收过WM_DRAWITEM消息。如果我不加判断(判断是否是WM_DRAWITEM消息)的调用drawitem函数,运行程序就会直接报错
请问高人们这个问题如何解决?

解决方案 »

  1.   

    listctrl的处理是在drawitem函数里???这不行吧,你得把drawitem的东西放到listctrl类里,然后在移植。
      

  2.   

    你要明白DrawItem在什么情况下才调用。要在自画风格下才调用才有效
      

  3.   

    回2楼的朋友,我的DrawItem函数就是放在listctrl类中处理的
    现在的问题就是想把它移植到listview中去,但是listview类中没有这个虚函数3楼的朋友,我现在用的是listview,不是listctrl控件,我的自绘listctrl控件是可以接收WM_DRAWITEM消息的
    请教我如何设置能让listview成为自绘风格?
      

  4.   

    楼主,listview是有drawItem的。class CListView : public CCtrlView
    {
    DECLARE_DYNCREATE(CListView)// Construction
    public:
    CListView();// Attributes
    public:
    CListCtrl& GetListCtrl() const;// Overridables
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);protected:
    void RemoveImageList(int nImageList);
    virtual BOOL OnChildNotify(UINT, WPARAM, LPARAM, LRESULT*);public:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //{{AFX_MSG(CListView)
    afx_msg void OnNcDestroy();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };
      

  5.   

    看看这个,试试。
    BOOL CMyListView::PreCreateWindow(CREATESTRUCT& cs)
    {
    // default is report view and full row selection
    cs.style &= ~LVS_TYPEMASK;
    cs.style |= LVS_REPORT | LVS_OWNERDRAWFIXED;//这里LVS_OWNERDRAWFIXED
    m_bFullRowSel = TRUE; return(CListView::PreCreateWindow(cs));
    }