一般,在您呼叫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函數保存的狀態中。