wglMakeCurrent

功能
使一个指定的OpenGL渲染上下文调用线程的当前呈现上下文 。所有后续的OpenGL调用线程所确定的设备 HDC上绘制 。您还可以使用wglMakeCurrent改变,所以旧的上下文将不再是当前调用线程的当前呈现的上下文 。
函数原型
BOOL wglMakeCurrent( HDC hdc, HGLRC hglrc);
参数
HDC
一个 设备上下文句柄。其后的OpenGL调用由调用线程所确定的设备HDC上绘制。
hglrc
OpenGL渲染上下文的功能设置为调用线程的渲染上下文的句柄。
如果hglrc为NULL,函数使调用线程的当前呈现上下文不再是当前,并释放设备当前使用的上下文。在这种情况下,HDC被忽略。
返回值
当wglMakeCurrent函数成功,返回值是TRUE,否则返回值是FALSE。为了获得更多的 错误信息,请调用GetLastError函数。
备注
hdc 参数必须指向一个支持OpenGL的绘图表面 。它不需要和 wglCreateContext 创建时的HDC相同,但它必须是在同一设备上,具有相同的 像素格式。GDI函数和裁剪HDC不被渲染上下文支持。当前渲染上下文中使用 HDC 设备上下文,直到不再是当前的渲染上下文。
在切换到新的渲染上下文前,OpenGL将刷新当前 线程使用的上下文。一个 线程只可以有一个当前呈现的上下文。一个进程可以有多个渲染背景下,通过 多线程方式实现。一个线程调用任何OpenGL函数之前必须设置当前渲染上下文。否则,所有的OpenGL调用将被忽略。在同一时间只有一个 线程可以渲染上下文。你不能让一个多线程同时渲染一个上下文。应用程序可以执行不同的渲染上下文,目前不同的 线程,每个线程提供自己的渲染上下文和 设备上下文的多线程绘图。
如果出现错误,使得之前当前线程在返回前不会渲染上下文。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GLfloat initX = 0, initY = 0; GLfloat oldx = 0, oldy = 0; int times = 0; bool gDrawline = false; void drawkoch(GLfloat dir, GLfloat len, GLint iter) { ​GLdouble dirRad = dir * 3.1415926 / 180.f; ​GLfloat newX = oldx + len * cos(dirRad); ​GLfloat newY = oldy + len * sin(dirRad); ​if (iter == 0) { ​​glVertex2f(oldx, oldy); ​​glVertex2f(newX, newY); ​​oldx = newX; ​​oldy = newY; ​} ​else { ​​iter--; ​​len = len / 3; ​​drawkoch(dir, len, iter); ​​dir += 60; ​​drawkoch(dir, len, iter); ​​dir -= 120; ​​drawkoch(dir, len, iter); ​​dir += 60; ​​drawkoch(dir, len, iter); ​} } typedef GLfloat point2d[2]; int iter = 0; float snowAngle = 0; point2d p = { 960, 20 }; point2d anyline[2]; point2d pp; void CMFCGLSetupView::OnDraw(CDC* pDC) { ​CMFCGLSetupDoc* pDoc = GetDocument(); ​ASSERT_VALID(pDoc); ​if (!pDoc) ​​return; ​// TODO: add draw code for native data here ​wglMakeCurrent(pDC->m_hDC, m_hRC); ​oldx = initX; ​oldy = initY; ​glClearColor(0.0f, 0.0f, 0.0f, 0.0f); ​glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ​glMatrixMode(GL_PROJECTION); ​glLoadIdentity(); ​glOrtho(0, Cx, 0, Cy, -1000, 1000); ​switch (drawMode) { ​case 0: ​​glTranslatef(400, 450, 0); ​​glBegin(GL_LINES); ​​glColor3f(0.0, 1.0, 0.0); ​​drawkoch(0, 500, iter); ​​glEnd(); ​​break; ​case 1: ​​glTranslatef(400, 450, 0); ​​glPushMatrix(); ​​glTranslated(250, -125 * sqrt(3), 0); ​​glRotated(snowAngle, 0, 1, 0); ​​glTranslated(-250, 125 * sqrt(3), 0); ​​glBegin(GL_LINES); ​​glColor3f(0.0, 1.0, 0.0); ​​drawkoch(0, 500, iter); ​​drawkoch(-120, 500, iter); ​​drawkoch(-240, 500, iter); ​​glEnd(); ​​glPopMatrix(); ​​break; ​case 2: ​​if (gDrawline) { ​​​oldx = anyline[0][0]; ​​​oldy = anyline[0][1]; ​​​point2d v; ​​​v[0] = (anyline[1][0] - anyline[0][0]); ​​​v[1] = (anyline[1][1] - anyline[0][1]); ​​​float len = sqrt(v[0] * v[0] + v[1] * v[1]); ​​​v[0] /= len; ​​​v[1] /= len; ​​​point2d n = { 1, 0 }; ​​​float cosTheta = v[0] * n[0] + v[1] * n[1]; ​​​float angle = acos(cosTheta) * 180.f / PI; ​​​if (anyline[1][1] < anyline[0][1]) { ​​​​angle = -angle; ​​​} ​​​glBegin(GL_LINES); ​​​drawkoch(angle, len, iter); ​​​glEnd(); ​​} ​​break; ​default: break; ​} ​glBegin(GL_POINTS); ​glVertex2f(pp[0], pp[1]); ​glEnd(); ​glFlush(); ​wglMakeCurrent(pDC->m_hDC, NULL); }
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值