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