CListCtrl的OnCustomDraw问题,高分求教

give_me_a_class 2008-07-02 11:22:26
在自定义描画后,现在出现的问题是。
当我点击不同行的subitem时 反映(描画subitem)的速度很快
而当我点击的是同一行的subitem时,反映(描画subitem)的速度则很慢 大概0.5秒到1秒左右
请问是什么原因 要如何解决

大致代码如下
void CMstrListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

int subitem = lplvcd->iSubItem;
switch(lplvcd->nmcd.dwDrawStage)
{

case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_ITEMPREPAINT:

if((lplvcd->nmcd.dwItemSpec)%2 != 0)
{
lplvcd->clrTextBk = RGB(214, 227, 247);
}
//lplvcd->clrTextBk = RGB(0xAF,0xEE,0xEE);

*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;

case CDDS_SUBITEM|CDDS_ITEMPREPAINT:

if(subitem == 0)
{
return;
}

if( (lplvcd->nmcd.uItemState & CDIS_FOCUS) ) {


if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {

lplvcd->clrTextBk = RGB(0x66, 0x99, 0xFF);
lplvcd->clrText = RGB(0xFF, 0xFF, 0xFF);
lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
}
.......subitem 描画处理........
*pResult = CDRF_SKIPDEFAULT;
}
}
break;

default:
*pResult = CDRF_DODEFAULT;
break;
}
...全文
728 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuczhangyi 2010-01-22
  • 打赏
  • 举报
回复
楼主应该再每次写完一部分代码之后,全选,按ALT+F8...
my_girlf 2008-07-02
  • 打赏
  • 举报
回复
case CDDS_SUBITEM ¦CDDS_ITEMPREPAINT:

if(subitem == 0)
{
return;
}

if( (lplvcd->nmcd.uItemState & CDIS_FOCUS) ) {


if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {

lplvcd->clrTextBk = RGB(0x66, 0x99, 0xFF);
lplvcd->clrText = RGB(0xFF, 0xFF, 0xFF);
lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
}
.......subitem 描画处理........
*pResult = CDRF_DODEFAULT;
}
my_girlf 2008-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 give_me_a_class 的回复:]
二楼的回答不太明白。去掉break;?那样就不会描画subitem了 执行CDRF DODEFAULT了
我试验了一下,应该不是在描画subitem时变慢的
而是在case CDDS_SUBITEM ¦CDDS_ITEMPREPAINT 之前
反复的执行了很多次的case CDDS_PREPAINT:
和CDDS_ITEMPREPAINT:
[/Quote]
不是啊,你理解错了,我的意思是把标记为红色的用下面那句代替...
give_me_a_class 2008-07-02
  • 打赏
  • 举报
回复
二楼的回答不太明白。去掉break;?那样就不会描画subitem了 执行CDRF DODEFAULT了
我试验了一下,应该不是在描画subitem时变慢的
而是在case CDDS_SUBITEM ¦CDDS_ITEMPREPAINT 之前
反复的执行了很多次的case CDDS_PREPAINT:
和CDDS_ITEMPREPAINT:
my_girlf 2008-07-02
  • 打赏
  • 举报
回复
case CDDS_SUBITEM ¦CDDS_ITEMPREPAINT:

if(subitem == 0)
{
return;
}

if( (lplvcd->nmcd.uItemState & CDIS_FOCUS) ) {


if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {

lplvcd->clrTextBk = RGB(0x66, 0x99, 0xFF);
lplvcd->clrText = RGB(0xFF, 0xFF, 0xFF);
lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
}
.......subitem 描画处理........
*pResult = CDRF_SKIPDEFAULT;
}
*pResult = CDRF_DODEFAULT;
give_me_a_class 2008-07-02
  • 打赏
  • 举报
回复
up
my_girlf 2008-07-02
  • 打赏
  • 举报
回复
哎,提醒使用代码书写方式,很容易看漏了"{}"


case CDDS_SUBITEM ¦CDDS_ITEMPREPAINT:

if(subitem == 0)
{
return;
}

if( (lplvcd->nmcd.uItemState & CDIS_FOCUS) ) {


if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {

lplvcd->clrTextBk = RGB(0x66, 0x99, 0xFF);
lplvcd->clrText = RGB(0xFF, 0xFF, 0xFF);
lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
}
.......subitem 描画处理........
}
*pResult = CDRF_DODEFAULT;


简单的说,是应该如下这样对齐的:
case CDDS_SUBITEM ¦CDDS_ITEMPREPAINT:
......
*pResult = CDRF_DODEFAULT;
give_me_a_class 2008-07-02
  • 打赏
  • 举报
回复
这样不行 这样会执行default的 不会进行subitem的自定义描画了

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧