listctrl 插入多条数据时避免闪烁

来源:互联网 发布:用jsp简单游戏编程 编辑:程序博客网 时间:2024/06/05 10:37
SetRedraw(false);  //...SetRedraw(true);

自绘或者使用其他库的时候如果条目数过多需要滚动条的时候可能会不显示滚动条。解决方法如下:

void CListCtrlMy::MyEnsureVisible(int iSize){    CRect rct;    GetWindowRect(&rct);    //减去列表头,然后除以单个的自设列表的高度,    int iItem = (rct.Height()-25)/26;     if (iSize >= iItem)    {        EnsureVisible(iItem,FALSE);        EnsureVisible(0,TRUE);    }}

//2015.3.6 编辑

LockWindowUpdate();  UnlockWindowUpdate();

LockWindowUpdate不但闪烁,而且有可能引起桌面闪烁。因为LockWindowUpdate并不忽略消息,只是暂时不响应,
所以有可能积聚多个重画消息,并在使用LockWindowUpdate(0)之后依次响应。
而使用SendMessage(ClientHandle,WM_SETREDRAW,0,0)之后,控件根本不接收重画消息,除非使用SendMessage(ClientHandle,WM_SETREDRAW,1,0)之后;
LockWindowUpdate的意思是暂时禁止某控件或窗口所在的区域更新(这个区域可能有多个窗口),LockWindowUpdate(0)的意思是有更新消息就更新屏幕上所有该更新的窗口吧。所以LockWindowUpdate(0)之后,若此前有重画消息积聚,会立刻重画。所以使用LockWindowUpdate会在不同的时候有不同的表现,比如屏幕上窗口多少、堆放情况等等,所以有时不闪有时却闪个不停。
SendMessage(ClientHandle,WM_SETREDRAW,0,0)的意思是不接收任何重画消息;
SendMessage(ClientHandle,WM_SETREDRAW,1,0)的意思是可以接收并响应重画消息了,但并不立即重画,所以必须附加 ReDrawWindow(ClientHandle,nil,0,RDW_INVALIDATE or RDW_ALLCHILDREN);

0 0
原创粉丝点击