OpenGL编程-OpenGL框架-win32项目

在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 }
时间: 2024-10-10 11:02:32

OpenGL编程-OpenGL框架-win32项目的相关文章

在Win7(64位)使用VS2015运行《OpenGL编程指南》第八版第一章程序的方法

前言:笔者第一次用vs2015来实现<OpenGL编程指南>第八版第一个程序时确实花费了不少时间,按照网上教程,尝试了各种方法,最终花费了两个上午加一个下午的时间, 成功运行了程序,花了这么多时间,确实让人懊恼,现在把运行程序的步骤记录下来,以便查阅. 1.第一步,下载oglpg-8th-edith. 如果去书本上的官网下载,下载的是第九版的,而不是第八版的源码. 去其他网站下载,下载的这个包里面没有第一章的源码,可以网上黏贴其他人的代码,建议下第八版源码,下载网址:链接:http://pan

Visual Studio 2017上配置OpenGL编程指南第8版开发环境

一直想学习一下OpenGL,买了红宝书第8版,却因为工作原因一直没有时间看,最近利用周末尝试了一下配置开发环境,遇到了一些坑点,现在记录下来备用. 第一步:打开Visual Studio 2017,建立一个空的C++工程 第二步:新建triangles.cpp文件,并写入书本例子中的代码 /////////////////////////////////////////////////////////////////////// // // triangles.cpp // //////////

在 Mac OS X Yosemite 10.10.5 上配置 OpenGL 编程环境

这个教程主要参考了youtube上的视频 Getting Started in OpenGL with GLFW/GLEW in Xcode 6 ,这个视频有点问题,不能照搬.本人通过自己摸(瞎)索(猫)加(碰)下(死)方(耗)的(子)评论,现在给出一种可能安装成功的方案,至于能不能成功,看各位的造化了. 首先,你的 mac 需要有最新的 Xcode,Command line tool, 这些都是最基础的,估计各位已经具备条件了.其次,下载安装 CMake (https://cmake.org/

VS15 openGL 编程指南 配置库 triangle例子

最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去该书的网站中下载相关的配置文件,书中给的是"红宝书"的官方网址:http://www.opengl-redbook.com/ 但现在已经更新至第九版,里面的库不是很完整,不适宜用于此书示例. 所以我们要找一个第八版的资源:http://pan.baidu.com/s/1kVpv1MR 下载

编译opengl编程指南第八版示例代码通过

最近在编译opengl编程指南第八版的示例代码,如下 1 #include <iostream> 2 #include "vgl.h" 3 #include "LoadShaders.h" 4 5 using namespace std; 6 7 8 enum VAO_IDs { Triangles, NumVAOs }; 9 enum Buffer_IDs { ArrayBuffer, NumBuffers }; 10 enum Attrib_IDs

【OpenGL】OpenGL初学

转载自:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性

API、Win32 SDK、Win32项目、MFC、Windows窗体应用程序的区别

[原]API.Win32 SDK.Win32项目.MFC.Windows窗体应用程序的区别 首先来看一下每一个术语的定义: API:Application Programming Interface.Windows操作系统提供给应用程序编程的接口, 简称 为API函数. Win32 SDK:SDK(Software Development Kit)中文是软件开发包.则Win32 SDK是Windows 32位平台下的软件开发包,包括了API函数.帮助文档.微软 提供的一些辅助开发工具. Win3

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

有关于OpenGL、OpenGL ES、WebGL的小结

转自原文 有关于OpenGL.OpenGL ES.WebGL的小结 一.   OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口的规格,它用于三维图西象(二维的亦可).OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库. 关于其他的介绍我就不说了.这边我说一下有OpenGL的资源网站: OpenGL官网:http://www.opengl.org/resources/libraries/glut/ Ne