在沒有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秒這麼長的時間是為了...