很多朋友在做繪圖程序的時候往往出現屏幕不停刷新產生閃爍的問題這裡就告訴大家一個解決辦法緩沖繪圖如果有人是用取反畫圖解決這個問題那麼在畫直線的時候容易出現斑點效果不是很好如果是圖片很大那麼緩沖畫圖是解決的好辦法
在網上搜索一下內存繪圖或者緩沖繪圖會有很多技術文章不過都是以vc或者java為主很少有pascal的代碼例子不過原理都是一樣的大家可以參考他們的文章我會在最後放上轉載的vc緩沖畫圖的文章)感謝原作者
Delphi中函數調用比較方便
OldBmp BufBmp是TbitMap
//畫圖方法
procedure TChartDraw(aCanvas: TCanvas);
begin
{把要畫的操作放在這裡}
end;
在你要畫的地方用如下代碼把內存中畫好的內容放到你要顯示的組件的canvas上這裡就是canvas
Draw (BufBmpCanvas);//Draw方法就是上面那段代碼
bitblt(selfCanvasHandle ClientWidth ClientHeight
selfBufBmpCanvasHandle SRCCOPY);//拷貝函數
如果要用多個緩沖用BufBmpAssign(OldBmp);做內存中圖片內容復制然後在bufbmp中做進一步操作再貼到顯示區簡單吧)
怎樣在內存緩沖中畫圖
介紹
用雙緩沖進行繪圖可解決在VC中繪圖時的閃爍現象
正文
用vc做程序如何畫圖是一個大家都很關心但是卻感到很難以理解的問題因為在mfc的封裝之下沒有現成的畫圖函數供你直接調用像vb等等裡面直接來個point之類的常常讓人感到無從下手這兩天幫人解決了一個用內存緩沖畫圖的問題順便也就談談這些東西也算是總結
我先來解釋一下在mfc裡面很關鍵的設備環境描述符也就是所謂的DC(device context)
還是從歷史來看吧dos時代我們如果要繪圖必須通過一系列系統函數來啟動圖形環境(用過turbo pascal或者turbo c的人該還有印象吧)這之間對各種硬件的初始化參數都不相同非常的煩人常常還要查閱硬件手冊那時的程序智能針對最流行的硬件來編寫對不流行的就沒有辦法了windows操作系統為了屏蔽不同的硬件環境讓編程時候不考慮具體的硬件差別采取了一系列辦法設備環境描述符就是這樣產生的簡單的說設備描述符抽象了不同的硬件環境為標准環境用戶編寫時使用的是這個虛擬的標准環境而不是真實的硬件與真實硬件打交道的工作一般交給了系統和驅動程序完成(這同樣解釋了為什麼我們需要經常更新驅動程序的問題)使用在windows圖形系統(gdi而不包括direct x)上面就體現在一系列的圖形DC上面我們如果要在gdi上面繪圖就必須先得到圖形DC的句柄(handle)然後指定句柄的基礎上進行圖形操作
再來回憶一下我們怎麼在sdk的環境下面繪圖呢我想這個大家都不太清楚吧但是確實很基礎在windows的sdk環境下面我們用傳統的c編寫程序在需要的繪圖地方(比如響應WM_PAINT消息的分支)這樣做
hdc = GetDC( hwnd );
oldGdiObject = SelectObject( hdcnewGdiObject );
繪圖操作
SelectObject( hdcoldGdiObject );
DeleteObject( newGdiObject );
ReleaseDC( hdc);
或者是這樣
BeginPaint( hwnd&ps );//PAINTSTRUCT ps ps is a paint struct
繪圖操作
EndPaint( hwnd )
這就是大概的過程我們看到了hdc(圖形DC句柄)的應用在繪圖的部分每一個繪圖函數基本上也要用到這個句柄最後我們還必須釋放它否則將嚴重影響性能每次我們都必須調用GetDC這個api函數得到(不能用全局變量保存結果重復使用我在後面解釋)這些是最最基本的windows圖形操作的方式相比dos時代簡單了些但是有些概念也難理解了些vb裡面的簡單的point函數其實最後也是被轉化為這樣的方式來執行系統幫助做了很多事情
[] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/24797.html