BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC) 这样一个函数,我应该怎样使用呢?如下使用。
CDC   *pDC=GetDC();
CColoredListCtrl.OnEraseBkgnd(pDC);系统说:
error C2248: 'CWnd::OnEraseBkgnd' : cannot access protected member declared in class 'CWnd'

解决方案 »

  1.   

    DC 都已经通过参数传入了啊,又何必再GetDC()?
      

  2.   

    啊,看来是我没有表述清楚!我想通过
    CDC   *pDC=GetDC();
    CColoredListCtrl.OnEraseBkgnd(pDC);
    调用函数
    BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
      

  3.   

    CWnd::OnEraseBkgnd该成基类函数。
      

  4.   

    不能直接改吧,此函数在头文件里是这样的protected:
    //{{AFX_MSG(CColoredListCtrl)
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    //}}AFX_MSG
    afx_msg void CColoredListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
    DECLARE_MESSAGE_MAP()
    函数代码如下,它是listcontrol派生类
    BOOL CColoredListCtrl:: 
    {
    // TODO: Add your message handler code here and/or call default

      CRect rect;
      CColoredListCtrl::GetClientRect(rect);
      POINT mypoint;  
      
      CBrush brush0(m_colRow1);
      CBrush brush1(m_colRow2);
     
     int chunk_height=GetCountPerPage();
     pDC->FillRect(&rect,&brush1); for (int i=0;i<=chunk_height;i++)
     {


    GetItemPosition(i,&mypoint);
    rect.top=mypoint.y ;
    GetItemPosition(i+1,&mypoint);
    rect.bottom =mypoint.y;
    pDC->FillRect(&rect,i %2 ? &brush1 : &brush0);
     }  brush0.DeleteObject();
      brush1.DeleteObject();  return FALSE;
    }神奇,VS2005说这是BOOL CWnd::OnEraseBkgnd(CDC* pDC)
      

  5.   

    如果什么也不做,就这样写:
    BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
    {
        return CListCtrl::OnEraseBkgnd(pDC);
    }
    如果自己擦除背景,这样写:
    BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
    {
    // 用pDC->调用函数
        return TRUE;
    }
      

  6.   

    改写成 return TRUE,也没有用啊到底该怎样调用这个OnEraseBkgnd(CDC* pDC)啊 ?
    BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default

      CRect rect;
      CColoredListCtrl::GetClientRect(rect);
      POINT mypoint;  
      
      CBrush brush0(m_colRow1);
      CBrush brush1(m_colRow2);
     
     int chunk_height=GetCountPerPage();
     pDC->FillRect(&rect,&brush1); for (int i=0;i<=chunk_height;i++)
     {


    GetItemPosition(i,&mypoint);
    rect.top=mypoint.y ;
    GetItemPosition(i+1,&mypoint);
    rect.bottom =mypoint.y;
    pDC->FillRect(&rect,i %2 ? &brush1 : &brush0);
     }  brush0.DeleteObject();
      brush1.DeleteObject();  return TRUE;
    }为什么
    CDC   *pDC=GetDC();
    CColoredListCtrl.OnEraseBkgnd(pDC);
    就不行呢?他的参数是指针,我就给他传递指针呀,为什么不通过~
      

  7.   

    protected member
    是不是Public的函数,当然不行了。6楼已经给出了合理的解决方法。
      

  8.   

    这个函数不是由用户调用的;要调用,InValidate(TRUE)即可。
      

  9.   

    我的这个函数出自于
    http://www.codeproject.com/KB/list/coloredlistctrl.aspx
    按照作者的提示,我添加了他的类,并替换。
    我的程序是基于对话框的MFC。程序未作任何改动,界面依然不能彩色显示。cnzdgs说:
    如果自己擦除背景,这样写:
    BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
    {
    // 用pDC->调用函数
        return TRUE;
    }我尝试了,无效。Mackz说:
    这个函数不是由用户调用的;要调用,InValidate(TRUE)即可。我把InValidate(TRUE)放在::OnInitDialog()也不行。欲哭无泪。
      

  10.   

    你可能没搞明白OnEraseBkgnd的作用,界面刷新的时候,先绘制背景,然后通过WM_PAINT消息绘制内容,对于控件,相应WM_DRAWITEM消息绘制内容;如果你的目的是绘制控件的内容部分,那么这里的代码绘制的东西会被其他代码覆盖掉,当然看不出效果。
      

  11.   

    LZ你没有弄明白windows消息机制,实际上整个应用程序是windows 操作系统回调的产物,可以把所有消息函数都看作windows系统的回调函数,
    而windows又是消息驱动的,所以主动权并不在你手里,你必须象回调函数一样遵守消息机制的规则,我们写windows程序时只是在实现windows的回调函数而已,这些回调(消息)函数是被系统调用的,你不遵守系统的规则来调用并不会产生你想要的结果.
      

  12.   

    那么,对于这个函数的消息应该怎样写呢?最近确实正在学习消息,进度很缓慢。我想利用这个函数实现listctrl的背景隔行彩色显示。
    OnInitDialog()的有关listctrl的部分,也只是赋初值一类的。真心求教!
      

  13.   

    要实现listctrl的背景隔行彩色显示就要重载DrawItem自绘。
      

  14.   

    555.能说的详细点吗?结合这个例子~http://www.codeproject.com/KB/list/coloredlistctrl.aspx
      

  15.   

    listcontrol的OnEraseBkgnd是protected的,你当然不能访问了!
    但是你可以拦截发送给它的WM_ERASEBKGND来处理。
      

  16.   


    这个控件实现在两个函数中OnCustomDraw和OnEraseBkgnd,前者是绘制条目的,后者是绘制背景的,如果没有后者,就只有在条目区有色彩,空白的地方仍然是白色的。
      

  17.   

    这样的函数应该这样用。添加类,类名CColoredListCtrl,添加ColoredListCtrl.cpp 和ColoredLisCtrl.h替换原工程中的CListCtrl为CColoredListCtrl,并在头文件中添加#include "ColoredLisCtrl.h"清理解决方案和工程,重新编译生成。通过。