相信經常做圖形視覺化的人都知道雙緩衝概念,那是優化重新整理顯示的技術。實際上,它還有其他用途。
一般的程式當中經常有縮圖、鷹眼、或者列印輸出等。有人依靠截圖儲存為來實現。這是可行的。不過缺點是再明顯不過的了。當檢視區有其他視窗遮擋時,截圖會把一些非顯示區內容摻雜進來,效果不理想。
然而利用記憶體dc繪製可以避免這一缺點。如果將記憶體dc內容拷貝到螢幕dc上就屬於雙緩衝了。將記憶體dc拷貝到其他視窗如鷹眼就可以實現鷹眼等等。
這裡面經常碰到乙個問題。假如有乙個程式原先的設計是用螢幕dc實現的,其中對螢幕dc進行了各種各樣的設定,比如重新設定對映模式,視窗和視口原點座標,範圍等(其實是過載preparedc裡面的內容)。現在要改為記憶體dc實現。需要做些什麼呢?記憶體dc也有視口和視窗。
為了減小**移植量,最簡單的做法就是對記憶體dc首先進行同樣的準備工作preparedc,繪製時傳入的不再是螢幕dc而是記憶體dc。那麼最後拷貝的時候需要傳入怎樣的源範圍和目標範圍呢?因為這個範圍也是和視口座標相關的,直接影響到拷貝的效果。
以前深究過這個問題。後來發現其實沒有意義。有更為技巧性的方法。首先我們建立記憶體dc之後並且進行了準備工作之後,需要建立相容位圖。這個點陣圖的大小只需要設定和檢視區範圍一樣大即可。然後我們首先要把資料範圍區涂上乙個背景色(fillsolidrect),之後再開始主要的繪製工作。繪製結束後,別急著拷貝,我們要首先把記憶體dc和螢幕dc的所有設定全部初始化(包括對映模式等)。這樣一來,拷貝的時候我們就不需要關心具體的範圍是多少了,只需要拷貝檢視區範圍即可達到要求。
void ctestview::ondraw(cdc* pdc)
視口和視窗
對映方式指定了邏輯座標系的邏輯單位和座標軸正方向,座標原點沒有涉及。而且,在 自作主張的 兩種對映方式下,邏輯單位 座標軸正方向和座標原點都有待確定。視口 是基於裝置座標的,通常,視口與客戶區相同。點 0,0 是客戶區域的左上角。x 的值向右增加,y 的值向下增加。視窗 是基於邏輯座標的,邏輯座標可...
QT視口和視窗
視口和視窗實際上是同一區域 視口使用的是物理座標,而視窗使用的是邏輯座標,可以無視widget的放大和縮小 int w width int h height int side qmin w,h 去長和寬的小值 qrect rect w side 2 h side 2 side,side viewpo...
視窗與視口的區別
繪圖操作只能在客戶區中進行。除客戶區以外的部分都叫非客戶區 在 windows的作圖函式中,涉及邏輯座標到裝置座標的轉換。這裡提到的視窗 window 視口 viewport 是對應的概念。視口是與裝置相關 的乙個矩形區域,座標單位是與裝置相關的。視窗的座標是邏輯座標,與裝置無關。視窗座標的原點與視...