Readme.txt
上传用户:kaiyuangj
上传日期:2022-01-01
资源大小:35k
文件大小:13k
源码类别:

屏幕保护

开发平台:

Visual C++

  1. /*
  2.  *      Windows Frame Code Was Published By Jeff Molofee 2000. 
  3.  *      Thanks to the Screen Saver Creator of Lesson31_SS. You Helped me A Lots.
  4.  * If You've Found This Code Useful, Please Send Me a Copy At
  5.  * gan_kim_heng@yahoo.com.
  6.  */
  7. #include <windows.h> // Header File For Windows
  8. #include <stdio.h> // Header File For Standard Input/Output
  9. #include <math.h>
  10. #include <glgl.h> // Header File For The OpenGL32 Library
  11. #include <glglu.h> // Header File For The GLu32 Library
  12. #include <scrnsave.h>
  13. #include "resource.h"
  14. #include "myGLUI.h"
  15. #pragma comment( lib, "opengl32.lib") // Search For OpenGL32.lib While Linking
  16. #pragma comment( lib, "glu32.lib")
  17. #pragma comment( lib, "scrnsave.lib")
  18. HDC hDC=NULL; // Private GDI Device Context
  19. HGLRC hRC=NULL; // Permanent Rendering Context
  20. HWND hWnd=NULL; // Holds Our Window Handle
  21. HINSTANCE hInstance; // Holds The Instance Of The Application
  22. DEVMODE DMsaved; // Saves the previous screen settings (NEW)
  23. UINT uTimer; // timer identifier
  24. bool keys[256]; // Array Used For The Keyboard Routine
  25. bool active=TRUE; // Window Active Flag Set To TRUE By Default
  26. bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default
  27. const num=50; // Number Of Stars To Draw
  28. GLuint loop; // General Loop Variable
  29. float flag=0.0; // Flag to Create the Sprinkling Effect at the Initiate State 
  30. typedef struct // Create A Structure For Star
  31. {
  32. int r, g, b; // Bubbles Color
  33. GLfloat x,velox,y,veloy,z,veloz;
  34. }
  35. bubbles;
  36. bubbles bubble[num]; // Need To Keep Track Of 'num' bubbles
  37. GLuint texture[1]; // Storage For One Texture
  38. void LoadGLTextures();
  39. GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
  40. {
  41. if (height==0) // Prevent A Divide By Zero By
  42. {
  43. height=1; // Making Height Equal One
  44. }
  45. glViewport(0,0,width,height); // Reset The Current Viewport
  46. glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
  47. glLoadIdentity(); // Reset The Projection Matrix
  48. // Calculate The Aspect Ratio Of The Window
  49. gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
  50. glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
  51. glLoadIdentity(); // Reset The Modelview Matrix
  52. }
  53. void SetBubbles(int loop) // Sets The Initial Value Of Each Object (Random)
  54. {
  55. bubble[loop].r=rand()%256;
  56. bubble[loop].g=rand()%256;
  57. bubble[loop].b=rand()%256;
  58. flag=(float)0.0; // Reset
  59. bubble[loop].x=float(sin(rand()/330.0));
  60. bubble[loop].y=float(-25.0 + rand()/2000.0);
  61. bubble[loop].z=float(rand()/3000.0);
  62. bubble[loop].velox=0.0;
  63. bubble[loop].veloy=0.0;
  64. bubble[loop].veloz=0.0;
  65. }
  66. int InitGL(GLvoid) // All Setup For OpenGL Goes Here
  67. {
  68. glEnable(GL_TEXTURE_2D); // Enable Texture Mapping 
  69. glShadeModel(GL_SMOOTH); // Enable Smooth Shading
  70. glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
  71. glClearDepth(1.0f); // Depth Buffer Setup
  72. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
  73. glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Set The Blending Function For Translucency
  74. glEnable(GL_BLEND);
  75. LoadGLTextures();
  76. for (loop=0; loop<num; loop++)
  77. {
  78. SetBubbles(loop);
  79. }
  80. return TRUE;
  81. }
  82. int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
  83. {
  84. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
  85. glBindTexture(GL_TEXTURE_2D, texture[0]);
  86. for (loop=0; loop<num; loop++) // Loop Through All The bubbles
  87. {
  88. glLoadIdentity(); // Reset The View
  89. glTranslatef(0.0f,0.0f,-50.0f);
  90. //glTranslatef(float(3*sin(rand()/330.0)),float(rand()/2000.0),float(rand()/3000.0));
  91. glTranslatef(bubble[loop].x,bubble[loop].y,bubble[loop].z);
  92. glBindTexture(GL_TEXTURE_2D, texture[0]);
  93. glColor4ub(bubble[loop].r,bubble[loop].g,bubble[loop].b,255);
  94. glBegin(GL_QUADS);
  95. glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
  96. glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
  97. glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
  98. glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
  99. glEnd();
  100. bubble[loop].velox=float(sin(rand()/1000.0*flag));
  101. bubble[loop].veloy=float(rand()/40000.0);
  102. bubble[loop].veloz=float(rand()/30000.0);
  103. bubble[loop].x+=bubble[loop].velox;
  104. bubble[loop].y+=bubble[loop].veloy;
  105. bubble[loop].z+=bubble[loop].veloz;
  106. flag+=(float)10.0;
  107. if(flag>1000)
  108. {
  109. flag=(float)0.0;
  110. }
  111. Sleep(5);
  112. if (bubble[loop].y>18.0f) // Is bubble Off The Screen?
  113. {
  114. SetBubbles(loop); // If So, Reassign New Values
  115. }
  116. }
  117. return TRUE; // Keep Going
  118. }
  119. /************************************************************************************/
  120. GLvoid KillGLWindow(GLvoid) // Properly Kill The Window
  121. {
  122. if (hRC) // Do We Have A Rendering Context?
  123. {
  124. if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts?
  125. {
  126. MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  127. }
  128. if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?
  129. {
  130. MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  131. }
  132. hRC=NULL; // Set RC To NULL
  133. }
  134. if (hDC && !ReleaseDC(hWnd,hDC)) // Are We Able To Release The DC
  135. {
  136. MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  137. hDC=NULL; // Set DC To NULL
  138. }
  139. }
  140. /************************************************************************************/
  141. /* This Code Creates Our OpenGL Window.  Parameters Are: *
  142.  * title - Title To Appear At The Top Of The Window *
  143.  * width - Width Of The GL Window Or Fullscreen Mode *
  144.  * height - Height Of The GL Window Or Fullscreen Mode *
  145.  * bits - Number Of Bits To Use For Color (8/16/24/32) *
  146.  * fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
  147.  
  148. BOOL CreateGLWindow(HWND hWnd, int bits)
  149. {
  150. GLuint PixelFormat; // Holds The Results After Searching For A Match
  151. RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values
  152. int width;
  153. int height;
  154. hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window
  155. EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DMsaved); // save the current display state (NEW)
  156. static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
  157. {
  158. sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
  159. 1, // Version Number
  160. PFD_DRAW_TO_WINDOW | // Format Must Support Window
  161. PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
  162. PFD_DOUBLEBUFFER, // Must Support Double Buffering
  163. PFD_TYPE_RGBA, // Request An RGBA Format
  164. bits, // Select Our Color Depth
  165. 0, 0, 0, 0, 0, 0, // Color Bits Ignored
  166. 0, // No Alpha Buffer
  167. 0, // Shift Bit Ignored
  168. 0, // No Accumulation Buffer
  169. 0, 0, 0, 0, // Accumulation Bits Ignored
  170. 16, // 16Bit Z-Buffer (Depth Buffer)  
  171. 0, // No Stencil Buffer
  172. 0, // No Auxiliary Buffer
  173. PFD_MAIN_PLANE, // Main Drawing Layer
  174. 0, // Reserved
  175. 0, 0, 0 // Layer Masks Ignored
  176. };
  177. if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context?
  178. {
  179. KillGLWindow(); // Reset The Display
  180. MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  181. return FALSE; // Return FALSE
  182. }
  183. if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
  184. {
  185. KillGLWindow(); // Reset The Display
  186. MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  187. return FALSE; // Return FALSE
  188. }
  189. if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?
  190. {
  191. KillGLWindow(); // Reset The Display
  192. MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  193. return FALSE; // Return FALSE
  194. }
  195. if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context?
  196. {
  197. KillGLWindow(); // Reset The Display
  198. MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  199. return FALSE; // Return FALSE
  200. }
  201. if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context
  202. {
  203. KillGLWindow(); // Reset The Display
  204. MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  205. return FALSE; // Return FALSE
  206. }
  207.     GetClientRect (hWnd, &WindowRect); 
  208. width = WindowRect.right - WindowRect.left;
  209. height = WindowRect.bottom - WindowRect.top;
  210. ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen
  211.     if (!InitGL()) // Initialize Our Newly Created GL Window
  212. {
  213. KillGLWindow(); // Reset The Display
  214. MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  215. return FALSE; // Return FALSE
  216. }
  217. return TRUE; // Success
  218. }
  219. /************************************************************************************/
  220. // (no changes)
  221. LRESULT WINAPI ScreenSaverProc (HWND hWnd,
  222. UINT uMsg,
  223. WPARAM wParam,
  224. LPARAM lParam)
  225. {
  226. switch (uMsg) // Check For Windows Messages
  227. {
  228.         case WM_CREATE:
  229. {
  230. if (!CreateGLWindow(hWnd,16))
  231. {
  232. return -1; // Quit If Window Was Not Created
  233. }
  234.             uTimer = SetTimer(hWnd, 1, 10, NULL); 
  235. return 0;
  236. }
  237.         case WM_TIMER: 
  238. DrawGLScene();                      // Draw Scene
  239. SwapBuffers(hDC); // Swap Buffers (Double Buffering)
  240. break;
  241.         case WM_DESTROY: 
  242.             if (uTimer) 
  243.                 KillTimer(hWnd, uTimer); 
  244. KillGLWindow(); // Kill The Window
  245. glDeleteTextures(4,texture);
  246.             break; 
  247. }
  248. // Pass All Unhandled Messages To DefScreenSaverProc
  249.     return DefScreenSaverProc(hWnd, uMsg, wParam, lParam); 
  250. }
  251. BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
  252.     return FALSE; 
  253. BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
  254.     return TRUE; 
  255. int ImageLoadFromResource(LPCTSTR lpszName, Image *image) {
  256. HANDLE hBmp = LoadImage(hInstance, lpszName, IMAGE_BITMAP,
  257. LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_DEFAULTCOLOR);
  258. if(!hBmp)
  259. return 0;
  260. // Get the bitmap dimensions.
  261. BITMAP bmp;
  262. if(!GetObject((HBITMAP)hBmp, sizeof(bmp), &bmp))
  263. return 0;
  264. // First try to get how much memory we need.
  265. BITMAPINFO bi = {0};
  266. bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  267. bi.bmiHeader.biWidth = bmp.bmWidth;
  268. bi.bmiHeader.biHeight = bmp.bmHeight;
  269. bi.bmiHeader.biPlanes = bmp.bmPlanes;
  270. bi.bmiHeader.biBitCount = 24;
  271. if(!GetDIBits(hDC, (HBITMAP)hBmp, 0, 1, NULL, &bi, DIB_PAL_COLORS))
  272. return 0;
  273. // Allocate memory for the required number of bytes. 
  274. image->sizeX = bi.bmiHeader.biWidth;
  275. image->sizeY = bi.bmiHeader.biHeight;
  276. image->data = (char*)malloc(bi.bmiHeader.biSizeImage);
  277. // Get the bits in 24 bit format.
  278. if(!GetDIBits(hDC, (HBITMAP)hBmp, 0, bi.bmiHeader.biHeight, (LPVOID)image->data, &bi, DIB_PAL_COLORS))
  279. return 0;
  280.     for (unsigned long i=0;i<bi.bmiHeader.biSizeImage;i+=3) { /* reverse all of the colors. (bgr -> rgb)*/
  281. char temp = image->data[i];
  282. image->data[i] = image->data[i+2];
  283. image->data[i+2] = temp;
  284.     }
  285. return 1;
  286. }
  287. /*************************************************************************************/
  288. /***        Load Bitmaps And Convert To Textures                                  ****/
  289. /*************************************************************************************/
  290. void LoadGLTextures() {
  291.     /* Load Texture*/
  292.     Image *image1;
  293.     
  294.     /* allocate space for texture*/
  295.     image1 = (Image *) malloc(sizeof(Image));
  296.     if (image1 == NULL) {
  297. printf("Error allocating space for image");
  298. exit(0);
  299.     }
  300.     if (!ImageLoadFromResource(MAKEINTRESOURCE(IDB_BITMAP1), image1)) {
  301. exit(1);
  302.     } 
  303.     /* Create Texture *****************************************/
  304.     glGenTextures(2, &texture[0]);
  305.     glBindTexture(GL_TEXTURE_2D, texture[0]);   /* 2d texture (x and y size)*/
  306.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); /* scale linearly when image bigger than texture*/
  307.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); /* scale linearly when image smalled than texture*/
  308. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);
  309. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT);
  310.     /* 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, */
  311.     /* border 0 (normal), rgb color data, unsigned byte data, and finally the data itself.*/
  312.     glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data);
  313. free(image1->data);
  314. free(image1);
  315. };
  316. /*************************************************************************************/