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);
本文提供了一种方法来确保在自绘或使用其他库时,条目数过多导致需要滚动条时,滚动条能够正常显示。通过实现`MyEnsureVisible`函数,我们可以在列表控件中指定项确保可见,从而解决滚动条不显示的问题。同时,文章还对比了`LockWindowUpdate`和`SendMessage(WM_SETREDRAW)`在不同场景下的表现,指出后者在处理重画消息方面更为高效。
1630

被折叠的 条评论
为什么被折叠?



