私人顯示裝置內容
私人裝置內容 可讓應用程式避免每次應用程式必須在視窗中繪製時擷取和初始化顯示裝置內容。 私人裝置內容對於需要對裝置內容屬性值進行許多變更以準備繪製的視窗很有用。 私人裝置內容可縮短準備裝置內容所需的時間,因此在視窗中執行繪圖所需的時間。
應用程式會指示系統在視窗類別中指定CS_OWNDC樣式,以建立視窗的私人裝置內容。 系統每次建立屬於 類別的新視窗時,都會建立唯一的私人裝置內容。 一開始,私人裝置內容的屬性具有與一般裝置內容相同的預設值,但應用程式可以隨時修改這些屬性。 系統會保留視窗生命週期的裝置內容變更,或直到應用程式進行其他變更為止。
應用程式可以在建立窗口之後,隨時使用 GetDC 函式來擷取私人裝置內容的句柄。 應用程式只能擷取句柄一次。 之後,它可以保留並使用句柄的次數。 由於私人裝置內容不是顯示裝置內容快取的一部分,因此應用程式永遠不會使用 ReleaseDC 函式來釋放裝置內容。
系統會自動調整裝置內容,以反映視窗的變更,例如移動或重設大小。 這可確保任何重疊的視窗一律會正確裁剪;也就是說,應用程式不需要採取任何動作,以確保裁剪。 不過,系統不會修改裝置內容以包含更新區域。 因此,處理 WM_PAINT 訊息時,應用程式必須藉由呼叫 BeginPaint,或藉由擷取更新區域並與目前的裁剪區域交集,來併入更新區域。 如果應用程式未呼叫 BeginPaint,則必須使用 ValidateRect 或 ValidateRgn 函式來明確驗證更新區域。 如果應用程式未驗證更新區域,視窗會收到一系列無休止的 WM_PAINT 訊息。
因為如果視窗顯示插入號,BeginPaint 隱藏插入號,所以呼叫 beginPaint 的應用程式也應該呼叫 EndPaint 函式來還原插入號。 EndPaint 對私人裝置內容沒有其他影響。
雖然私人裝置內容方便使用,但在系統資源方面,需要800個以上的位元組才能儲存記憶體。 當效能考慮超過記憶體成本時,建議使用私人裝置內容。
系統會在將 WM_ERASEBKGND 訊息傳送至應用程式時,包含私人裝置內容。 當應用程式或系統處理這些訊息時,私人裝置內容的目前選取專案,包括對應模式,都會生效。 為了避免不想要的效果,系統會在清除背景時使用邏輯座標;例如,它會使用 GetClipBox 函式來擷取區域的邏輯座標,以清除並將這些座標傳遞至 FillRect 函式。 處理這些訊息的應用程式可以使用類似的技術。
應用程式可以使用 GetDCEx 函式,強制系統傳回具有私人裝置內容之視窗的通用裝置內容。 這適用於執行視窗的快速觸控,而不需變更私人裝置內容屬性的目前值。