I wish to use GL functions outside of WM_PAINT message. For example, pick of mouse
button and on WM_LBUTTONDOWN draw something on the screen immediately (Under WinAPI GetDC -> drawing routines -> ReleaseDC). I have placed this question in a beginners forum, but i did’t get a helpful tip.
I am an Windows programmer with 10 years of expirience and i know a lot of rules and restrictions of this enviroment. Due to last days i will solve this “problem” and all “ideas” from the members of this board DO NOT WORK. Can NE1 explain me, for example, how i can realize a changable rectangle for a zooming inside of window. In Windows GDI - no problem, but in OpenGL - no way ? All examples, that i found use redraw of scene in WM_PAINT message (OpenGL Bible, rotation around different axes and so on). It is possible to collect all calls to GL functions outside of WM_PAINT, but a drawing event will be active on WM_PAINT. That means for any minor change of a scene i need process all GL calls !
Please help or point to link where i can get a help. Thx.
The GDI style of redrawing invalidated sub-areas of a window isn’t really appropriate here. A more suitable way of doing things is:
Do GetDC() and wglCreateContext() at startup and hang on to the DC + GLRC for the lifetime of your app. Ignore the DC you get from the WM_PAINT message.
If any portion of the rendering window needs redrawing, redraw the whole thing and call SwapBuffers to display it.
The reason for (2) is double-buffering. You need to call SwapBuffers to display what you’ve drawn, but that leaves you with a backbuffer with undefined contents, so you can’t reuse what you just drew. There’s no way of page-flipping a sub-region of a window, so to update any portion of the screen you must redraw everything.
What do you mean by a ‘changable rectangle’? If you mean a resizable window, just call glViewport whenever the window dimensions change and it should just work.
Take a look at the following code. This issues openGL instructions(could be drawing instructions). m_pCDC is a member of the view that points to the DC. First it is made current, then drawing instructions are issued and finally it is released. This particlar function will cause a WM_PAINT message to happen anyway but if this is not the case then you need to ask for one by calling:
InvalidateRect(NULL,FALSE) is order to refresh the screen
and BTW, dont forget to have a glFlush() at the end of your drawing code.
this kind of code could easily be put in a mouse event handler with GL instructions to draw stuff.
void CBaseOpenGLMDIView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// Use the rendering context do draw onto the view
wglMakeCurrent(m_pCDC->GetSafeHdc(), m_hGLContext);
// Set up the viewport
GLsizei w,h;
w = cx;
h = cy;
SetupViewport(w,h);
// Give a clean surface ready to render.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDrawBuffer(GL_BACK);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
// Release thr rendering context
wglMakeCurrent(NULL,NULL);