GDI 程式設計經驗 滾動條 縮放 繪製閃爍

2021-09-05 23:12:42 字數 1433 閱讀 4944

我們在使用gdi+實現類似畫圖板這樣的系統時,經常需要支援平移、滾動條、縮放等功能、解決繪製時的閃爍,對於缺乏gdi+開發經驗的朋友,經常會在這些問題上糾纏一段或長或短的時間。在這裡,我將自己的經驗小結一下,給後來的朋友作個參考。

1.如何解決繪製閃爍?

(1)所有的繪製動作都應該paint事件中完成。

比如,即使我們要拖動乙個view object,通常在mousemove事件中處理拖動行為,但是不要在mousemove事件中呼叫graphics.draw方法,而是應該採用command模式,將要繪製的動作封裝為乙個物件,傳遞到下一次的paint事件中再繪製。

(2)設定雙緩衝。

通常我們會選擇在某個控制項的表面進行繪製,那麼在初始化時,可以通過執行下面的**來啟用雙緩衝:

this

.setstyle(

controlstyles

.optimizeddoublebuffer 

|controlstyles

.allpaintinginwmpaint 

|controlstyles

.userpaint, 

true);

注意,setstyle是乙個control基類的乙個protected方法,也就是說,只能在其派生類中才能呼叫該方法。

通常,我是定義乙個從control繼承的自定義控制項,然後在構造方法中進行雙緩衝設定,如:

public

partial

class

viewpanel

: usercontrol}

(3)重新繪製發生變化的區域,而不是整個區域全部重繪。

control的invalidate方法有乙個過載接收region型別的引數,表示下次paint時要重繪的區域。比如,當我們拖動乙個物件時,只需要重繪比這個物件的bounds大一點的區域即可。

2.滾動條與縮放

當需要支援滾動條和縮放時,就需要採用一系列的座標變換來正確的記錄座標和繪製影象,這些過程是比較繁瑣的。幸運的是,gdi+能為我們減輕一部分這方面的負擔。當繪製view object時,只要我們指定graphics物件的幾個引數,graphics物件就會自動採用正確的比例和偏移來繪製所有的view object了。比如:

//graphics g ;

g.pageunit 

=graphicsunit

.pixel; 

才支援縮放與偏移繪製。

g.translatetransform(

this

.hscrollvalue, 

this

.vscrollvalue); //設定滾動條的當前位置

g.pagescale 

=this

.scale; //

設定縮放比例

g.draw(......);

window程式設計之滾動條 老式滾動條

顯示滾動條,只需要在createwindow的第三個引數中包括視窗樣式 ws 識別符號ws vscroll 垂直捲動 和 或ws hscroll 水平捲動 即可 這些捲動列通常放在視窗的右部和底部,伸展為顯示區域的整個長度或寬度。顯示區域不包含捲動列所佔據的空間。但是有這些是遠遠不夠滴.1.首先,滾...

windows程式設計 滾動條

include define numlines int sizeof sysmetrics sizeof sysmetrics 0 struct sysmetrics lresult callback wndproc hwnd,uint,wparam,lparam 視窗函式原型 int winapi...

程式設計實現控制網頁滾動條

控制網頁滾動條滾動可以通過按壓鍵盤上的上下按鈕鍵和滑動滑鼠的滑輪,當然也可以通過 來實現滾動條上下滾動。滾動條的控制主要由頁面的根節點元素來控制,獲取到了根節點就可以完全隨心所欲的控制滾動條了。獲取控制滾動條的頁面根節點元素 ccomptrbrowser domelemget ccomptrm pt...