2011-07-25 94 views
8

什麼正好是由圖形上下文(或Windows中的設備上下文)封裝?圖形上下文究竟是什麼?

網絡上的各種定義同意上下文封裝各種圖形操作的參數。請參閱:X11Mac OSWindows

什麼是不明確的是上下文是否也封裝在其上的圖形運算的執行內存緩衝區

在X11條目中提到了代表繪圖表面的獨立可繪製對象,窗口和像素圖。再進一步,在OpenGL GLX文檔中,渲染上下文繪圖表面之間有明確的分隔。有趣的是,也可以說「應用程序可以使用不同的上下文渲染到相同的表面」和「」也可以使用單個上下文渲染到多個表面「」。

+3

你爲什麼假設所有這些不同的API都意味着「上下文」完全相同的東西? ;) – jalf

+1

內存緩衝區不一定要以(想象筆繪圖儀)開頭。 –

回答

3

X11 GC不包含內存緩衝區,Drawable和GC都被傳遞到所有的繪圖操作,並且GC可以與所有「喜歡的」Drawable一起使用(可在同一屏幕上使用相同位深度)。

但是在X11這些天拉伸利用圖書館,如開羅,通常在客戶端完成,所以「真正的」答案取決於該庫。在開羅的情況下,開羅背景確實包括了目前的目標表面,儘管你可以改變目標表面。

的OpenGL也有一個「當前目標」樣的概念,雖然你可以再次改變當前目標。

如果你想推廣我想說,從概念上講,上下文是從緩存分開的,雖然節省打字的人可能有一個當前的緩衝區,你可以在上下文中設置。

1

不確定其他平臺,但在Windows上設備上下文(或DC)只是一個不透明的指針。內部結構由GDI維護幷包含有關正在屏幕上繪製的東西的信息。

要操縱正在繪製的對象,請將此不透明指針(或句柄)傳遞給GDI函數。這與概念相同,HWND句柄管理窗口的屬性,但HDC管理圖形。

4

特別注意Windows設備環境,對於您所問的主要問題的答案似乎是「是且否」。

關聯設備基本上建立在圖紙會做的模式 - 即,在任何給定的時間,這將有喜歡的事情的當前設置:

  1. 背景顏色
  2. 前景色
  3. 線寬
  4. 線圖案
  5. 字體

(等等等等)。

現在,只要有繪圖表面:是的,我相信每個設備上下文總是附着一個繪圖表面。在窗口的設備上下文的常見情況下,該繪圖表面將成爲顯示窗口的屏幕緩衝區的一部分。在「兼容」設備上下文(例如,來自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中選定的位圖兼容的位圖,通常這將是屏幕,因此您創建的屏幕將設置爲全綵色。

+0

謝謝,這非常精心!不過,我必須把它交給浩劫,因爲它更重要。 – Dimitris