VC++6.0中OpenGL应用程序开发

1. Win32控制台方式

建立Win32 控制台程序,在头文件中加入

#include <windows.h> 
#include <wingdi.h> 
#include <GL/gl.h> 
#include <GL/glu.h >  
#include <GL/glaux.h>

2. MFC方式

(1)采用VC AppWizard向导创建空的MFC(EXE)工程框架,整个过程总共6步,值得指出的是一般情况下在向导的第1步选择创建工程的模式都为单文档,以下的步骤中假设创建的工程名为First.

(2)设置所创建工程的Link属性。打开工程/设置/连接,在对象/库模块中加入opengl32.lib glu32.lib glaux.lib.

(3)在视图类(View)的头文件(Firstview.h)中加上:

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

(4)在视图类的实现文件Firstview.cpp中处理成员函数PreCreatWindow(),加上如下代码:

  cs.style |=WS_CLIPISBLINGS|WS_CLIPCHILDREN|CS_OWNDC;

用来设置OpenGL绘图窗口的风格

(5)在视图类的实现文件Firstview.cpp中处理成员函数OnCreate,来创建OpenGL的绘图设备

OpenGL绘图的机制是:先用OpenGL的绘图上下文Rendering Context(简称为RC)把图画好,再把所绘结果通过SwapBuffers()函数传给Window的绘图上下文DeviceContext(简称为DC)。要注意的是,程序运行过程中,可以有多个DC,但只能有一个RC。因此当一个DC画完图后,要立即释放RC,以便其他的DC也使用。在后面的代码中将有详细解释。

int CFirstView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

     InitializeOpenGL();
     return 0;
}

void CFirstView::InitializeOpenGL()
{
    m_pDC=new CClientDC(this);      // 创建OpenGL设备描述表
    ASSERT(m_pDC!=NULL);
    
    If(!SetupPixelFormat())         // 设置象素格式
        return;
               
    m_hRC=::wglCreateContext(m_pDC->m_hDC);  // 创建OpenGL渲染描述表
    ::wglMakeCurrent(m_pDC->m_hDC,m_hRC);    // 将RC与DC关联起来
}

BOOL CFirstView::SetupPixelFormat()
{
    static PIXELFORMATDESCRIPTOR pfd=
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW |
        PFD_SUPPORT_OPENGL |
        PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        24,
        0,0,0,0,0,0,
        0,
        0,
        0,
        0,0,0,0,
        32,
        0,
        0,
        PFD_MAIN_PLANE,
        0,
        0,0,0
    };

    int m_PixelFormat;
    if({m_PixelFormat=ChoosePixelFormat(m_pDC->m_hDC,&pfd)==0)
    {
        MessageBox(“OpenGL的像素选择格式失败“);
        return FALSE;
    }
    
    if(SetPixelFormat(m_pDC->m_hDC,m_PixelFormat,&pfd))==FALSE)
    {
        MessageBox(“OpenGL的像素格式的设置失败“);
        return FALSE;
    }
    return TRUE;
}

int CFirstView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    gl_Init();
    return 0;
}

void CFirstView::gl_Init()
{
    //下面的结构说明绘图设备的像素格式
    PIXELFORMATDESCRIPTOR pfd={
    sizeof(PIXELFORMATDESCRIPTOR), //数据结构大小
    1,                             //数据结构版本号
    PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,                 //缓冲区可以在窗口上绘图,支持OpenGL绘图
    24,                            //深度颜色缓冲区位数
    0,0,0,0,0,0,                   //忽略颜色位
    0,0,0,                         //没有非透明度缓存,忽略移位位,无累加缓存
    0,0,0,0, //忽略累加位
    32, //32位深度缓存
    0, //无模板缓存
    0, //无辅助缓存
    PFD_MAIN_PLANE, //主层
    0, //保留
    0,0,0, //忽略层,可见性和损毁掩膜
    };
    
    //得到当前正在使用的绘图设备句柄
    m_hDC=GetDC()->GetSafeHdc();
    //根据当前绘图设备的特性,为之选择一个与pfd所指定的格式相匹配
    //的像素格式,存于nPixelFormat中
    int nPixelFormat=::ChoosePixelFormat(m_hDC,&pfd);
    //将当前绘图设备的像素格式设为nPixelFormat
    ::SetPixelFormat(m_hDC,nPixelFormat,&pfd);
    //根据当前绘图设备,创建一个像素格式与之匹配的OpenGL的图形操作设备表
    m_hRC=::wglCreateContext(m_hDC);
    /*指定OpenGL的图形操作设备表是m_hRC,并且建立它与当前绘图设备
    m_hDC间的连接,下列函数执行后,所有绘图命令的结果都出现在设
    备m_hDC上*/
    
    ::wglMakeCurrent(m_hDC,m_hRC);
}

(6)在文件Firstview.cpp中处理OnDestroy(),在程序退出时处理该函数,以释放在程序启动时所申请的OpenGL变量(包括RC,DC等)。

void CFirstView::OnDestroy()
{
    CView::OnDestroy();

    ::wglMakeCurrent(m_pDC->m_hDC,NULL);    // 释放与m_hDC 对应的 RC
    ::wglDeleteContext(m_hRC);
    if(m_pDC)
    delete m_pDC; // 删除当前 View 拥有的 DC
}

(7)在文件Firstview.cpp中处理OnEraseBkgnd()

BOOL CFirstView::OnEraseBkgnd(CDC* pDC)
{
    // return CView::OnEraseBkgnd(pDC);
    return TRUE;
}

(8)在文件Firstview.cpp中处理OnDraw ()

void CFirstView::OnDraw(CDC* pDC)
{
    CVaseModelDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
    wglMakeCurrent(m_pDC->m_hDC,m_hRC); // 使RC与当前DC 相对应
    myDrawScene();                      //具体的绘图函数,在RC中绘制
    SwapBuffers(m_pDC->m_hDC);          //把RC中所绘传的到当前的DC上,从而在屏幕上显示
    wglMakeCurrent(m_pDC->m_hDC,NULL);  // 释放与m_hDC 对应的 RC
}

(9)在文件Firstview.cpp中处理RenderScene()

BOOL CFirstView::myDrawScene()
{
    glClearColor(0.0f, 0.0f, 0.0f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_LINES);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.0f,0.0f,0.0f);
    glVertex3f(1.0f,1.0f,0.0f);
    glEnd();
    glBegin(GL_LINES);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(0.0,0.0,0.0);
    glVertex3f(1.0,-1.0,0.0);
    glEnd();

    glFlush ();
    return TRUE;
}

(10)在文件Firstview.cpp中处理OnSize(),该函数响应窗口缩放事件,因此所显示图形可以跟随窗口的缩放而等比缩放。

void CVaseModelView::OnSize(UINT nType, int cx, int cy)
{
    CView::OnSize(nType, cx, cy);

    glViewport(0,0,cx,cy);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(cx<=cy)
        glOrtho(-1.50*cx/cy,1.50*cx/cy,-1.50,1.50,-10.0,10.0);
    else
        glOrtho(-1.50,1.50,-1.50*cy/cx,1.50*cy/cx,-10.0,10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
     
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    myDrawScene();
}

注:定义  HDC m_hDC;或CDC* m_hDC;

时间: 2024-10-05 05:31:46

VC++6.0中OpenGL应用程序开发的相关文章

(转)VC6.0中OpenGL开发环境配置

首先简单介绍一下OpenGL: OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性.       OpenGL官方网站(英文)    http://www.opengl.org 然后设置编程的一些环境,及其安装必备文件的步骤如下: 第一步:选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的.但这里我们选择VC++ 6.0作为学习OpenGL的环

介绍静态链接库和动态链接库的区别,及在VC++6.0中的建立和使用

首先介绍一下链接库:链接库分为动态链接库和静态链接库两种 LIB是静态链接库,在程序编译连接的时候是静态链接,其对应的文件格式是.lib.即当程序采用静态链接库的时候,.lib文件中的函数被链接到最终的可执行文件中,因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行. DLL是动态链接库,在程序运行的时候被调用,其对应的文件的格式是.dll.即当程序采用动态链接的时候,.dll文件中的函数并没有被链接到可执行文件中,可执行文件只是保存了函数的地址信息.但是

在VC++6.0中给对话框设置背景色或者背景图片

/*********************************************************** *说明: 在VC++6.0中给对话框设置背景色或者背景图片 *备注:测试代码的对话框程序的工程名为:BJ *原理:在OnPaint()中加入代码 ***********************************************************/ // 注意:去掉相应以 /* */ 注释的注释符号后代码生效 void CBJDlg::OnPaint() {

[转]Microsoft Platform SDK 选择及在vc++6.0中的配置

Windows Platform SDK Download Sites: Windows Server 2003 PSDK February 2003 Edition,可以和VC6一起使用.并支持各种目标OS的最后一个版本的SDK. This edition of the SDK supports development for the following platforms: Windows Server 2003 Windows Advanced Server, Limited Editio

VC++ 6.0 中使用 MSComm.ocx

很多人喜欢单独安装VC++6.0,而不是完整安装VS,这样占用空间比较少,启动也快.但是要使用某些ActiveX控件的时候却会出现许可证问题(requires a design-time licence),譬如使用MSComm.ocx.至于ActiveX的许可证体系这里就不说了,简单说就是用来保证第三方ActiveX控件开发者的智力投资的.MSComm.ocx是VS自带的一个进行串口通讯的控件,本来在安装VS的时候会自动把相应的licence发放给用户,但是这个licence是由VB附带提供的,

图解VC++6.0和ACE 5.4 开发入门

一 工具和下载 工具和环境: Win7, VC++6, ACE5.4 可在Win7下运行的VC6下载: http://blog.csdn.net/bcbobo21cn/article/details/44200205 ACE安装包和本文demo代码下载: http://pan.baidu.com/s/1kUUOOlh 注意有两个ace安装包,5.4是dsw的工程,6.3是sln的工程 二 安装环境 下载ace54,解压: 在vc6.0中打开ace源码: 2个工程:网上资料有说3个工程: 在工程中

VC 6.0中添加库文件和头文件 【转】

本文转载自:http://blog.sina.com.cn/s/blog_9d3971af0102wxjq.html 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在“Project Setting>C/C++ >Category:(选Preprocessor)>Additional include directories”处添加附加头文件目

VC++6.0中不兼容问题

记得上次用VC++6.0已经是很长一段时间之前的事情了.这次由于需要学习计算机图形学,要开始学这写一些算法之类的,我又开始了VC++之旅. 重新安装一个vc++,我用的是Visual C++ 6.0(完整绿色版) 安装  .我有一个习惯,就是每当自己要用某些软件时,我将它安装到电脑之后,会保存好安装包,这样以后如果出了什么故障,我也可以有的东西重新安装. 安装好了之后,便开启,这个时候它会提醒你兼容性问题,此时,根据你桌面上生成的快捷方式,找到MSDEV.exe文件,右键属性 将名称改变,然后点

如何使用DotNet 2.0中的应用程序配置 Settings.settings

对于桌面应用程序,常常会需要记录一些用户配置信息,早期的做法一般是使用读写INI文件的办法.    对于.NET应用程序,并没有提供直接操作INI文件的类,需要调用Win32API,具体办法可以参考:http://www.blogcn.com/user52/seabluescn/blog/23969537.html 可以看到这种办法比较麻烦. 随着.NET Framerwork 2.0 的出现,对应用程序设置提供了内在的支持,现在读写配置信息要简单方便得多了. 1.新建工程,打开Properti