天天看點

重新整理閃爍和雙緩存問題

  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; //很重要

}

繼續閱讀