Что такое графический контекст?

Что ровно инкапсулируется графическим контекстом (или контекстом устройства в Windows)?

различные определения в Сети согласны с тем, что контекст инкапсулирует параметры для различных графических операций. См.: X11, Mac OS, Windows

что не ясно, является ли контекст инкапсулирует буфер памяти на котором графические операции выполненный.

в записи Х11 есть упоминание об отдельных объектах, холст, окна и изображения, которые представляют собой рисунок поверхности. Идем немного дальше, в OpenGL GLX документация, существует четкое разделение между Визуализация Контекстов и Рисунок Поверхности. Интересно также сказать, что "приложения могут отображаться на одной поверхности, используя разные контексты" и "тоже можно использовать один контекст для рендеринга на несколько поверхностей".

3 ответов


X11 GC не содержит буфер памяти, и Drawable и GC передаются во все операции рисования, и GC можно использовать со всеми "like" Drawables (drawables на том же экране с той же битовой глубиной).

однако рисование в X11 в эти дни обычно выполняется на стороне клиента с использованием библиотеки, такой как Cairo, поэтому "реальный" ответ зависит от этой библиотеки. В случае Каира контекст Каира включает текущую целевую поверхность, хотя вы можете изменить цель поверхность.

OpenGL также имеет концепцию" текущей цели", хотя снова вы можете изменить текущую цель.

Если вы хотите обобщить, я бы сказал, что концептуально контекст отделен от буфера, хотя для сохранения ввода люди могут иметь текущий буфер, который вы можете установить в контексте.


глядя конкретно на контекст устройства Windows, ответ на основной вопрос, который вы задаете, кажется, "да и нет".

контекст устройства в основном создает режим, в котором будет выполняться рисование , т. е. в любой момент времени он будет иметь текущие настройки для таких вещей, как:

  1. цвет фона
  2. цвет
  3. ширина линии
  4. линия
  5. шрифт

(и так далее для еще несколько вещей).

теперь, что касается поверхности рисования: да, я считаю, что каждый контекст устройства всегда имеет поверхность рисования, прикрепленную к нему. В общем случае контекста устройства для окна эта поверхность чертежа будет частью буфера экрана, в котором отображается окно. В случае" совместимого " контекста устройства (например, результат CreateCompatibleDC) это будет довольно бесполезная поверхность рисования-в частности, это один монохромный пиксель. Это будет установите либо черный, либо белый, в зависимости от того, превышает ли общий уровень яркости того, что вы рисуете на DC, определенный порог или нет (и нет, я не помню точный порог).

это имеет (своего рода) полезную цель, хотя: в частности, это означает, что DC всегда "годный к употреблению" -- никогда ситуация в которой чертеж к DC потерпит неудачу как раз потому что никакая прикрепленная поверхность чертежа. Как помощь в поддержании этого, нет DeselectObject функции -- вы можете использовать SelectObject выбрать другой растровый на контекст устройства (который также отменит выбор исходного), но нет способа отменить выбор одного растрового изображения из контекста устройства без выбора другого в него-так что это всегда прикреплен рисунок поверхности.

в то же время поверхность рисования по умолчанию для контекста совместимого устройства настолько близка к бесполезной, что почти считается, что у нее нет поверхности рисования вообще привязан.

Edit: я также должен добавить, что поверхность рисования по умолчанию, выбранная в контексте совместимого устройства, является источником многих проблем. В частности, когда вы создаете совместимый 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, которое обычно будет экраном, поэтому то, что вы создаете, будет иметь полный цвет вашего экрана для.


Не уверен в других платформах, но на Windows a Контекст Устройства (или DC) - это просто непрозрачный указатель. Внутренняя структура поддерживается GDI и содержит информацию о том, что материал рисуется на экране.

чтобы манипулировать рисованными объектами, вы передаете этот непрозрачный указатель (или Handle) к функциям GDI. Это то же самое в концепции, что и hwnd элемента ручки, которые управляют атрибутами окна, кроме HDC управляет графика.