一、概述
這段時間在研究GDI+雙緩沖的實現方法,在網上花了很多時間都沒有找到合適的示例,特別是針對VC6的。後來通過對網上資料的分析,和對SDK/MFC的學習,實現了VC6下的GDI+雙緩沖,把它寫出來與大家分享,希望可以找到更好的實現方法。
GDI+的一個優點就是可以直接使用jpg圖像,在這個示例中,我沒有把圖像文件放在資源中,而是動態讀取,一是由於項目需求,圖像數目是未知的;二是由於動態讀文件效率低下,使用雙緩沖更能體現出優勢。
二、分析
在實現過程中,犯了一個錯誤,把讀圖像的方法放在了OnDraw之中,後來發現拖動滾動條閃爍的很嚴重,原因在於ScrollBar拖動時會產生消息激活OnDraw,這樣的話,每拖動滾動條就讀一次文件,重繪一次,效率當然低下了!
我的實現方式是:更換圖像後調用UpdateAllViews,內存DC的繪制都放在OnUpdate中操作,在內存繪制好後再在屏幕中貼圖。
// 貼上畫布
m_pOldBitmap = m_memDC.SelectObject(&m_memBitmap);
m_memDC.FillSolidRect(0,0,2000,2000,RGB(100,100,100));
// 貼圖
CString pStrFullPath = pDoc->m_pStrMapPath + pDoc->m_pStrMapName;
USES_CONVERSION;
LPWSTR wStr = A2W(pStrFullPath);
Image img(wStr);
pDoc->m_nMapWidth = img.GetWidth();
pDoc->m_nMapHeight = img.GetHeight();
Graphics g(m_memDC.GetSafeHdc());
g.DrawImage(&img,0,0,img.GetWidth(),img.GetHeight());
// 恢復
m_memDC.SelectObject(m_pOldBitmap);
三、截圖
圖一 GDI+雙緩沖效果
四、結束語
如果大家有更好的方法,請寫出來分享。
源代碼地址:http://www.vckbase.com/code/downcode.asp?id=3116