再请教一个CListCtrl背景刷新的问题

zeeway 2003-06-16 05:34:22
我的CListCtrl控件背景设成了自己的图片,在点击Item时要刷新背景,

我在OnClick函数里用InvalidateRect函数来刷新,为什么我用鼠标点击时

背景会刷新,而用键盘来选择Item(用左右键选择),背景就刷新不了?

thx
...全文
88 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzw81 2003-08-15
  • 打赏
  • 举报
回复
up
xyuncn 2003-07-11
  • 打赏
  • 举报
回复
up
zeeway 2003-07-09
  • 打赏
  • 举报
回复
this->voice_dlg->GetDC()->(rect,&bkbrush);
这句根本就编译通过不了啊,GetDC()->后跟的是什么函数啊?
zeeway 2003-06-22
  • 打赏
  • 举报
回复
this->voice_dlg->GetDC()->(rect,&bkbrush);
~~这边少掉的函数是什么啊?
bileg 2003-06-22
  • 打赏
  • 举报
回复
up
lingfeng8888 2003-06-22
  • 打赏
  • 举报
回复
没有少什么,只是加了些代码做测试用,屏蔽和开放最后一句可以看到最后一句是有效果的。
lingfeng8888 2003-06-17
  • 打赏
  • 举报
回复
只有把你的代码贴出来看看,要不谁都不知道你的刷新是怎么处理的?问题在哪?
zeeway 2003-06-17
  • 打赏
  • 举报
回复
是啊,用鼠标和用键盘都会执行那条刷新语句,而且我在执行完后加了TRACE,它们刷新的区域也都是一样的啊,可鼠标点击会刷新,用键盘就刷新不了了。
zhaoweidf 2003-06-17
  • 打赏
  • 举报
回复
学习
lingfeng8888 2003-06-17
  • 打赏
  • 举报
回复
void MyListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
this->RefreshBk();
if (pNMListView->iItem < 0)
return;
nSelected = pNMListView->iItem;
*pResult = 0;
}
void MyListCtrl::RefreshBk()
{
CRect rect,rect1,rect2;
int x,y;
this->voice_dlg->GetWindowRect(rect1);
this->GetWindowRect(rect2);
x = rect2.TopLeft().x - rect1.TopLeft().x;
y = rect2.TopLeft().y - rect1.TopLeft().y;
this->GetItemRect(nSelected,&rect,LVIR_BOUNDS);
//nSelected 是调用该函数时所点击的Item
rect.OffsetRect(x,y);

CBrush bkbrush; //用这三条代码刷你要更
bkbrush.CreatSolidBrush(RGB(50,250,250)); //新的区域,屏蔽和开放
this->voice_dlg->GetDC()->(rect,&bkbrush); //下面的语句可以看到效
//果,实际是有用的。
this->voice_dlg->InvalidateRect(&rect);
}

经过上面的测试,在我的机器上无论用鼠标点击还是光标键,最后这条语句都可以起作用。
zeeway 2003-06-17
  • 打赏
  • 举报
回复
this->voice_dlg是我的对话框,

MyListCtrl是我重载的类
zeeway 2003-06-17
  • 打赏
  • 举报
回复
void MyListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
this->RefreshBk();
if (pNMListView->iItem < 0)
return;
nSelected = pNMListView->iItem;
*pResult = 0;
}
void MyListCtrl::RefreshBk()
{
CRect rect,rect1,rect2;
int x,y;
this->voice_dlg->GetWindowRect(rect1);
this->GetWindowRect(rect2);
x = rect2.TopLeft().x - rect1.TopLeft().x;
y = rect2.TopLeft().y - rect1.TopLeft().y;
this->GetItemRect(nSelected,&rect,LVIR_BOUNDS);
//nSelected 是调用该函数时所点击的Item
rect.OffsetRect(x,y);
this->voice_dlg->InvalidateRect(&rect);
}
lingfeng8888 2003-06-16
  • 打赏
  • 举报
回复
既然进入了,那么你的刷新处理代码是不是在里面被执行了?如果不行,自己那一句代码让它刷新试试看。
zeeway 2003-06-16
  • 打赏
  • 举报
回复
进入是可以的,我也调试过了,连InvalidateRect用的矩形都是一样的,可动键盘它就是不给我刷新。(是刷新背景,不是刷新Item)
lingfeng8888 2003-06-16
  • 打赏
  • 举报
回复
不知道你的代码是怎么样的,但我在我的程序中做了测试,不仅用鼠标点击可以进入OnItemChanged函数,而且用光标也可以进入。
zeeway 2003-06-16
  • 打赏
  • 举报
回复
我最早用的就是OnItemChanged,效果一样,我才换OnClick来的。
lingfeng8888 2003-06-16
  • 打赏
  • 举报
回复
因为OnClick函数响应你的鼠标单击事件,在单击事件中你做了背景刷新处理。而用键盘操作时并没有激发OnClick事件,因此你的OnClick函数没有被执行,你的背景也就没有被刷新。
你改为在响应LVN_ITEMCHANGED事件试试。
丁淇石头 2003-06-16
  • 打赏
  • 举报
回复
映射HDN_ITEMCHANGED消息
leeajax 2003-06-16
  • 打赏
  • 举报
回复
OnClick当然是要点击才可以,你因该隐射焦点改变消息

15,979

社区成员

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

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