Поделиться через


Функции контекста отрисовки

Пять функций WPL управляют контекстами отрисовки, как описано в следующей таблице.

Функция WGL Description
wglCreateContext Создает новый контекст отрисовки.
wglMakeCurrent Задает текущий контекст отрисовки потока.
wglGetCurrentContext Получает дескриптор текущего контекста отрисовки потока.
wglGetCurrentDC Получает дескриптор контекста устройства, связанного с текущим контекстом отрисовки потока.
wglDeleteContext Удаляет контекст отрисовки.

 

Функция wglCreateContext принимает дескриптор контекста устройства в качестве параметра и возвращает дескриптор контекста отрисовки. Созданный контекст отрисовки подходит для рисования на устройстве, на которое ссылается дескриптор контекста устройства. В частности, его формат пикселей совпадает с форматом пикселя контекста устройства. После создания контекста отрисовки можно освободить или удалить контекст устройства. Дополнительные сведения о создании, освобождении и удалении контекста устройства см . в контекстах устройств.

Примечание.

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

 

Функция wglMakeCurrent принимает дескриптор контекста отрисовки и дескриптор контекста устройства в качестве параметров. Все последующие вызовы OpenGL, сделанные потоком, выполняются с помощью этого контекста отрисовки и рисуются на устройстве, на которое ссылается этот контекст устройства. Контекст устройства не должен совпадать с тем же, который передается в wglCreateContext при создании контекста отрисовки, но он должен находиться на одном устройстве и иметь тот же формат пикселей. Вызов wglMakeCurrent создает связь между заданным контекстом отрисовки и контекстом устройства. Вы не можете освободить или удалить контекст устройства, связанный с текущим контекстом отрисовки, до тех пор, пока контекст отрисовки не является текущим.

После того как поток имеет текущий контекст отрисовки, он может вызывать графические вызовы OpenGL. Все вызовы должны проходить через контекст отрисовки. Ничего не происходит, если вы выполняете вызовы графики OpenGL из потока, который не имеет текущего контекста отрисовки.

Функция wglGetCurrentContext не принимает параметров и возвращает дескриптор текущего контекста отрисовки вызывающего потока. Если поток не имеет текущего контекста отрисовки, возвращаемое значение равно NULL.

При получении дескриптора к контексту устройства, связанному с текущим контекстом отрисовки потока путем вызова wglGetCurrentDC, связь создается при текущем контексте отрисовки.

Связь между текущим контекстом отрисовки и потоком можно разбить, вызвав wglMakeCurrent с двумя дескрипторами:

  • Дескриптор контекста отрисовки NULL
  • Дескриптор, отличный от первоначально вызываемого

После вызова wglMakeCurrent с параметром дескриптора контекста отрисовки, заданным значение NULL, вызывающий поток не имеет текущего контекста отрисовки. Контекст отрисовки освобождается от подключения к потоку, а связь контекста отрисовки с контекстом устройства заканчивается. OpenGL очищает все команды рисования и может освободить некоторые ресурсы. Рисование OpenGL не будет выполнено до следующего вызова wglMakeCurrent, так как поток не может вызывать графические вызовы OpenGL, пока не восстановит текущий контекст отрисовки.

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

Функция wglDeleteContext принимает один параметр, дескриптор контекста отрисовки, который необходимо удалить. Перед вызовом wglDeleteContext сделайте контекст отрисовки не текущим путем вызова wglMakeCurrent и удаления или освобождения связанного контекста устройства, вызвав DeleteDC или ReleaseDC соответствующим образом.

Это ошибка для потока для удаления контекста отрисовки, который является текущим контекстом отрисовки другого потока. Тем не менее, если контекст отрисовки является текущим контекстом отрисовки вызывающего потока, wglDeleteContext очищает все команды рисования OpenGL и делает контекст отрисовки не текущим перед удалением. В этом случае, опираясь на wglDeleteContext , чтобы сделать контекст отрисовки не текущим, требуется программисту удалить или освободить связанный контекст устройства.