非常奇怪的问题: 有兴趣的朋友可以试下,我现在郁闷得连CListBox都不敢用了!!!每向ListBox增加一行文本,系统都会调用OnEraseBkgnd先清除其他行的显示(焦点行(基本上)除外!!!)
然后再重新显示各行,而这些行其实并没有重绘的必要!我通过自绘方式想使每一行的背景色都不同,结果每增加一行,原来已经添加的各行背景都在发生变化!!
void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lps)
{
CRect rect=lps->rcItem;
rect.bottom-=1;
UINT nIndex=lps->itemID;
CDC dc;
dc.Attach(lps->hDC);
if(nIndex!=(UINT)-1)
{
int B=100+rand()%155;//获得随机颜色
dc.FillSolidRect(&rect,RGB(100,B,B));//填充此行背景
dc.SetTextColor(RGB(0,255-B,255-B));//设置文本颜色
char s[256];
int len=GetText(nIndex,s);
dc.DrawText(s,len,rect,0);
}
dc.Detach();
}即使不设为OwnerDraw方式,仍是如此!
可以通过CListBox的派生类中重载WM_ERASEBKGND消息,即可看到此过程BOOL CMylist::OnEraseBkgnd(CDC* pDC)
{
   MessageBox("OnEraseBkgnd",0,0);//显示消息框,以暂停观察效果
   return CListBox::OnEraseBkgnd(pDC); 
   //return TRUE;
}