Thread: opengl and WM_PAINT

  1. #1
    Registered User
    Join Date
    Oct 2009
    Posts
    4

    opengl and WM_PAINT

    Hi,

    Im not using a game loop as it is graphics that will be used by the user selecting certain menu options ervey so often. So I dont need to constanly draw new frames.
    But this code when run acts like the wm-paint message is constanly called or somehow the opengl code is being looped. Does opengl work ok with wm_paint for you guys? I tried with peekmessage and the results are the same, if you change wm_pain to LBUTTONUP for example it works fine, except there is no initial display.
    Code:
    #include <windows.h>
    #include <gl/gl.h>
    
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    void EnableOpenGL(HWND hWnd, HDC *hDC, HGLRC *hRC);
    void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);
    
    HINSTANCE hInst;
    
    int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nWinMode)
    {
    	WNDCLASS wc;
    	HWND hWnd;
    	MSG msg;
    	int quit = 1;
    	
    	hInst = hThisInst;
    	
    	// register window class
    	wc.style = CS_OWNDC;
    	wc.lpfnWndProc = WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hInst;
    	wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    	wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    	wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
    	wc.lpszMenuName = NULL;
    	wc.lpszClassName = "GLSample";
    	RegisterClass( &wc );
    	
    	// create main window
    	hWnd = CreateWindow( "GLSample", 
    		                 "OpenGL Sample", 
    		                 WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
    		                 0, 0, 800, 600,
    		                 NULL, NULL, hInst, NULL );
    	
    	ShowWindow( hWnd, nWinMode );
    	UpdateWindow( hWnd );
    
    	while( GetMessage( &msg, NULL, 0, 0 ) )
    	{
    		TranslateMessage( &msg );
    		DispatchMessage( &msg );
    	}
    	
    	return msg.wParam;
    }
    	
    // Window Procedure
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HDC hDC;
    	static HGLRC hRC;
    	static int flag = 1;
    
    	switch (message)
    	{	
    		case WM_CREATE:  EnableOpenGL( hWnd, &hDC, &hRC );
    			                        return 0;
    		case WM_PAINT :  // OpenGL animation code goes here	  
    						 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    			                         glClear( GL_COLOR_BUFFER_BIT );
    						 if( flag )
    						 {
    							glBegin( GL_TRIANGLES );
    							glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );
    							glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );
    							glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );
    							glEnd();
    							flag = 0;
    						 }
    						 else
    						 {
                                                            glBegin( GL_TRIANGLES );
    							glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( 0.0f, 1.0f );
    							glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );
    							glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( -0.87f, -0.5f );
    							glEnd();
    							flag = 1;
    						 }
    			                         SwapBuffers( hDC );	
    					         return 0;
    		case WM_DESTROY: DisableOpenGL( hWnd, hDC, hRC );
    		                 PostQuitMessage(0);
    		                 return 0;
    		default:         return DefWindowProc( hWnd, message, wParam, lParam );
    			
    	}
    	return 0;
    }
    
    // Enable OpenGL
    void EnableOpenGL(HWND hWnd, HDC *hDC, HGLRC *hRC)
    {
    	PIXELFORMATDESCRIPTOR pfd;
    	int format;
    	
    	// get the device context (DC)
    	*hDC = GetDC( hWnd );
    	
    	// set the pixel format for the DC
    	ZeroMemory( &pfd, sizeof( pfd ) );
    	pfd.nSize = sizeof( pfd );
    	pfd.nVersion = 1;
    	pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    	pfd.iPixelType = PFD_TYPE_RGBA;
    	pfd.cColorBits = 24;
    	pfd.cDepthBits = 16;
    	pfd.iLayerType = PFD_MAIN_PLANE;
    	format = ChoosePixelFormat( *hDC, &pfd );
    	SetPixelFormat( *hDC, format, &pfd );
    	
    	// create and enable the render context (RC)
    	*hRC = wglCreateContext( *hDC );
    	wglMakeCurrent( *hDC, *hRC );
    	
    }
    
    // Disable OpenGL
    void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)
    {
    	wglMakeCurrent( NULL, NULL );
    	wglDeleteContext( hRC );
    	ReleaseDC( hWnd, hDC );
    }

  2. #2
    Registered User
    Join Date
    Oct 2009
    Posts
    4
    Ok my bad, all it needs is a call to validaterect(),
    when you use a hdc with getdc its not validated so windows spams you with wm_paint messages, validaterect lets windows kmow you dealt with it and stops the spamming.

Popular pages Recent additions subscribe to a feed