Main.cpp
上传用户:sz83729876
上传日期:2013-03-07
资源大小:4140k
文件大小:10k
源码类别:

OpenGL

开发平台:

Windows_Unix

  1. //***********************************************************************//
  2. //  //
  3. // - "Talk to me like I'm a 3 year old!" Programming Lessons -  //
  4. //                                                                       //
  5. // $Author: Ben Humphrey digiben@gametutorilas.com  //
  6. //  //
  7. // $Program: Triangle  //
  8. //  //
  9. // $Description: Init OpenGL and Draw a triangle to the screen  //
  10. //  //
  11. // $Date: 3/3/01  //
  12. //  //
  13. //***********************************************************************//
  14. #include "main.h"
  15. #include "core.h"
  16. HWND  g_hWnd; // This is the handle for the window
  17. RECT  g_rRect; // This holds the window dimensions
  18. HDC   g_hDC; // General HDC - (handle to device context)
  19. HGLRC g_hRC; // General OpenGL_DC - Our Rendering Context for OpenGL
  20. HINSTANCE g_hInstance; // This holds the global hInstance for UnregisterClass() in DeInit()
  21. BOOL g_keys[256];
  22. UINT ScreenWidth=800;
  23. UINT ScreenHeight=600;
  24. UINT ScreenDeph=16;
  25. int fst=0;
  26. // The window proc which handles all of window's messages.
  27. LRESULT CALLBACK wmWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  28. ///////////////////////////////// CHANGE TO FULL SCREEN \\\\\\\\\\\\\\\\*
  29. /////
  30. ///// This changes the screen to FULL SCREEN
  31. /////
  32. ///////////////////////////////// CHANGE TO FULL SCREEN \\\\\\\\\\\\\\\\*
  33. void wmChangeToFullScreen()
  34. {
  35. DEVMODE dmSettings; // Device Mode variable
  36. memset(&dmSettings,0,sizeof(dmSettings)); // Makes Sure Memory's Cleared
  37. // Get current settings -- This function fills our the settings
  38. // This makes sure NT and Win98 machines change correctly
  39. if(!EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&dmSettings))
  40. {
  41. // Display error message if we couldn't get display settings
  42. MessageBox(NULL, "Could Not Enum Display Settings", "Error", MB_OK);
  43. return;
  44. }
  45. dmSettings.dmPelsWidth = ScreenWidth; // Selected Screen Width
  46. dmSettings.dmPelsHeight = ScreenHeight; // Selected Screen Height
  47. // This function actually changes the screen to full screen
  48. // CDS_FULLSCREEN Gets Rid Of Start Bar.
  49. // We always want to get a result from this function to check if we failed
  50. int result = ChangeDisplaySettings(&dmSettings,CDS_FULLSCREEN);
  51. // Check if we didn't recieved a good return message From the function
  52. if(result != DISP_CHANGE_SUCCESSFUL)
  53. {
  54. // Display the error message and quit the program
  55. MessageBox(NULL, "Display Mode Not Compatible", "Error", MB_OK);
  56. PostQuitMessage(0);
  57. }
  58. }
  59. ///////////////////////////////// CREATE MY WINDOW \\\\\\\\\\\\\\\\*
  60. /////
  61. ///// This function creates a window, but doesn't have a message loop
  62. /////
  63. ///////////////////////////////// CREATE MY WINDOW \\\\\\\\\\\\\\\\*
  64. HWND wmCreateMyWindow(LPSTR strWindowName, int width, int height, DWORD dwStyle,  HINSTANCE hInstance)
  65. {
  66. HWND hWnd;
  67. WNDCLASS wndclass;
  68. memset(&wndclass, 0, sizeof(WNDCLASS)); // Init the size of the class
  69. wndclass.style = CS_HREDRAW | CS_VREDRAW; // Regular drawing capabilities
  70. wndclass.lpfnWndProc = wmWinProc; // Pass our function pointer as the window procedure
  71. wndclass.hInstance = hInstance; // Assign our hInstance
  72. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // General icon
  73. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // An arrow for the cursor
  74. wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1); // A white window
  75. wndclass.lpszClassName = "--Matrix Saver--"; // Assign the class name
  76. RegisterClass(&wndclass); // Register the class
  77. if(!dwStyle)  // Check if we wanted full screen mode
  78. { // Set the window properties for full screen mode
  79. dwStyle = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
  80. wmChangeToFullScreen(); // Go to full screen
  81. ShowCursor(FALSE); // Hide the cursor
  82. }
  83. g_hInstance = hInstance; // Assign our global hInstance to the window's hInstance
  84. // Below, we need to adjust the window to it's true requested size.  If we say we
  85. // want a window that is 800 by 600, that means we want the client rectangle to
  86. // be that big, not the entire window.  If we go into window mode, it will cut off
  87. // some of the client rect and stretch the remaining which causes slow down.  We fix this below.
  88. RECT rWindow;
  89. rWindow.left = 0; // Set Left Value To 0
  90. rWindow.right = width; // Set Right Value To Requested Width
  91. rWindow.top     = 0; // Set Top Value To 0
  92. rWindow.bottom = height; // Set Bottom Value To Requested Height
  93. AdjustWindowRect( &rWindow, dwStyle, false); // Adjust Window To True Requested Size
  94. // Create the window
  95. hWnd = CreateWindow("--Matrix Saver--", strWindowName, dwStyle, 0, 0,
  96. rWindow.right  - rWindow.left, rWindow.bottom - rWindow.top, 
  97. NULL, NULL, hInstance, NULL);
  98. if(!hWnd) return NULL; // If we could get a handle, return NULL
  99. ShowWindow(hWnd, SW_SHOWNORMAL); // Show the window
  100. UpdateWindow(hWnd); // Draw the window
  101. SetFocus(hWnd); // Sets Keyboard Focus To The Window
  102. return hWnd;
  103. }
  104. ///////////////////////////////// MAIN GAME LOOP \\\\\\\\\\\\\\\\*
  105. /////
  106. ///// This function Handles the main game loop
  107. /////
  108. ///////////////////////////////// MAIN GAME LOOP \\\\\\\\\\\\\\\\*
  109. WPARAM wmMainLoop()
  110. {
  111. MSG msg;
  112. while(1) // Do our infinate loop
  113. { // Check if there was a message
  114. if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
  115.         { 
  116. if(msg.message == WM_QUIT) // If the message wasnt to quit
  117. break;
  118.             TranslateMessage(&msg); // Find out what the message does
  119.             DispatchMessage(&msg); // Execute the message
  120.         }
  121. else // if there wasn't a message
  122. // Do computationally expensive things here.  We want to render the scene
  123. // every frame, so we call our rendering function here.  Even though the scene
  124. // doesn't change, it will bottle neck the message queue if we don't do something.
  125. // Usually WaitMessage() is used to make sure the app doesn't eat up the CPU.
  126. gcProcessLevel();
  127.         } 
  128. }
  129. return(msg.wParam); // Return from the program
  130. }
  131. ///////////////////////////////// INIT GAME WINDOW \\\\\\\\\\\\\\\\*
  132. /////
  133. ///// This function initializes the game window.
  134. /////
  135. ///////////////////////////////// INIT GAME WINDOW \\\\\\\\\\\\\\\\*
  136. void wmInit(HWND hWnd)
  137. {
  138. g_hWnd = hWnd; // Assign the window handle to a global window handle
  139. GetClientRect(g_hWnd, &g_rRect); // Assign the windows rectangle to a global RECT
  140. griInitializeOpenGL(g_rRect.right, g_rRect.bottom); // Init OpenGL with the global rect
  141. for(int i=0;i<256;i++)
  142. g_keys[i]=FALSE;
  143. // *Hint* We will put all our game init stuff here
  144. // Some things include loading models, textures and network initialization
  145. }
  146. ///////////////////////////////// DE INIT \\\\\\\\\\\\\\\\*
  147. /////
  148. ///// This function cleans up and then posts a quit message to the window
  149. /////
  150. ///////////////////////////////// DE INIT \\\\\\\\\\\\\\\\*
  151. void wmDeInit()
  152. {
  153. gcUnloadLevel();
  154. if (g_hRC)
  155. {
  156. wglMakeCurrent(NULL, NULL); // This frees our rendering memory and sets everything back to normal
  157. wglDeleteContext(g_hRC); // Delete our OpenGL Rendering Context
  158. }
  159. if (g_hDC) 
  160. ReleaseDC(g_hWnd, g_hDC); // Release our HDC from memory
  161. ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop
  162. ShowCursor(TRUE); // Show Mouse Pointer
  163. UnregisterClass("--Matrix Saver--", g_hInstance); // Free the window class
  164. PostQuitMessage (0); // Post a QUIT message to the window
  165. }
  166. ///////////////////////////////// WIN MAIN \\\\\\\\\\\\\\\\*
  167. /////
  168. ///// This function handles registering and creating the window.
  169. /////
  170. ///////////////////////////////// WIN MAIN \\\\\\\\\\\\\\\\*
  171. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprev, PSTR cmdline, int ishow)
  172. {
  173. HWND hWnd;
  174. int i=0;
  175. BOOL Status=FALSE;
  176. while(cmdline[i])
  177. {
  178. if((cmdline[i]=='/' || cmdline[i]=='-') && (cmdline[i+1]=='s'|| cmdline[i+1]=='S'))
  179. Status=TRUE;
  180. i++;
  181. }
  182. if(!Status)
  183. return TRUE;
  184. // Create our window with our function we create that passes in the:
  185. // Name, width, height, any flags for the window, if we want fullscreen of not, and the hInstance
  186. hWnd = wmCreateMyWindow("--Matrix Saver--", ScreenWidth, ScreenHeight, 0, hInstance);
  187. // If we never got a valid window handle, quit the program
  188. if(hWnd == NULL) return TRUE;
  189. // INIT OpenGL
  190. wmInit(hWnd);
  191. // Run our message loop and after it's done, return the result
  192. return wmMainLoop();
  193. }
  194. ///////////////////////////////// WIN PROC \\\\\\\\\\\\\\\\*
  195. /////
  196. ///// This function handles the window messages.
  197. /////
  198. ///////////////////////////////// WIN PROC \\\\\\\\\\\\\\\\*
  199. LRESULT CALLBACK wmWinProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
  200. {
  201.     LONG    lRet = 0; 
  202.     PAINTSTRUCT    ps;
  203.     switch (uMsg)
  204. case WM_SYSCOMMAND:
  205.         if ((wParam == SC_SCREENSAVE) || (wParam == SC_CLOSE)) {
  206.             return FALSE;
  207.         }
  208.         break;
  209. case WM_PAINT: // If we need to repaint the scene
  210. BeginPaint(hWnd, &ps); // Init the paint struct
  211. EndPaint(hWnd, &ps); // EndPaint, Clean up
  212. break;
  213. case WM_KEYDOWN:
  214. // g_keys[wParam]=TRUE;
  215. // if(wParam == VK_ESCAPE)
  216. wmDeInit(); // Quit if we pressed ESCAPE
  217. break;
  218. case WM_MOUSEMOVE:
  219. if(fst<10)
  220. fst++;
  221. else
  222. wmDeInit(); // Quit if we pressed ESCAPE
  223. break;
  224.  
  225. case WM_KEYUP:
  226. // g_keys[wParam]=FALSE;
  227. wmDeInit(); // Quit if we pressed ESCAPE
  228. break;
  229.  
  230.     case WM_DESTROY: // If the window is destroyed
  231.         wmDeInit(); // Release memory and restore settings
  232.         break; 
  233.      
  234.     default: // Return by default
  235.         lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); 
  236.         break; 
  237.     } 
  238.  
  239.     return lRet; // Return by default
  240. }