自绘CListCtrl防止闪烁的方法

简介:

自绘控件中经常会遇到闪烁的问题,主要原因是某个区域发生了重复性的绘制而导致的,而列表控件在自绘后闪烁原因是WM_ERASEBKGND消息所导致的。解决定办法可以将这个消息屏蔽掉,然后使用双缓存,在Windows 5.1版本以后可以使用LVS_EX_DOUBLEBUFFER样式,为了各个版本的兼容性我个人不建议使用这个样式,因此我们可以拦截WM_PAINT消息来使用我们自已创建的双缓存,具体看代码所示:


 1.屏蔽WM_ERASEBKGND消息
BOOL CMyListCtrl::OnEraseBkgnd(CDC  *  pDC)  
{  
    
return FALSE;  
}

2.在WM_PAINT消息中使用自已的双缓存
void  CMyListCtrl::OnPaint()  
{  
    CPaintDC dc(
this);  
  
    CRect rcClient,rcClip,rcHeader;  
    GetClientRect(
&rcClient);  
  
    GetHeaderCtrl()
->GetWindowRect(&rcHeader);  
    dc.GetClipBox(
&rcClip);  
  
    CDC MemDC;  
    CBitmap MemBitmap, 
*pOldBitmap;  
  
    MemDC.CreateCompatibleDC(
&dc);  
    
int nMode = MemDC.SetMapMode(dc.GetMapMode());  
  
    MemBitmap.CreateCompatibleBitmap(
&dc,rcClient.Width(),rcClient.Height());  
    pOldBitmap 
= MemDC.SelectObject(&MemBitmap);  
    MemDC.FillSolidRect(
&rcClient,GetBkColor());  
  
    CRgn rgn;  
    rgn.CreateRectRgn(rcClip.left,rcClip.top,rcClip.right,rcClip.bottom);  
    MemDC.SelectClipRgn(
&rgn);  
    DefWindowProc(WM_PAINT,(WPARAM)MemDC.m_hDC,(LPARAM)
0);  
    MemDC.SelectClipRgn(NULL);  
  
    
if (rcClip.top < rcHeader.Height())  
        rcClip.top 
= rcHeader.Height();  
  
    dc.BitBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),
&MemDC,rcClip.left,rcClip.top,SRCCOPY);  
  
    MemDC.SetMapMode(nMode);  
    MemDC.SelectObject(pOldBitmap);  
    MemDC.DeleteDC();  
    MemBitmap.DeleteObject();  
    rgn.DeleteObject();  
}
目录
相关文章
|
算法 Windows
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
1781 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
|
4月前
|
Windows
MASM32编程状态栏显示字符动画,按钮跑马灯
MASM32编程状态栏显示字符动画,按钮跑马灯
SwiftUI—如何给视图添加拖动手势
SwiftUI—如何给视图添加拖动手势
628 0
重新认识键盘与鼠标——键盘事件与鼠标事件
重新认识键盘与鼠标——键盘事件与鼠标事件
284 0
重新认识键盘与鼠标——键盘事件与鼠标事件
|
C# 前端开发
WPF 一个弧形手势提示动画
原文:WPF 一个弧形手势提示动画 这是一个操作提示动画,一个小手在屏幕上按照一个弧形来回运动 ...
726 0
|
C# 索引 容器
WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画
原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同时增加鼠标的悬停效果。
1861 0
|
C#
解决WPF的ScrollViewer在使用触摸屏时,滑到尽头窗口抖动的情况
原文:解决WPF的ScrollViewer在使用触摸屏时,滑到尽头窗口抖动的情况 wpf的ScrollViewer在触摸条件下 默认在尽头时会有一个窗口一起被拖动的FeedBack,但对用户的交互很不友好,尤其是全屏应用,一划就看到了后面的桌面。
1442 0