在使用VC開(kāi)發(fā)圖形相關(guān)的應用程序時(shí),常常需要使用MFC的CDC類(lèi)直接把圖形畫(huà)在窗口上。這通常是通過(guò)響應Windows的WM_PAINT消息實(shí)現的。如果要畫(huà)的圖形比較復雜,或者比較大,那么畫(huà)圖過(guò)程可能會(huì )造成窗口的閃爍。當窗口調整大小時(shí),這種閃爍由為明顯。
解決窗口閃爍問(wèn)題的有效辦法就是使用內存DC,也稱(chēng)為緩沖DC。在內存中準備一個(gè)和窗口DC相同屬性的DC,在這個(gè)內存DC上執行畫(huà)圖操作。完成畫(huà)圖以后,把畫(huà)圖輸出的內容整體復制到目標窗口DC上。因為畫(huà)圖操作不在窗口DC上進(jìn)行,所以在畫(huà)圖的過(guò)程中窗口可以保持原來(lái)的內容。當畫(huà)好的內容被復制到窗口DC時(shí),因為復制操作執行的非???,所以用戶(hù)感覺(jué)窗口仿佛被立刻被畫(huà)好,從而消除了從舊畫(huà)面到白板再到新畫(huà)面的閃爍現象。
生成內存DC主要用到以下四個(gè)函數:
CreateCompatibleDC(CDC* pDC )。CDC類(lèi)的成員函數,用于創(chuàng )建一個(gè)和pDC指向的DC兼容的內存DC。
CreateCompatibleBitmap( CDC* pDC, int nWidth, int nHeight)。CBitmap類(lèi)的成員函數,用于按指定尺寸創(chuàng )建一個(gè)和pDC指向的DC兼容的位圖。
SelectObject(CBitmap * pBitmap)。CDC類(lèi)的成員函數,執行以后,所以在該DC上的圖像輸出都將被畫(huà)到pBitmap指向的位圖上。
hdcDest:指向目標設備環(huán)境的句柄。
nXDest:指定目標矩形區域左上角的X軸邏輯坐標。
nYDest:指定目標矩形區域左上角的Y軸邏輯坐標。
nWidth:指定源和目標矩形區域的邏輯寬度。
nHeight:指定源和目標矩形區域的邏輯高度。
hdcSrc:指向源設備環(huán)境的句柄。
nXSrc:指定源矩形區域左上角的X軸邏輯坐標。
nYSrc:指定源矩形區域左上角的Y軸邏輯坐標。
CBitmap bitmap;
CBitmap *pOldBitmap;
CRect rect;
GetClientRect(&rect);
memdc.CreateCompatibleDC(pDC); //以屏幕DC 建立內存DC
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//以屏幕DC建立位圖
pOldBitmap = memdc.SelectObject(&bitmap);//將上面創(chuàng )建的位圖選入內存DC中,返回CBitmap的指針并賦給pOldBitmap
//下面可以在memdc上進(jìn)行繪圖操作
memdc.FillSolidRect(rect,RGB(0,0,0));
CString str;
str.Format("%d",212);
memdc.SetBkColor(RGB(0,0,255));
memdc.SetTextColor(RGB(255,0,0));
memdc.TextOut(rect.left+rect.Width()/2,rect.top+10,str);
//繪圖結束
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); // 從內存DC復制到屏幕DC
memdc.SelectObject(pOldBitmap);
聯(lián)系客服