C Board  

Go Back   C Board > General Programming Boards > Game Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 10-19-2009, 11:51 AM   #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 );
}
Kosei Inoue is offline   Reply With Quote
Old 10-20-2009, 10:33 AM   #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.
Kosei Inoue is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump


All times are GMT -6. The time now is 06:05 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22