home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / Examples / OpenGL / Main.cpp next >
C/C++ Source or Header  |  2004-11-11  |  4KB  |  170 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, WPARAM wParam, LPARAM lParam);
  19. VOID EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
  20. VOID DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);
  21.  
  22. // WinMain
  23.  
  24. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  25.                    LPSTR lpCmdLine, int iCmdShow)
  26. {
  27.   WNDCLASS wc;
  28.   HWND hWnd;
  29.   HDC hDC;
  30.   HGLRC hRC;    
  31.   MSG msg;
  32.   BOOL bQuit = FALSE;
  33.   float theta = 0.0f;
  34.  
  35.   // register window class
  36.   wc.style = CS_OWNDC;
  37.   wc.lpfnWndProc = WndProc;
  38.   wc.cbClsExtra = 0;
  39.   wc.cbWndExtra = 0;
  40.   wc.hInstance = hInstance;
  41.   wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
  42.   wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  43.   wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
  44.   wc.lpszMenuName = NULL;
  45.   wc.lpszClassName = "GLSample";
  46.   RegisterClass( &wc );
  47.  
  48.   // create main window
  49.   hWnd = CreateWindow( 
  50.   "GLSample", "OpenGL Sample", 
  51.   WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
  52.   0, 0, 256, 256,
  53.   NULL, NULL, hInstance, NULL);
  54.  
  55.   // enable OpenGL for the window
  56.   EnableOpenGL( hWnd, &hDC, &hRC );
  57.  
  58.   // program main loop
  59.   while (!bQuit) 
  60.     {
  61.       // check for messages
  62.       if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
  63.         {
  64.           // handle or dispatch messages
  65.           if (msg.message == WM_QUIT) 
  66.             {
  67.               bQuit = TRUE;
  68.             } 
  69.           else 
  70.             {
  71.               TranslateMessage(&msg);
  72.               DispatchMessage(&msg);
  73.             }
  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.           SwapBuffers( hDC );
  92.  
  93.           theta += 1.0f;
  94.  
  95.         }
  96.   }
  97.   // shutdown OpenGL
  98.   DisableOpenGL( hWnd, hDC, hRC );
  99.   // destroy the window explicitly
  100.   DestroyWindow( hWnd );
  101.   return msg.wParam;
  102. }
  103.  
  104. // Window Procedure
  105.  
  106. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  107. {
  108.   switch (message) 
  109.     {
  110.       case WM_CREATE:
  111.         return 0;
  112.  
  113.       case WM_CLOSE:
  114.         PostQuitMessage( 0 );
  115.         return 0;
  116.  
  117.       case WM_DESTROY:
  118.         return 0;
  119.  
  120.       case WM_KEYDOWN:
  121.         switch (wParam) 
  122.         {
  123.           case VK_ESCAPE:
  124.             PostQuitMessage( 0 );
  125.             return 0;
  126.         }
  127.         return 0;
  128.  
  129.         default:
  130.           return DefWindowProc(hWnd, message, wParam, lParam);
  131.   }
  132. }
  133.  
  134. // Enable OpenGL
  135.  
  136. VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC )
  137. {
  138.   PIXELFORMATDESCRIPTOR pfd;
  139.   int iFormat;
  140.  
  141.   // get the device context (DC)
  142.   *hDC = GetDC( hWnd );
  143.  
  144.   // set the pixel format for the DC
  145.   ZeroMemory( &pfd, sizeof( pfd ) );
  146.   pfd.nSize = sizeof( pfd );
  147.   pfd.nVersion = 1;
  148.   pfd.dwFlags = PFD_DRAW_TO_WINDOW | 
  149.   PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  150.   pfd.iPixelType = PFD_TYPE_RGBA;
  151.   pfd.cColorBits = 24;
  152.   pfd.cDepthBits = 16;
  153.   pfd.iLayerType = PFD_MAIN_PLANE;
  154.   iFormat = ChoosePixelFormat( *hDC, &pfd );
  155.   SetPixelFormat( *hDC, iFormat, &pfd );
  156.  
  157.   // create and enable the render context (RC)
  158.   *hRC = wglCreateContext( *hDC );
  159.   wglMakeCurrent( *hDC, *hRC );
  160. }
  161.  
  162. // Disable OpenGL
  163.  
  164. VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC )
  165. {
  166.   wglMakeCurrent( NULL, NULL );
  167.   wglDeleteContext( hRC );
  168.   ReleaseDC( hWnd, hDC );
  169.