雙緩沖技術能消除窗口繪制時的閃爍,使得窗體控件能夠平滑繪制,這誰都知道。
但并不是每個人都理解它,我不就是其中一個么
。
Goolge了半天,別人實現雙緩沖的心得也看了半天多一點,還是不知其所然。接下來的事情有點機緣巧合,但都要感謝MSDN,這也再次印證了“MSDN是最好的老師”這句話。
我選擇了在 OnPaint() 函數中來實現它,按照MSDN中“CDC::CreateCompatibleDC”一文,左右修改,瞎猜亂碰,竟然給我把效果弄出來了。于是又看了半天才有一點點了解,原來這就是雙緩沖。不多說了,代碼最真:
void CRToolDlg::OnPaint()


{
//如果從托盤恢復,調用CDialog的OnPaint(),不然窗體無法畫出

if(m_bComeFromTray)
{
m_bComeFromTray = FALSE;
CDialog::OnPaint();
return;
}

//重置記憶位圖和DC
if(m_pBitmap->m_hObject != NULL)
m_pBitmap->DeleteObject();
if(m_pMemDC->m_hDC != NULL)
m_pMemDC->DeleteDC();

CRect rc;
GetClientRect(&rc);

//獲得屏幕DC
m_pDC->m_hDC = ::GetDC(NULL);

//為屏幕DC創建兼容的內存DC
m_pMemDC->CreateCompatibleDC(m_pDC);

//使繪制的位圖和客戶區一樣大
m_pBitmap->CreateCompatibleBitmap(m_pDC, rc.Width(), rc.Height());
m_pOldBitmap = m_pMemDC->SelectObject(m_pBitmap); //m_pMemDC選中m_pBitmap,并且返回上一個object,和我的第一篇文檔對應

//雙緩沖
m_pMemDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), m_pDC, rc.left, rc.top, SRCCOPY);
m_pDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), m_pMemDC, rc.left, rc.top, SRCCOPY);

//選回舊設備,以釋放……
m_pMemDC->SelectObject(m_pOldBitmap);
}
還要注意的是對象的new與delete,以及清除窗口背景的函數,沒了。
以上只是對話框里的實現,至于文檔視圖,等待實踐。
posted on 2009-03-18 10:20
崇文 閱讀(878)
評論(1) 編輯 收藏 引用