程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC6下的GDI+雙緩沖

VC6下的GDI+雙緩沖

編輯:關於VC++

一、概述

這段時間在研究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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved