home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 November / PCWorld_2000-11_cd.bin / Software / Topware / devc40 / _SETUP.6 / Group19 / Main.cpp next >
C/C++ Source or Header  |  2000-03-01  |  4KB  |  184 lines

  1. /*
  2.    Name: GLSAMPLE
  3.    Author: Blaine Hodge
  4.    Description: OpenGL sample. Read the file Include\Gl\ReadMe.txt
  5.                 for informations on using OpenGL.
  6.    Date: -
  7.    Copyright: Public domain
  8. */
  9.  
  10. // Includes
  11.  
  12. #include <windows.h>
  13. #include <gl/gl.h>
  14.  
  15. // Function Declarations
  16.  
  17. LRESULT CALLBACK 
  18. WndProc( HWND hWnd, UINT message,
  19. WPARAM wParam, LPARAM lParam );
  20. VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC );
  21. VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC );
  22.  
  23. // WinMain
  24.  
  25. int WINAPI 
  26. WinMain( HINSTANCE hInstance,
  27. HINSTANCE hPrevInstance,
  28. LPSTR lpCmdLine,
  29. int iCmdShow )
  30. {
  31. WNDCLASS wc;
  32. HWND hWnd;
  33. HDC hDC;
  34. HGLRC hRC;
  35. MSG msg;
  36. BOOL bQuit = FALSE;
  37. float theta = 0.0f;
  38.  
  39. // register window class
  40. wc.style = CS_OWNDC;
  41. wc.lpfnWndProc = WndProc;
  42. wc.cbClsExtra = 0;
  43. wc.cbWndExtra = 0;
  44. wc.hInstance = hInstance;
  45. wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
  46. wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  47. wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
  48. wc.lpszMenuName = NULL;
  49. wc.lpszClassName = "GLSample";
  50. RegisterClass( &wc );
  51.  
  52. // create main window
  53. hWnd = CreateWindow( 
  54. "GLSample", "OpenGL Sample", 
  55. WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
  56. 0, 0, 256, 256,
  57. NULL, NULL, hInstance, NULL );
  58.  
  59. // enable OpenGL for the window
  60. EnableOpenGL( hWnd, &hDC, &hRC );
  61.  
  62. // program main loop
  63. while ( !bQuit ) {
  64.  
  65. // check for messages
  66. if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
  67.  
  68. // handle or dispatch messages
  69. if ( msg.message == WM_QUIT ) {
  70. bQuit = TRUE;
  71. } else {
  72. TranslateMessage( &msg );
  73. DispatchMessage( &msg );
  74. }
  75.  
  76. } else {
  77.  
  78. // OpenGL animation code goes here
  79.  
  80. glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
  81. glClear( GL_COLOR_BUFFER_BIT );
  82.  
  83. glPushMatrix();
  84. glRotatef( theta, 0.0f, 0.0f, 1.0f );
  85. glBegin( GL_TRIANGLES );
  86. glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );
  87. glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );
  88. glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );
  89. glEnd();
  90. glPopMatrix();
  91.  
  92. SwapBuffers( hDC );
  93.  
  94. theta += 1.0f;
  95.  
  96. }
  97.  
  98. }
  99.  
  100. // shutdown OpenGL
  101. DisableOpenGL( hWnd, hDC, hRC );
  102.  
  103. // destroy the window explicitly
  104. DestroyWindow( hWnd );
  105.  
  106. return msg.wParam;
  107.  
  108. }
  109.  
  110. // Window Procedure
  111.  
  112. LRESULT CALLBACK 
  113. WndProc( HWND hWnd, UINT message,
  114. WPARAM wParam, LPARAM lParam )
  115. {
  116.  
  117. switch ( message ) {
  118.  
  119. case WM_CREATE:
  120. return 0;
  121.  
  122. case WM_CLOSE:
  123. PostQuitMessage( 0 );
  124. return 0;
  125.  
  126. case WM_DESTROY:
  127. return 0;
  128.  
  129. case WM_KEYDOWN:
  130. switch ( wParam ) {
  131.  
  132. case VK_ESCAPE:
  133. PostQuitMessage( 0 );
  134. return 0;
  135.  
  136. }
  137. return 0;
  138.  
  139. default:
  140. return DefWindowProc( hWnd, 
  141. message, wParam, lParam );
  142.  
  143. }
  144.  
  145. }
  146.  
  147. // Enable OpenGL
  148.  
  149. VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC )
  150. {
  151. PIXELFORMATDESCRIPTOR pfd;
  152. int iFormat;
  153.  
  154. // get the device context (DC)
  155. *hDC = GetDC( hWnd );
  156.  
  157. // set the pixel format for the DC
  158. ZeroMemory( &pfd, sizeof( pfd ) );
  159. pfd.nSize = sizeof( pfd );
  160. pfd.nVersion = 1;
  161. pfd.dwFlags = PFD_DRAW_TO_WINDOW | 
  162. PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  163. pfd.iPixelType = PFD_TYPE_RGBA;
  164. pfd.cColorBits = 24;
  165. pfd.cDepthBits = 16;
  166. pfd.iLayerType = PFD_MAIN_PLANE;
  167. iFormat = ChoosePixelFormat( *hDC, &pfd );
  168. SetPixelFormat( *hDC, iFormat, &pfd );
  169.  
  170. // create and enable the render context (RC)
  171. *hRC = wglCreateContext( *hDC );
  172. wglMakeCurrent( *hDC, *hRC );
  173.  
  174. }
  175.  
  176. // Disable OpenGL
  177.  
  178. VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC )
  179. {
  180. wglMakeCurrent( NULL, NULL );
  181. wglDeleteContext( hRC );
  182. ReleaseDC( hWnd, hDC );
  183.