記憶體cdc雙緩衝問題

2021-06-16 08:33:08 字數 1597 閱讀 3881

在沒有msdn惡劣環境下,經過不斷地摸索,我終於搞清楚了記憶體dc雙緩衝顯示不出來的問題!其實無論畫圖**放在**,只要**正確,肯定是能成功顯示出來的,記憶體dc雙緩衝並不要求畫圖**非得放在乙個什麼特定的位置。

之前我的工程之所以顯示不出東西,簡單說來其原因在於dc內部座標對映的問題,網上記憶體dc雙緩衝並沒有說明白這一點。

一下是乙個典型的記憶體dc雙緩衝例子,**:

crect rect;

this->getclientrect(rect);

cbitmap bmpface;

bmpface.createcompatiblebitmap(pdc,rect.width(),rect.height());(1)注意把握rect的尺寸為客戶區域大小;

之後將這幅畫選入記憶體dc中,

cbitmap* poldbmp = null;

poldbmp = memdc.selectobject(&bmpface);; (2)

之後可以開始在記憶體dc中進行任何繪製動作;

cbrush brush(rgb(255,255,255));

memdc.fillrect(rect,&brush);

for(int i=0;i<500;i++)

繪製完後將記憶體dc中的這幅圖繪製到螢幕dc中來,

pdc->bitblt(rect.left,rect.top,rect.width(),rect.height(),&memdc,rect.left,rect.top,srccopy); (3)

最後進行相關的資源**動作,

memdc.selectobject(poldbmp);

bmpface.deleteobject();。

上述**至少有三處需要注意的地方,我已經標上了序號。其中(1)建立了乙個與顯示dc相相容的點陣圖,引數2,3指明了點陣圖的大小,(2)處將這個位圖選入了記憶體dc中,預設點陣圖的左上角與記憶體dc的(0,0)處相對應,這一步的作用是讓記憶體dc 「有地方用來作畫」。經過接下來的一番塗抹之後,在第(3)步把記憶體dc中的內容複製到顯示dc中,前4個引數指明了目的dc(也就是顯示dc)的區域座標和大小,即我們想把記憶體dc中的內容複製到顯示dc的什麼位置,第5個引數指明了源dc(也就是記憶體dc),第6,7個引數指明了源dc的起始座標,即我們想對記憶體dc中從什麼地方開始的內容進行複製。

上述的例子中的矩形rect選用的是整個視窗客戶區的矩形,所以下面的那些座標都用的是這個矩形的座標,這樣就掩蓋了座標對映的問題。但是在我的工程中並不是對整個視窗客戶區進行雙緩衝繪圖,而是對視窗中的乙個小矩形,於是我改變了rect的位置和大小,但其它的**都沒動,因此就顯示不出東西了。事實上,所有的繪圖工作都順利地進行了,只是都畫在了我們看不到的地方。

如果雙緩衝的區域不是整個客戶區的話,我建議這樣做:在記憶體dc的(0,0)起始點作圖,畫完之後把記憶體dc中的內容複製到顯示dc的所需的位置;而不是在記憶體dc中的相應位置作圖,然後在複製到顯示dc所需位置,因為這樣做的話需要在繪圖時在記憶體dc中做太多的座標變換,太麻煩。

另外,還發現一點就是在畫折線的時候最好使用cdc::polyline(……)函式,它比連續呼叫moveto()和lineto()速度要快得多!

最好貼個圖,我用記憶體dc解決了之前的離散的點的問題,先畫折線,再畫特殊的點。

JAVA雙緩衝問題

當我們應用程式的邏輯要對系統介面進行更新時,呼叫repaint 方法來通知awt執行緒進行重新整理操作。repaint 方法實際會讓awt執行緒去呼叫另外乙個方法,update。update方法在預設情況下會做兩件事,一是清除當前區域內容,二是呼叫其paint 方法完成實際繪製工作。第乙個優化工作就...

如何實現雙緩衝 vc雙緩衝

cdc memdc 首先定義乙個顯示裝置物件 cbitmap membitmap 定義乙個位圖物件 隨後建立與螢幕顯示相容的記憶體顯示裝置 memdc.createcompatibledc null 這時還不能繪圖,因為沒有地方畫 下面建立乙個與螢幕顯示相容的點陣圖,至於點陣圖的大小嘛,可以用視窗的...

雙緩衝和後備緩衝

前面的例子都是,直接在主表面上繪東西。對於動畫,直接在主表面上繪,會產生很嚴重的閃爍。解決的辦法是採用雙緩衝或後備緩衝。雙緩衝 在離屏緩衝中繪製影象,然後將其拷貝到顯示表面。見下面 先把資料放到double buffer,最後再拷貝到主表面上。下面sleep 300 睡眠了0.3秒這麼長的時間是為了...