特別注意Windows設備環境,對於您所問的主要問題的答案似乎是「是且否」。
關聯設備基本上建立在圖紙會做的模式 - 即,在任何給定的時間,這將有喜歡的事情的當前設置:
- 背景顏色
- 前景色
- 線寬
- 線圖案
- 字體
(等等等等)。
現在,只要有繪圖表面:是的,我相信每個設備上下文總是附着一個繪圖表面。在窗口的設備上下文的常見情況下,該繪圖表面將成爲顯示窗口的屏幕緩衝區的一部分。在「兼容」設備上下文(例如,來自CreateCompatibleDC的結果)的情況下,它將是一個相當無用的繪圖表面 - 具體而言,它是單個單色像素。它會被設置爲黑色或白色,具體取決於您繪製到DC的總體亮度級別是否超過某個閾值(否則,我不記得確切的閾值)。
這確實有一個(有點)有用的目的,但特別是,這意味着一個DC是總是「可用」 - 從來沒有的情況下,繪製到DC將失敗,只是因爲沒有繪圖表面附着。作爲維護的一種幫助,沒有DeselectObject
函數 - 您可以使用SelectObject
來選擇不同的位圖到設備上下文(它也會選擇原始的上下文),但是沒有辦法從設備上下文中取消選擇一個位圖選擇另一個 - 所以它總是有附加的繪圖表面。
與此同時,缺省繪圖表面兼容的設備上下文是如此接近無用,它幾乎計爲不具有附接在所有的圖面。
編輯:我還要補充一點,即選中後到兼容的設備上下文的默認繪圖面是相當多的問題的根源。特別是,當你創建一個兼容的DC做雙緩衝繪圖,你必須做這樣的事情:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(WindowDC, sizeX, sizeY);
SelectObject(memDC, bmp);
但是,如果你搞砸了非常輕微,做這個:
DC memDC = CreateCompatibleDC(windowDC);
BITMAP bmp = CreateCompatibleBitmap(memDC, sizeX, sizeY);
SelectObject(memDC, bmp);
...一切都將取得成功,並在一定程度上都會連工作 - 除非你通過兼容的DC畫,一切都將在黑白結束。這可以追溯到一個像素的單色位圖。由於默認情況下兼容的DC有單色位圖,所以當您要求兼容的位圖時,您將獲得指定尺寸的單色位圖。在第一個版本中,您要求與原始DC中選定的位圖兼容的位圖,通常這將是屏幕,因此您創建的屏幕將設置爲全綵色。
你爲什麼假設所有這些不同的API都意味着「上下文」完全相同的東西? ;) – jalf
內存緩衝區不一定要以(想象筆繪圖儀)開頭。 –