OpenGL 绘图的机制是:先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的绘图上下文 Device Context (简记为 DC)。在程序运行过程中,可以有多个 DC,但只能有一个 RC,因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。
按照这个思路,
需要设置一个全局的HGLRC,例如可以在主框架OnCreate函数里
// Opengl的渲染描述表
SetMyPixelFormat(::GetDC(m_hWnd));
HGLRC h = wglCreateContext(::GetDC(m_hWnd));
theOpenglRC.SetGlrc(h);
需要在窗口的OnPaint函数中加入一句代码:
wglMakeCurrent(dc.GetSafeHdc(), theOpenglRC.GetGlrc());
Paint();
SwapBuffers(dc.GetSafeHdc());
wglMakeCurrent(dc.GetSafeHdc(), theOpenglRC.GetGlrc());
Paint();
SwapBuffers(dc.GetSafeHdc());
void CStudyOpenglWnd::Paint()
{
// 设置视口左下高度宽度
RECT rect = {0};
GetClientRect(&rect);
GLdouble glHeight = rect.bottom - rect.top;
GLdouble glWidth = rect.right - rect.left;
glViewport(0, 0, glWidth, glHeight);
// 求纵横比
m_glAspect = 1;
m_glOrthoX = 1000;
if(0 != glWidth)
m_glAspect = (GLdouble)glHeight / (GLdouble)glWidth;
// 设置为投影矩阵,并设置其左下右上。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-m_glOrthoX, m_glOrthoX,
-m_glOrthoX * m_glAspect, m_glOrthoX * m_glAspect,
-m_glOrthoX, m_glOrthoX);
// 清除
glClearColor(1.f, 1.f, 1.f, 0.0f) ;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0f, 0.0f, 0.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 旋转角度
GLdouble gldRotateAngle = 270 * 3.1415926 / 180;
// 份数
GLint glnCount = 24;
GLdouble gldMin = m_glOrthoX < m_glOrthoX * m_glAspect ? m_glOrthoX : m_glOrthoX * m_glAspect;
// 外圆
GLdouble gldRadiusOuter = gldMin / 1.25;
glBegin(GL_LINES);
for (int i=0; i<glnCount; i++)
{
GLdouble gldAngle = i * gldRotateAngle / glnCount;
GLdouble gldx = gldRadiusOuter * cos(gldAngle);
GLdouble gldy = gldRadiusOuter * sin(gldAngle);
GLdouble gldAngleNext = (i + 1) * gldRotateAngle / glnCount;
GLdouble gldxNext = gldRadiusOuter * cos(gldAngleNext);
GLdouble gldyNext = gldRadiusOuter * sin(gldAngleNext);
glVertex2d(gldx, gldy);
glVertex2d(gldxNext, gldyNext);
}
glEnd();
// 内圆
GLdouble gldRadiusInner = gldRadiusOuter / 2;
glBegin(GL_LINES);
for (int i=0; i<glnCount; i++)
{
GLdouble gldAngle = i * gldRotateAngle / glnCount;
GLdouble gldx = gldRadiusInner * cos(gldAngle);
GLdouble gldy = gldRadiusInner * sin(gldAngle);
GLdouble gldAngleNext = (i + 1) * gldRotateAngle / glnCount;
GLdouble gldxNext = gldRadiusInner * cos(gldAngleNext);
GLdouble gldyNext = gldRadiusInner * sin(gldAngleNext);
glVertex2d(gldx, gldy);
glVertex2d(gldxNext, gldyNext);
}
glEnd();
// 内外径
glBegin(GL_LINES);
for (int i=0; i<glnCount+1; i++)
{
GLdouble gldAngle = i * gldRotateAngle / glnCount;
GLdouble gldxInner = gldRadiusInner * cos(gldAngle);
GLdouble gldyInner = gldRadiusInner * sin(gldAngle);
GLdouble gldxOuter = gldRadiusOuter * cos(gldAngle);
GLdouble gldyOuter = gldRadiusOuter * sin(gldAngle);
glVertex2f(gldxInner, gldyInner);
glVertex2f(gldxOuter, gldyOuter);
}
glEnd();
glBegin(GL_LINES);
glVertex2f(0, 0);
glVertex2f(1, 1);
glEnd();
glFinish();
}