保存設備內容,CS_OWNDC

一般,在您呼叫GetDC或BeginPaint時,Windows用默認值創建一個新的設備內容,您對屬性所作的一切改變在設備內容用 ReleaseDC或EndPaint呼叫釋放時,都會丟失。若是您的程序須要使用非內定的設備內容屬性,則您必須在每次取得設備內容句柄時初始化設備內 容:函數

case WM_PAINT:
        
    hdc = BeginPaint (hwnd, &ps) ;
        
    設備內容屬性
        
    繪製窗口顯示區域
        
    EndPaint (hwnd, &ps) ;
        
    return 0 ;

雖然在一般狀況下這種方法已經很使人滿意了,可是您還可能想要在釋放設備內容以後,仍然保存程序中對設備內容屬性所作的改變,以便在下一次呼叫GetDC 和BeginPaint時它們仍然可以起做用。爲此,可在登陸窗口類別時,將CS_OWNDC旗標歸入窗口類別的一部分:性能

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC ;

如今,依據這個窗口類別所創建的每一個窗口都將擁有本身的設備內容,它一直存在,直到窗口被刪除。若是使用了CS_OWNDC風格,就只需初始化設備內容一次,能夠在處理WM_CREATE消息處理期間完成這一操做:code

case        WM_CREATE:
        
      hdc = GetDC (hwnd) ;
        
初始化設備內容屬性
        
       ReleaseDC (hwnd, hdc) ;

這些屬性在改變以前一直有效。內存

CS_OWNDC風格隻影響GetDC和BeginPaint得到的設備內容,不影響其它函數(如GetWindowDC)得到的設備內容。之前不提倡使用CS_OWNDC風格,由於它須要內存;如今,在處理大量圖形的Windows NT應用程序中,它能夠提升性能。即便用了CS_OWNDC,您仍然應該在退出窗口消息處理程序以前釋放設備內容。class

某些狀況下,您可能想改變某些設備內容屬性,用改變後的屬性進行繪圖,而後恢復原來的設備內容。要簡化這一過程,能夠經過以下呼叫來保存設備內容的狀態:登錄

idSaved = SaveDC (hdc) ;

如今,能夠改變一些屬性,在想要回到呼叫SaveDC前存在的設備內容時,呼叫:程序

RestoreDC (hdc, idSaved) ;

您能夠在呼叫RestoreDC以前呼叫SaveDC數次。方法

大多數程序寫做者以不一樣的方式使用SaveDC和RestoreDC。然而,更像彙編語言中的PUSH和POP指令,當您呼叫SaveDC時,不須要保存傳回值:高性能

SaveDC (hdc) ;

而後,您能夠更改某些屬性並再次呼叫SaveDC。要將設備內容恢復到一個已經保存的狀態,呼叫:語言

RestoreDC (hdc, -1) ;

這就將設備內容恢復到最近由SaveDC函數保存的狀態中。

相關文章
相關標籤/搜索