First of all, you only create and set the OpenGL context ONCE when you create the window. You don not want to bind and unbind the OpenGL context every frame.
Second, you don't use glFlush() and SwapBuffers()in the same application.
If you created your window using double buffering, then you call only SwapBuffers(). If you didn't create it using double buffering, then you use glFlush().
Then, do you ever set a projection matrix in your application?
Something like:
//For 2D
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 0, width, height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//For 3D
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glluPerspective(45.0f, (float)width / height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
You have to set a projection matrix before you draw stuff.
After this you don't have to use glLoadIdentity() again, you should use glPushMatrix() and glPopMatrix() to apply transformations to the objects drawn within those calls.
Here's some things:
//You should call this every frame. Everything that is drawn MUST be called every frame
void CopenGLCoordView::drawAxes()
{
//Do NOT bind the DC every frame, this is only done once when you create the window
//CDC* pDC = GetDC(); DO NOT
//wglMakeCurrent(pDC->m_hDC, m_hrc);
//You don't need to make a glBegin() glEnd() for each line. You can call glBegin(GL_LINES) and glEnd() once
//and OpenGL knows that every glVertex3f() pairs form a line
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f); // origin of the line
glVertex3f(5.0f, 0.0f, 0.0f); // ending point of the
glVertex3f(0.0f, 0.0f, 0.0f); // origin of the line
glVertex3f(0.0f, 5.0f, 0.0f); // ending point of the
glVertex3f(0.0f, 0.0f, 0.0f); // origin of the line
glVertex3f(0.0f, 0.0f, 5.0f); // ending point of the
glEnd();
//Again, don't release the context every frame
//wglMakeCurrent(NULL,NULL);
//ReleaseDC(pDC);
}
void CopenGLCoordView::drawLine()
{
//Again, don't bind the context every frame
//CDC* pDC = GetDC();
//wglMakeCurrent(pDC->m_hDC, m_hrc);
//In a perspective matrix, this line might end up out of the screen
glBegin(GL_LINES);
glVertex3f(10,0,0);
glVertex3f(20,0,0);
glEnd();
//No unbinding context here
//wglMakeCurrent(NULL,NULL);
}
void CopenGLCoordView::DrawScene(CDC *pDC)
{
//Once again, this is a no no
//wglMakeCurrent(pDC->m_hDC, m_hrc);
//This correct, as long as you created your window with a depth buffer.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Depth testing is only used for 3D, but if you're drawing 3D, then it is correct
glEnable(GL_DEPTH_TEST);
//Here you should set you're projection matrix
//that could be
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//Substitute width & height by your window's width & height
gluPerspective(45.0f, (float)width / height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//Also, maybe you'll want to use a gluLookAt() here to set the camera's position
//If you're not familiar with this function, then you may want to look it up on Google
gluLookAt(0.0f, 5.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
//Every thing drawn within this call and the next glPopMatrix(), will not affect the modelview matrix
glPushMatrix();
//This glLoadIdentity is unnecessary
//glLoadIdentity();
//This rotations will only affect the drawAxes() call (and the Prints if it matters)
glRotatef(rot[0], 1.0f, 0.0f, 0.0f);
glRotatef(rot[1], 0.0f, 1.0f, 0.0f);
glRotatef(rot[2], 0.0f, 0.0f, 1.0f);
drawAxes();
glPrintX("X");
glPrintY("Y");
glPrintZ("Z");
glPopMatrix();
//The rotations above will NOT affect this call
drawLine();
//Again, use glFlush() if you're window does not support double buffering
glFlush();
//Or use SwapBuffers() if it does. Don't use both
SwapBuffers(pDC->m_hDC);
//Once again, do not do this here
//wglMakeCurrent(NULL, NULL);
}
Quite honestly, you don't seem to have an understanding of OpenGL. You might want to perhaps using GLUT to learn, before of jumping to Win32 and OpenGL.