呈现上下文函数
五个 WGL 函数将管理呈现上下文,如下表所述。
WGL 函数 | 说明 |
---|---|
wglCreateContext | 创建新的呈现上下文。 |
wglMakeCurrent | 设置线程的当前呈现上下文。 |
wglGetCurrentContext | 获取线程的当前呈现上下文的句柄。 |
wglGetCurrentDC | 获取与线程的当前呈现上下文关联的设备上下文句柄。 |
wglDeleteContext | 删除呈现上下文。 |
wglCreateContext 函数采用设备上下文句柄作为其参数,并返回呈现上下文句柄。 创建的呈现上下文适用于在设备上下文句柄引用的设备上进行绘制。 具体而言,其像素格式与设备上下文的像素格式相同。 创建呈现上下文后,可以释放或处置设备上下文。 有关创建、获取、释放和处置设备上下文的更多详细信息,请参阅设备上下文。
注意
发送到 wglCreateContext 的设备上下文必须是显示设备上下文、内存设备上下文或每像素使用四个或更多个位的彩色打印机设备上下文。 设备上下文不能是单色打印机设备上下文。
wglMakeCurrent 函数采用呈现上下文句柄和设备上下文句柄作为参数。 系统通过该呈现上下文来进行线程所进行的所有后续 OpenGL 调用,并在该设备上下文引用的设备上绘制这些调用。 创建呈现上下文后,设备上下文不必是传递给 wglCreateContext 的上下文,但它必须位于同一设备上并且具有相同的像素格式。 对 wglMakeCurrent 的调用会在提供的呈现上下文和设备上下文之间创建关联。 在将呈现上下文设为非当前上下文之前,您无法释放或处置与当前呈现上下文关联的设备上下文。
线程具有当前呈现上下文后,即可进行 OpenGL 图形调用。 所有调用都必须通过呈现上下文进行传递。 如果从缺少当前呈现上下文的线程进行 OpenGL 图形调用,则不会发生任何操作。
wglGetCurrentContext 函数不采用任何参数,并且会返回调用线程的当前呈现上下文的句柄。 如果线程没有当前呈现上下文,则返回值为 NULL。
如果通过调用 wglGetCurrentDC 来获取与线程当前呈现上下文关联的设备上下文的句柄,则在将呈现上下文设为当前上下文时会创建关联。
可以通过使用以下两个句柄之一调用 wglMakeCurrent 来中断当前呈现上下文与线程之间的关联:
- null 呈现上下文句柄
- 最初调用的句柄以外的其他句柄
调用 wglMakeCurrent 并将呈现上下文句柄参数设置为 NULL 后,调用线程将没有当前呈现上下文。 呈现上下文将从与线程的连接中释放,并且呈现上下文与设备上下文的关联结束。 OpenGL 刷新所有绘制命令,并可能释放某些资源。 在下次调用 wglMakeCurrent 之前,不会执行 OpenGL 绘制,因为线程在重新获得当前呈现上下文之前无法进行 OpenGL 图形调用。
中断呈现上下文与线程之间的关联的第二种方法是使用其他呈现上下文调用 wglMakeCurrent。 在进行此类调用后,调用线程具有新的当前呈现上下文,以前的当前呈现上下文从与线程的连接中释放,并且以前的当前呈现上下文与设备上下文之间的关联将结束。
wglDeleteContext 函数采用单个参数,即要删除的呈现上下文的句柄。 在调用 wglDeleteContext 之前,请通过调用 wglMakeCurrent 将呈现上下文设为非当前上下文,并根据需要调用 DeleteDC 或 ReleaseDC 来删除或释放关联的设备上下文。
如果线程删除的呈现上下文是另一个线程的当前呈现上下文,那么这是一个错误。 但是,如果呈现上下文是调用线程的当前呈现上下文,那么 wglDeleteContext 会刷新所有 OpenGL 绘制命令并将呈现上下文设为非当前上下文,然后再删除它。 在这种情况下,如果要依靠 wglDeleteContext 将呈现上下文设为非当前上下文,那么程序员需要删除或释放关联的设备上下文。