码迷,mamicode.com
首页 > Windows程序 > 详细

OpenGL编程-OpenGL框架-win32项目

时间:2015-06-20 22:04:41      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

在win32项目中开发的程序

小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的

程序运行结果是这样的

技术分享

源代码:对第45行进行覆盖

  1 #include <windows.h>     //Windows的头文件
  2 #include <gl\gl.h>              //包含OpenGL基本库
  3 #include <gl\glu.h>          //包含OpenGL实用库
  4 #include <gl\glaux.h>      //包含OpenGL辅助库
  5 #include <gl\glut.h>         //包含OpenGL工具库
  6 //设置程序中使用的所有变量
  7 HGLRC    hRC = NULL;  //OpenGL着色描述表句柄
  8 HDC         hDC = NULL;                //设备描述表句柄
  9 HWND    hWnd = NULL;                 //保存窗口句柄
 10 HINSTANCE      hInstance;             //保存程序的实例
 11 //增加两个全局变量来控制这两个对象的旋转。
 12 GLfloat        rtri;         //用于三角形的角度
 13 GLfloat        rquad;     //用于四边形的角度
 14 
 15 bool    keys[256];               //保存键盘按键的数组
 16 bool    active = TRUE;          //口的活动标志,缺省为TRUE
 17 bool    fullscreen = TRUE;    //全屏标志缺省,缺省设定成全屏模式
 18 LRESULT   CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);                   //WndProc定义
 19 GLvoid   ReSizeGLScene(GLsizei width, GLsizei height)                                                //重置OpenGL窗口大小
 20 {
 21     if (height == 0)                //防止被零除
 22     {
 23         height = 1;
 24     }                   //将Height设为    
 25     glViewport(0, 0, width, height);  //重置当前的视口  
 26     glMatrixMode(GL_PROJECTION);  //选择投影矩阵
 27     glLoadIdentity();                        //重置投影矩阵
 28     gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);                             //设置视景体
 29     glMatrixMode(GL_MODELVIEW);                                          //选择模型观察矩阵
 30     glLoadIdentity();                          //重置模型观察矩阵
 31 }
 32 int InitGL(GLvoid)    //开始对OpenGL进行所有设置
 33 {
 34     glShadeModel(GL_SMOOTH);     //启用阴影平滑
 35     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);      //黑色背景
 36     glClearDepth(1.0f);               //设置深度缓存
 37     glEnable(GL_DEPTH_TEST);      //启用深度测试
 38     glDepthFunc(GL_LEQUAL);//所作深度测试的类型
 39     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);         //告诉系统对透视进行修正
 40     return TRUE;                   //初始化OK
 41 }
 42 
 43 
 44 
 45 
 46 
 47 //将这段代码覆盖之后,往里面添加东西。就能进行OpenGL
 48 
 49 
 50  int DrawGLScene(GLvoid)     //开始进行所有的绘制
 51   {    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   //清除屏幕和深度缓存
 52     glLoadIdentity();         //重置当前的模型观察矩阵
 53 return TRUE;          }                       // 一切OK
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 GLvoid KillGLWindow(GLvoid)     //正常销毁窗口
 63 {
 64     if (fullscreen)   {                     //处于全屏模式吗?
 65         ChangeDisplaySettings(NULL, 0); //切回桌面
 66         ShowCursor(TRUE);
 67     }     //显示鼠标指针
 68     if (hRC)    {    //拥有OpenGL着色描述表吗?
 69         if (!wglMakeCurrent(NULL, NULL)) {
 70             //能否释放DC和RC描述表?
 71             MessageBox(NULL, "释放DC和RC失               败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
 72         }
 73         if (!wglDeleteContext(hRC)){ //能否删除RC?
 74             MessageBox(NULL, "释放RC失                败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
 75         }
 76         hRC = NULL;
 77     }         //将RC设为NULL        
 78     if (hDC && !ReleaseDC(hWnd, hDC))  {
 79         //能否释放DC?
 80         MessageBox(NULL, "释放DC失败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
 81         hDC = NULL;
 82     }         //将DC设为NULL
 83     if (hWnd && !DestroyWindow(hWnd))  {
 84         //能否销毁窗口?
 85         MessageBox(NULL, "释放窗口句柄失            败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
 86         hWnd = NULL;
 87     }   //将hWnd设为NULL
 88     if (!UnregisterClass("OpenGL", hInstance))  {
 89         //能否注销类?
 90         MessageBox(NULL, "不能注销窗口类             。", " 关闭错误", MB_OK | MB_ICONINFORMATION);
 91         hInstance = NULL;
 92     }
 93 } //hInstance为NULL   
 94 BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
 95 {
 96     GLuint    PixelFormat;    //保存查找匹配的结果
 97     WNDCLASS     wc;             //窗口类结构
 98     DWORD    dwExStyle;             //扩展窗口风格
 99     DWORD    dwStyle;                         //窗口风格
100     RECT   WindowRect;                           //取得矩形的左上角和右下角的坐标值
101     WindowRect.left = (long)0;       //将Left 设为
102     WindowRect.right = (long)width;                            //将Right设为要求的宽度
103     WindowRect.top = (long)0;      //将Top设为0
104     WindowRect.bottom = (long)height;                    //将Bottom设为要求的高度
105     fullscreen = fullscreenflag;  //设置全局全屏标志
106     hInstance = GetModuleHandle(NULL);                                                             //取得窗口实例
107     wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;  //移动时重画,为窗口取得DC
108     wc.lpfnWndProc = (WNDPROC)WndProc;                                           //WndProc处理消息
109     wc.cbClsExtra = 0;            //窗口类额外字节数
110     wc.cbWndExtra = 0;    //窗口实例额外字节数
111     wc.hInstance = hInstance;              //设置实例
112     wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);                                                   //装入缺省图标
113     wc.hCursor = LoadCursor(NULL, IDC_ARROW);                   //装入鼠标指针
114     wc.hbrBackground = NULL;  //GL不需要背景
115     wc.lpszMenuName = NULL;         //不需要菜单
116     wc.lpszClassName = "OpenGL"; //设定类名字
117     if (!RegisterClass(&wc))   //尝试注册窗口类
118     {
119         MessageBox(NULL, "注册窗口失败。", "              错误", MB_OK | MB_ICONEXCLAMATION);
120         return FALSE;         //退出并返回FALSE
121     }
122     if (fullscreen)                //要尝试全屏模式吗?
123     {
124         DEVMODE dmScreenSettings;   //设备模式
125         memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); //确保内存为零
126         dmScreenSettings.dmSize = sizeof(dmScreenSettings);   //Devmode结构大小
127         dmScreenSettings.dmPelsWidth = width;                               //所选屏幕宽度
128         dmScreenSettings.dmPelsHeight = height;                        //所选屏幕高度
129         dmScreenSettings.dmBitsPerPel = bits;                         //每像素所选的色彩深度         dmScreenSettings.dmFields=                       DM_BITSPERPEL|DM_PELSWIDTH|             DM_PELSHEIGHT;
130         //尝试设置显示模式并返回结果。
131         //注: CDS_FULLSCREEN 移去了状态条。
132         if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
133         {
134             //若模式失败,退出或在窗口内运行
135             if (MessageBox(NULL, "全屏模式在当前          显卡上设置失败!使用窗口模式?           ", "OpenGL程序", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
136             {
137                 fullscreen = FALSE;     //选择窗口模式
138             }
139             else  {
140                 //弹出对话框告诉用户程序结束
141                 MessageBox(NULL, "程序将被关                    闭。", "错误", MB_OK | MB_ICONSTOP);
142                 return FALSE;   // 退出并返回FALSE
143             }
144         }
145     }
146     if (fullscreen)              //仍处于全屏模式吗?
147     {
148         dwExStyle = WS_EX_APPWINDOW;                                        //扩展窗体风格
149         dwStyle = WS_POPUP;               //窗体风格
150         ShowCursor(FALSE);              //隐藏鼠标指针
151     }
152     else
153     {
154         dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; //扩展窗体风格
155         dwStyle = WS_OVERLAPPEDWINDOW;                                       // 窗体风格
156     }
157     AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);  //调整窗口到要求大小
158     if (!(hWnd = CreateWindowEx(dwExStyle,                           //扩展窗体风格
159         "OpenGL",                   //类名字
160         title,                         //窗口标题
161         WS_CLIPSIBLINGS |  //必须窗体风格属性
162         WS_CLIPCHILDREN |//必须窗体风格属性
163         dwStyle,                //选择的窗体属性
164         0, 0,                         //窗口位置
165         WindowRect.right - WindowRect.left,                                         //计算调整好的窗口宽度
166         WindowRect.bottom - WindowRect.top,                                        //计算调整好的窗口高度
167         NULL,                        //无父窗口
168         NULL,                     //无菜单
169         hInstance,                     //实例
170         NULL)))  //不向WM_CREATE传任何东西
171     {
172         KillGLWindow();          //重置显示区
173         MessageBox(NULL, "创建窗口失败。", "错误", MB_OK | MB_ICONEXCLAMATION);
174         return FALSE;
175     }          //返回FALSE
176     static    PIXELFORMATDESCRIPTOR pfd =                               //pfd 告诉窗口使用的像素格式
177     {
178         sizeof(PIXELFORMATDESCRIPTOR),                                     //上述格式描述符的大小
179         1,                               //版本号
180         PFD_DRAW_TO_WINDOW |                                             //格式支持窗口
181         PFD_SUPPORT_OPENGL |                              //格式必须支持OpenGL
182         PFD_DOUBLEBUFFER,  //必须支持双缓冲
183         PFD_TYPE_RGBA,           //申请RGBA 格式
184         bits,                                    //选定色彩深度
185         0, 0, 0, 0, 0, 0,        //忽略的色彩位
186         0,                  //无Alpha缓存
187         0,                                                 //忽略Shift Bit
188         0,                                                   //无累加缓存
189         0, 0, 0, 0,                                  //忽略聚集位
190         16,                         //16位Z-缓存(深度缓存)
191         0,                                               //无模板缓存
192         0,                              //无辅助缓存
193         PFD_MAIN_PLANE,                  //主绘图层
194         0,                        //Reserved
195         0, 0, 0                                       //忽略层遮罩
196     };
197     if (!(hDC = GetDC(hWnd)))  //获取设备描述表?
198     {
199         KillGLWindow();            //重置显示区
200         MessageBox(NULL, "不能创建GL设备描        述表。", "错误", MB_OK | MB_ICONEXCLAMATION);
201         return FALSE;
202     }    //返回FALSE
203     if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))  //Windows找到相应像素格式了吗?
204     {
205         KillGLWindow();             //重置显示区
206         MessageBox(NULL, "不能创建一种相匹配           的像素格式。", "错误", MB_OK | MB_ICONEXCLAMATION);
207         return FALSE;
208     }                   //返回FALSE
209     if (!SetPixelFormat(hDC, PixelFormat, &pfd))                      //能够设置象素格式么?
210     {
211         KillGLWindow();              //重置显示区
212         MessageBox(NULL, "不能设置像素格式。                   ", "错误", MB_OK | MB_ICONEXCLAMATION);
213         return FALSE;                        //返回FALSE
214     }
215     if (!(hRC = wglCreateContext(hDC)))                            //能否取得着色描述表?
216     {
217         KillGLWindow();                        //重置显示区
218         MessageBox(NULL, "不能创建着色描述         表。", "错误", MB_OK | MB_ICONEXCLAMATION);
219         return FALSE;
220     }                     //返回FALSE
221     if (!wglMakeCurrent(hDC, hRC))                                //尝试激活着色描述表
222     {
223         KillGLWindow();                //重置显示区
224         MessageBox(NULL, "不能激活当前的                OpenGL着色描述表。", "错误", MB_OK | MB_ICONEXCLAMATION);
225         return FALSE;
226     }             //返回FALSE
227     ShowWindow(hWnd, SW_SHOW);//显示窗口
228     SetForegroundWindow(hWnd);                                          //稍微提高优先级
229     SetFocus(hWnd);    //设置键盘的焦点至此窗口
230     ReSizeGLScene(width, height);                                       //设置透视GL 屏幕
231     if (!InitGL())            //初始化新建的GL窗口
232     {
233         KillGLWindow();                   //重置显示区
234         MessageBox(NULL, "初始化失败。", "错误                          ", MB_OK | MB_ICONEXCLAMATION);
235         return FALSE;              //返回FALSE
236     }
237     return TRUE;                //成功
238 }
239 LRESULT CALLBACK WndProc(
240     HWND     hWnd,                    //窗口的句柄
241     UINT    uMsg,                                  //窗口的消息
242     WPARAM      wParam,     //附加的消息内容
243     LPARAM    lParam)       //附加的消息内容
244 {
245     switch (uMsg) {                  //检查Windows消息
246     case WM_ACTIVATE:       //监视窗口激活消息
247     {
248                                if (!HIWORD(wParam))                                                          //检查最小化状态
249                                {
250                                    active = TRUE;
251                                } //程序处于激活状态
252                                else
253                                {
254                                    active = FALSE;
255                                }        //程序不再激活
256                                return 0;                         //返回消息循环
257     }
258     case WM_SYSCOMMAND:    //系统中断命令
259     {
260                             switch (wParam) {               //检查系统调用
261                             case SC_SCREENSAVE: //屏保要运行?
262                             case SC_MONITORPOWER:                              //显示器要进入节电模式?
263                                 return 0;
264                             }                        //阻止发生
265                             break;                                       //退出
266     }
267     case WM_CLOSE:           //收到Close消息?
268     {
269                                PostQuitMessage(0);      //发出退出消息
270                                return 0;                      //返回
271     }
272     case WM_KEYDOWN:          //有键按下么?
273     {
274                                   keys[wParam] = TRUE; //若是设为TRUE
275                                   return 0;                       //返回
276     }
277     case WM_KEYUP:                         //有键放开么?
278     {
279                                              keys[wParam] = FALSE;//是则设为FALSE
280                                              return 0;                          //返回
281     }
282     case WM_SIZE:          //调整OpenGL窗口大小
283     {
284                               ReSizeGLScene(LOWORD(lParam), HIWORD(lParam));
285                               //LoWord=Width,HiWord=Height
286                               return 0;                       //返回
287     }
288     }
289     //向DefWindowProc传递所有未处理的消息。
290     return DefWindowProc(hWnd, uMsg, wParam, lParam);
291 }
292 int WINAPI WinMain(
293     HINSTANCE   hInstance,        //当前窗口实例
294     HINSTANCE   hPrevInstance,  //前一个窗口实例
295     LPSTR  lpCmdLine,               //命令行参数
296     int  nCmdShow)              //窗口显示状态
297 {
298     MSG    msg;                   //Windowsx消息结构
299     BOOL done = FALSE;    //退出循环的Bool变量
300     //提示用户选择运行模式
301     if (MessageBox(NULL, "你想在全屏模式下运      行吗?", "设置全屏模式?", MB_YESNO | MB_ICONQUESTION) == IDNO)
302     {
303         fullscreen = FALSE;     //FALSE为窗口模式
304     }
305     //创建OpenGL窗口
306     if (!CreateGLWindow("OpenGL程序框架", 640, 480, 16, fullscreen))
307     {
308         return 0;                        //失败退出
309     }
310     while (!done)       //保持循环直到done=TRUE
311     {
312         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))         //有消息在等待吗?
313         {
314             if (msg.message == WM_QUIT)
315                 //收到退出消息? 
316             {
317                 done = TRUE;    //是则done=TRUE
318             }
319             else                       //不是,处理窗口消息
320             {
321                 TranslateMessage(&msg);//翻译消息
322                 DispatchMessage(&msg); //发送消息
323             }
324         }
325         else                      //如果没有消息
326         {
327             //绘制场景。监视ESC键和来自                            //的退出消息,然后调用DrawGLScene() 
328             if (active)                 //程序激活的么?
329             {
330                 if (keys[VK_ESCAPE])//ESC按下么?
331                 {
332                     done = TRUE;  //ESC发退出信号
333                 }
334                 else    //不是退出的时候,刷新屏幕
335                 {
336                     DrawGLScene();     //绘制场景
337                     SwapBuffers(hDC);                                                       //交换缓存(双缓存)
338                 }
339             }
340             if (keys[VK_F1])             //F1键按下了么?
341             {
342                 keys[VK_F1] = FALSE;                //若是,使对应的Key数组中的值为FALSE
343                 KillGLWindow();   //销毁当前窗口
344                 fullscreen = !fullscreen;                                                //切换全屏/窗口模式
345                 //重建OpenGL 窗口
346                 //   if (!CreateGLWindow("OpenGL程              序框架",640,480,16,fullscreen))
347                 //  {
348                 //    return 0;                                        //如果窗口未能创建,程序退出
349                 //   }
350                 //    }     
351                 if (!CreateGLWindow("绘制基本图元", 640, 480, 16, fullscreen))
352                 {
353                     return 0;    //若窗口未能创建程序退出        
354                 }
355             }
356 
357         }
358     }
359     //关闭程序
360     KillGLWindow();     //销毁窗口            
361     return (msg.wParam); //退出程序        
362 }

 

OpenGL编程-OpenGL框架-win32项目

标签:

原文地址:http://www.cnblogs.com/cs-lcy/p/4591108.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!