2010-05-06 94 views
7

作爲MFC的一個相對新手,我看到很多設備上下文(DC)。我隱約明白,這是與繪圖有關的事情,但具體細節沒有很好解釋,我可以找到任何地方。創建「兼容設備上下文」是什麼意思,爲什麼它很重要? SelectObject是做什麼的,我怎樣才能首先使DC兼容?瞭解設備上下文

回答

11

設備上下文只是繪圖發生的地方,所以如果你有兩個不同的DC,你在兩個不同的地方繪圖。有點像文件句柄。

設備上下文可以指屏幕上的房地產,或位於內存中的位圖,也可能是其他地方,這些只是我現在可以想到的兩個。

兼容上下文是指具有相同底層像素組織的數據,其中每個像素的位數,每個像素的字節數,顏色組織等等。內存位圖設備上下文可以有你想要的任何組織,但是你的屏幕上下文將與你的顯卡上的緩衝區相關(最終),這將取決於模式等,具有特定的像素組織。

兼容的上下文意味着它有效地在它們之間傳輸圖像數據,因爲很少或不需要翻譯數據。另一方面,如果你有一個256色的調色板,8位的地圖,並且你試圖把它移動到每個像素RGBA有8位的屏幕上,那麼每個最後一個像素都需要大量的按摩,因爲它被複制,所以複製不兼容位圖速度非常慢。根據Win32 SDK文檔,至少BitBlt()和StretchBlt()「將源顏色格式轉換爲匹配目標格式」,因此可以完成。

調查CreateCompatibleDC()和CreateCompatibleBitmap()作爲如何創建與現有兼容的繪圖上下文的起點。

SelectObject()控制哪些資源當前在設備上下文中處於活動狀態。上下文有當前筆,畫筆,字體和位圖。通過允許您指定更少的參數,這些使得很多其他GDI調用變得更簡單。例如,當你使用TextOut()時,你不必指定字體,但是如果你想改變字體,那就是SelectObject()進來的地方。如果你給SelectObject()提供一個字體句柄,返回值是有效字體的句柄,並且後續操作使用新字體。其他種類的資源,筆,筆刷等的行爲是相同的。

+0

謝謝!關於這個的一些後續問題,那麼:你可以使用不兼容的DC,並且仍然有一個工作程序(雖然慢得多)? SelectObject進入設備上下文兼容性的概念? – Smashery 2010-05-06 01:43:45

+0

@Smashery:編輯了一下,以更好地解決這些問題。 – JustJeff 2010-05-06 02:01:25

+0

謝謝 - 一個非常明確和有用的答案! – Smashery 2010-05-06 05:40:58