刷新闪烁和双缓存问题

来源:互联网 发布:浴缸品牌 知乎 编辑:程序博客网 时间:2024/04/30 16:04

  CDC   MemDC;   //首先定义一个显示设备对象  
  CBitmap   MemBitmap;//定义一个位图对象  
   
  //随后建立与屏幕显示兼容的内存显示设备  
  MemDC.CreateCompatibleDC(NULL);  
  //这时还不能绘图,因为没有地方画   ^_^  
  //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小  
  MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);  
   
  //将位图选入到内存显示设备中  
  //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上  
  CBitmap   *pOldBit=MemDC.SelectObject(&MemBitmap);  
   
  //先用背景色将位图清除干净,这里我用的是白色作为背景  
  //你也可以用自己应该用的颜色  
  MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));  
   
  //绘图  
  MemDC.MoveTo(……);  
  MemDC.LineTo(……);  
   
  //将内存中的图拷贝到屏幕上进行显示  
  pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);  
   
  //绘图完成后的清理  
  MemBitmap.DeleteObject();  
  MemDC.DeleteDC();  
   
  之后又重载了:WM_ERASEBKGND消息   
    
例如

  void   CSlidView::OnPaint()    
  {  
  CPaintDC   dc(this);    
  CRect   clientRect;  
  GetClientRect( &clientRect );  
  CDC   MemDC;  
  CBitmap   Membitmap;  
  Membitmap.CreateCompatibleBitmap(   &dc,   clientRect.Width(),   clientRect.Height()   );  
  MemDC.CreateCompatibleDC(   &dc   );  
  CBitmap   *pOldBitmap   =   MemDC.SelectObject(   &Membitmap   );  
  MemDC.FillSolidRect(   0,   0,   clientRect.Width(),   clientRect.Height(),   RGB(   255,   255,   255   )   );  
  MemDC.Ellipse(   &clientRect   );   //记住 画图时候用  CDC   MemDC;  即先在CDC上画 之后拷贝上去
  dc.BitBlt(   0,   0,   clientRect.Width(),   clientRect.Height(),   &MemDC,   0,   0,   SRCCOPY   );  
  MemDC.DeleteDC();  
  Membitmap.DeleteObject();  
  }  
   
  BOOL   CSlidView::OnEraseBkgnd(CDC*   pDC)    
  {  
  return   CView::OnEraseBkgnd(pDC);  
  }

 

下面是我的程序中的例子:

void CViewDlg::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 if (!m_bDrawLine)
 {
  return;
 }
 
 CRect rcClient;
 CRect rcCurve;
 int nWidth;
 int nHeight;
 GetClientRect(rcClient);
 
 CRect rtTree;
 CWnd *pWnd = (CWnd *)GetDlgItem(IDC_TREE_ACC);
 if (pWnd)
 {
  pWnd->GetClientRect(rtTree);
  
  rcCurve.left = rtTree.right + 4 +SPLITTER_WIDTH +10;
  rcCurve.top = rcClient.top +10;
  rcCurve.right = rcClient.right -10 ;
  rcCurve.bottom = rcClient.bottom  -10 ;
  
  
  m_FrameRect.left = rcCurve.left + 40;
  m_FrameRect.top = rcCurve.top + 30;
  m_FrameRect.right = rcCurve.right - 20;
  m_FrameRect.bottom = rcCurve.bottom - 20;
 }
 m_RectInvalidate = rcCurve;
 nHeight = rcClient.Height();
 nWidth = rcClient.Width();
 CDC MemDC; //首先定义一个显示设备对象
 CBitmap MemBitmap;//定义一个位图对象
 
 //随后建立与屏幕显示兼容的内存显示设备
 MemDC.CreateCompatibleDC(NULL);
 //这时还不能绘图,因为没有地方画
 //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
 MemBitmap.CreateCompatibleBitmap(&dc,nWidth,nHeight);
 
 //将位图选入到内存显示设备中
 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
 
 MemDC.MoveTo(rcCurve.left, rcCurve.top);
 MemDC.LineTo(rcCurve.left, rcCurve.bottom);
 MemDC.LineTo(rcCurve.right, rcCurve.bottom);
 MemDC.LineTo(rcCurve.right, rcCurve.top);
 MemDC.LineTo(rcCurve.left, rcCurve.top);
//
//  //绘制背景色
 if (m_pObj->m_bDrawBk)
 {
  CBrush brush;
  COLORREF color = m_pObj->m_pHMIWizardAPI->ColorGet(m_pObj->m_shBkColor);
  brush.CreateSolidBrush(color);
  CBrush* pOldbrush = MemDC.SelectObject(&brush);
  FillRect(MemDC, m_FrameRect, brush);
  MemDC.SelectObject(pOldbrush);
  brush.DeleteObject();
 }

 DrawStatic(&MemDC, m_FrameRect);
 DrawCurve(&MemDC, m_FrameRect);


 dc.BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
 
 //绘图完成后的清理
 MemBitmap.DeleteObject();
 MemDC.SelectObject(pOldBit);
 MemDC.DeleteDC();

 
}
BOOL CViewDlg::OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
 return TRUE; //很重要
}

原创粉丝点击