List Control的刷新闪烁

List   Control的刷新闪烁,style为ICON,我重写了OnCustomDraw事件,每次刷新对于List的每个item都会调一次OnCustomDraw,这样产生严重的闪烁

双缓冲啊,绘图基本都这么干  
   
  给你一个类:  
   
  class   CMemDC   :   public   CDC  
  {  
  public:  
  CMemDC(CDC*   pDC)   :   CDC()  
  {  
  m_pDC   =   pDC;  
  m_pOldBitmap   =   NULL;  
  pDC->GetClipBox(&m_rect);  
  CreateCompatibleDC(pDC);  
  m_bitmap.CreateCompatibleBitmap(pDC,   m_rect.Width(),   m_rect.Height());  
  m_pOldBitmap   =   SelectObject(&m_bitmap);  
  SetWindowOrg(m_rect.left,   m_rect.top);  
  }  
   
  ~CMemDC()  
  {  
  m_pDC->BitBlt(m_rect.left,   m_rect.top,   m_rect.Width(),   m_rect.Height(),  
  this,   m_rect.left,   m_rect.top,   SRCCOPY);  
  SelectObject(m_pOldBitmap);  
  }  
  CMemDC*   operator->()   {return   this;}  
  operator   CMemDC*()   {return   this;}  
  public:  
  CBitmap   m_bitmap;  
  CBitmap   *m_pOldBitmap;  
  CDC*   m_pDC;  
  CRect   m_rect;  
  };  
   
  你在你原来的程序里面这样就就可以了:  
   
  CRect   rect;  
  pDC->GetClipBox(rect);  
   
  CMemDC   dc(pDC);  
  dc.FillSolidRect(rect,   RGB(255,   255,   255));  
   
  然后所有内容都画到dc上,而不要画到pDC上  
   
  就行了
-------------------------------------------------------------------------------------------------
试试下面的方法  
  在CDDS_PREPAINT阶段把list   ctrl   DC的bitblt到一个memory   DC中,在custom   draw的其它phase中把要draw的内容draw到memDC中,在最后一个item   的post   phase阶段把memDC的内容复制给list   ctrl   DC.  
   
  不过我在使用custom   draw定制list   ctrl时,即使对每一个subitem都draw,也没有很严重的flicker;)  

你可能感兴趣的:(c++)