zoukankan      html  css  js  c++  java
  • OpenGL编程-OpenGL框架-win32项目

    在win32项目中开发的程序

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

    程序运行结果是这样的

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

      1 #include <windows.h>     //Windows的头文件
      2 #include <glgl.h>              //包含OpenGL基本库
      3 #include <glglu.h>          //包含OpenGL实用库
      4 #include <glglaux.h>      //包含OpenGL辅助库
      5 #include <glglut.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 }
  • 相关阅读:
    侯策《前端开发核心知识进阶》读书笔记——JS基础
    侯策《前端开发核心知识进阶》读书笔记——API实现
    侯策《前端开发核心知识进阶》读书笔记——Javascript中的Closure
    侯策《前端开发核心知识进阶》读书笔记——Javascript中的this
    xss攻击和csrf攻击的定义及区别
    浏览器缓存类型
    函数截流和防抖
    阮一峰《ECMAScript 6 入门》读书笔记—— Generator 函数
    阮一峰《ECMAScript 6 入门》读书笔记—— Iterator
    阮一峰《ECMAScript 6 入门》读书笔记——Promise
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/4591108.html
Copyright © 2011-2022 走看看