• 第01课 OpenGL窗口(2)


    下一段包括了所有的绘图代码。任何您所想在屏幕上显示的东东都将在此段代码中出现。以后的每个教程中我都会在例程的此处增加新的代码。如果您对OpenGL已经有所了解的话,您可以在 glLoadIdentity()调用之后,返回TRUE值之前,试着添加一些OpenGL代码来创建基本的形。如果您是OpenGL新手,等着我的下个教程。目前我们所作的全部就是将屏幕清除成我们前面所决定的颜色,清除深度缓存并且重置场景。我们仍没有绘制任何东东。

    返回TRUE值告知我们的程序没有出现问题。如果您希望程序因为某些原因而中止运行,在返回TRUE值之前增加返回FALSE的代码告知我们的程序绘图代码出错。程序即将退出。

    int DrawGLScene(GLvoid)                                // 从这里开始进行所有的绘制
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            // 清除屏幕和深度缓存
    
        glLoadIdentity();                            // 重置当前的模型观察矩阵
    
        return TRUE;                                //  一切 OK
    }

    下一段代码只在程序退出之前调用。KillGLWindow() 的作用是依次释放着色描述表,设备描述表和窗口句柄。我已经加入了许多错误检查。如果程序无法销毁窗口的任意部分,都会弹出带相应错误消息的讯息窗口,告诉您什么出错了。使您在您的代码中查错变得更容易些。

    GLvoid KillGLWindow(GLvoid)                            // 正常销毁窗口
    {

    我们在KillGLWindow()中所作的第一件事是检查我们是否处于全屏模式。如果是,我们要切换回桌面。我们本应在禁用全屏模式前先销毁窗口,但在某些显卡上这么做可能会使得桌面崩溃。所以我们还是先禁用全屏模式。这将防止桌面出现崩溃,并在Nvidia和3dfx显卡上都工作的很好!

        if (fullscreen)                                // 我们处于全屏模式吗?
        {

    我们使用ChangeDisplaySettings(NULL,0)回到原始桌面。将NULL作为第一个参数,0作为第二个参数传递强制Windows使用当前存放在注册表中的值(缺省的分辨率、色彩深度、刷新频率,等等)来有效的恢复我们的原始桌面。切换回桌面后,我们还要使得鼠标指针重新可见。

            ChangeDisplaySettings(NULL,0);                    // 是的话,切换回桌面
    
            ShowCursor(TRUE);                        // 显示鼠标指针
        }

    接下来的代码查看我们是否拥有着色描述表(hRC)。如果没有,程序将跳转至后面的代码查看是否拥有设备描述表。

        if (hRC)                                // 我们拥有OpenGL渲染描述表吗?
        {

    如果存在着色描述表的话,下面的代码将查看我们能否释放它(将 hRC从hDC分开)。这里请注意我使用的的查错方法。基本上我只是让程序尝试释放着色描述表(通过调用wglMakeCurrent(NULL,NULL),然后我再查看释放是否成功。巧妙的将数行代码结合到了一行。

            if (!wglMakeCurrent(NULL,NULL))                    // 我们能否释放DC和RC描述表?
            {

    如果不能释放DC和RC描述表的话,MessageBox()将弹出错误消息,告知我们DC和RC无法被释放。NULL意味着消息窗口没有父窗口。其右的文字将在消息窗口上出现。"SHUTDOWN ERROR"出现在窗口的标题栏上。MB_OK的意思消息窗口上带有一个写着OK字样的按钮。
    MB_ICONINFORMATION将在消息窗口中显示一个带圈的小写的i(看上去更正式一些)。

                MessageBox(NULL,"释放DC或RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
            }

    下一步我们试着删除着色描述表。如果不成功的话弹出错误消息。
    如果无法删除着色描述表的话,将弹出错误消息告知我们RC未能成功删除。然后hRC被设为NULL。

            if (!wglDeleteContext(hRC))                    // 我们能否删除RC?
            {
                MessageBox(NULL,"释放RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
            }
    
            hRC=NULL;                            // 将RC设为 NULL
        }

    现在我们查看是否存在设备描述表,如果有尝试释放它。如果不能释放设备描述表将弹出错误消息,然后hDC设为NULL。

        if (hDC && !ReleaseDC(hWnd,hDC))                    // 我们能否释放 DC?
        {
            MessageBox(NULL,"释放DC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
    
            hDC=NULL;                            // 将 DC 设为 NULL
        }

    现在我们来查看是否存在窗口句柄,我们调用 DestroyWindow( hWnd )来尝试销毁窗口。如果不能的话弹出错误窗口,然后hWnd被设为NULL。

        if (hWnd && !DestroyWindow(hWnd))                    // 能否销毁窗口?
        {
    
            MessageBox(NULL,"释放窗口句柄失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
    
            hWnd=NULL;                            // 将 hWnd 设为 NULL
    
        }

    最后要做的事是注销我们的窗口类。这允许我们正常销毁窗口,接着在打开其他窗口时,不会收到诸如"Windows Class already registered"(窗口类已注册)的错误消息。

        if (!UnregisterClass("OpenG",hInstance))                // 能否注销类?
        {
            MessageBox(NULL,"不能注销窗口类。","关闭错误",MB_OK | MB_ICONINFORMATION);
    
            hInstance=NULL;                            // 将 hInstance 设为 NULL
        }
    }
  • 相关阅读:
    2017年第一篇博客--关于集成友盟和微信支付等遇到的坑
    【转】ArcGIS Server10.1安装常见问题及解决方案
    【转】C# GDAL 配置
    【转】Silverlight无法添加服务引用
    arcgis for js/flex/sl 该选哪一个?
    webgis开发-开始向JS转向
    形象解释C#、Net、Asp.net
    怎么区分odd和even
    Linux入门
    html网页访问WebAPI中的方法遇到的问题
  • 原文地址:https://www.cnblogs.com/fish7/p/3994927.html
Copyright © 2020-2023  润新知