Windows提供了幾種取得設(shè)備內(nèi)容句柄的方法。
如果在處理一個消息時取得了設(shè)備內(nèi)容句柄,應(yīng)該在退出窗口函數(shù)之前釋放它(或者刪除它)。一旦釋放了句柄,它就不再有效了。對于打印機設(shè)備內(nèi)容句柄,規(guī)則就沒有這么嚴格。
最常用的取得并釋放設(shè)備內(nèi)容句柄的方法是,在處理WM_PAINT消息時,使用BeginPaint和EndPaint呼叫:
hdc = BeginPaint (hwnd, &ps) ;
其它行程序
EndPaint (hwnd, &ps) ;
變量ps是型態(tài)為PAINTSTRUCT的結(jié)構(gòu),該結(jié)構(gòu)的hdc字段是BeginPaint傳回的設(shè)備內(nèi)容句柄。 PAINTSTRUCT結(jié)構(gòu)又包含一個名為rcPaint的RECT(矩形)結(jié)構(gòu),rcPaint定義一個包圍窗口顯示區(qū)域無效范圍的矩形。使用從BeginPaint獲得的設(shè)備內(nèi)容句柄,只能在這個區(qū)域內(nèi)繪圖。BeginPaint呼叫使該區(qū)域有效。
Windows程序還可以在處理非WM_PAINT消息時取得設(shè)備內(nèi)容句柄:
hdc = GetDC (hwnd) ;
其它行程序
ReleaseDC (hwnd, hdc) ;
這個設(shè)備內(nèi)容適用于窗口句柄為hwnd的顯示區(qū)域。這些呼叫與BeginPaint和EndPaint的組合之間的基本區(qū)別是,利用從GetDC傳回的句柄可以在整個顯示區(qū)域上繪圖。當(dāng)然, GetDC和ReleaseDC不使顯示區(qū)域中任何可能的無效區(qū)域變成有效。
Windows程序還可以取得適用于整個窗口(而不僅限于窗口的顯示區(qū)域)的設(shè)備內(nèi)容句柄:
hdc = GetWindowDC (hwnd) ;
其它行程序
ReleaseDC (hwnd, hdc) ;
這個設(shè)備內(nèi)容除了顯示區(qū)域之外,還包括窗口的標題列、菜單、滾動條和框架(frame)。GetWindowDC函數(shù)很少使用,如果想嘗試用一用它,則必須攔截處理WM_NCPAINT消息,Windows使用該消息在窗口的非顯示區(qū)域上繪圖。