BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC) 这样一个函数,我应该怎样使用呢?如下使用。
CDC *pDC=GetDC();
CColoredListCtrl.OnEraseBkgnd(pDC);系统说:
error C2248: 'CWnd::OnEraseBkgnd' : cannot access protected member declared in class 'CWnd'
CDC *pDC=GetDC();
CColoredListCtrl.OnEraseBkgnd(pDC);系统说:
error C2248: 'CWnd::OnEraseBkgnd' : cannot access protected member declared in class 'CWnd'
CDC *pDC=GetDC();
CColoredListCtrl.OnEraseBkgnd(pDC);
调用函数
BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
//{{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)
BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
{
return CListCtrl::OnEraseBkgnd(pDC);
}
如果自己擦除背景,这样写:
BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
{
// 用pDC->调用函数
return TRUE;
}
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);
就不行呢?他的参数是指针,我就给他传递指针呀,为什么不通过~
是不是Public的函数,当然不行了。6楼已经给出了合理的解决方法。
http://www.codeproject.com/KB/list/coloredlistctrl.aspx
按照作者的提示,我添加了他的类,并替换。
我的程序是基于对话框的MFC。程序未作任何改动,界面依然不能彩色显示。cnzdgs说:
如果自己擦除背景,这样写:
BOOL CColoredListCtrl::OnEraseBkgnd(CDC* pDC)
{
// 用pDC->调用函数
return TRUE;
}我尝试了,无效。Mackz说:
这个函数不是由用户调用的;要调用,InValidate(TRUE)即可。我把InValidate(TRUE)放在::OnInitDialog()也不行。欲哭无泪。
而windows又是消息驱动的,所以主动权并不在你手里,你必须象回调函数一样遵守消息机制的规则,我们写windows程序时只是在实现windows的回调函数而已,这些回调(消息)函数是被系统调用的,你不遵守系统的规则来调用并不会产生你想要的结果.
OnInitDialog()的有关listctrl的部分,也只是赋初值一类的。真心求教!
但是你可以拦截发送给它的WM_ERASEBKGND来处理。
这个控件实现在两个函数中OnCustomDraw和OnEraseBkgnd,前者是绘制条目的,后者是绘制背景的,如果没有后者,就只有在条目区有色彩,空白的地方仍然是白色的。