mfc中使用OpenGL的方法

原创 2010年10月10日 12:50:00

以前使用win32,但是mfc还是方便些

新建一个类,用来封装opengl相关的信息,一般可直接使用该模式

class COpenGL

{

public:

    COpenGL(void);

    ~COpenGL(void);

   

    HDC hDC;

    HGLRC hRC;

    Void Init();

    bool SetupPixelFormat(HDC);

    void Reshape(int width,int height);

    void Render(void);  

};

 

COpenGL::COpenGL(void)

{

}

 

COpenGL::~COpenGL(void)

{

    wglMakeCurrent(hDC, NULL);

    wglDeleteContext(hRC);

}

 

bool COpenGL::SetupPixelFormat(HDC hDC0)

{

    int nPixelFormat;                 // 象素点格式

    hDC=hDC0;

    PIXELFORMATDESCRIPTOR pfd = {

       sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小

       1,                                // 版本号

       PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图

       PFD_SUPPORT_OPENGL |              // 支持OpenGL

       PFD_DOUBLEBUFFER,                 // 双缓存模式

       PFD_TYPE_RGBA,                    // RGBA 颜色模式

       24,                               // 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                           // 忽略层,可见性和损毁掩模

    };

    if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd)))

    { MessageBox(NULL,L"can not find proper mode",L"Error",MB_OK|MB_ICONEXCLAMATION);

    return FALSE;

    }

    SetPixelFormat(hDC,nPixelFormat,&pfd);

    hRC = wglCreateContext(hDC);         

    wglMakeCurrent(hDC, hRC);            

    return TRUE;

}

void COpenGL::Render()

{

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);        

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();                        

 

//在这里画自己的东西

    glColor3ub(255,0,0);

    glBegin(GL_POLYGON);//填充凸多边形

    glVertex3f(0.0f,0.0f ,0.0f);//a

    glVertex3f(1.0f,0.0f, 0.0f);//b

    glVertex3f(1.0f,1.0f,0.0f);//c

    glVertex3f(0.0f,1.0f,0.0f);//d

    glEnd();

   

 

    glFlush();

    SwapBuffers(hDC);

}

void COpenGL::Reshape(int width,int height)

{

    glViewport(0,0,width,height);         

    glMatrixMode(GL_PROJECTION);          

    glLoadIdentity();                 

    gluPerspective                        

       ( 60.0f,                       

       (GLfloat)width/(GLfloat)height,

       0.1f,                      

       100.0f                     

       ); 

    //gluLookAt(10,5,10,0,0,0,0,1,0);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

}

一般需要改变的主要render中的内容。

如果要加入动画控制,可在CopenGL类中包含动画所需参数,在CXXXview中的消息响应中使用

    ((CXXXApp*)AfxGetApp())->openGL

    来控制参数

//////////////////////////////////////////////////////

XXXapp.h

#include "OpenGL.h"

 

public:

COpenGL openGL;

 

重载OnIdle()

在此函数中渲染,即调用

openGL.Render();

//////////////////////////////////////////////////////

XXXview.h中初始化并加入自己的控制

WM_CREATE消息响应中:

((CXXXApp*)AfxGetApp())->openGL.SetupPixelFormat(::GetDC(m_hWnd));

OnInitialUpdate():

    ((CXXXApp*)AfxGetApp())->openGL.Init();

WM_SIZE消息响应中:

int height=cy;

    int width=cx;

    if (height==0){

       height=1;

    }

    ((CXXXApp*)AfxGetApp())->openGL.Reshape(width,height);

 

什么是MFC

经常在VC 中听别人讲MFC但一直不知道到底是什么意思,MFC简单来说就是VC的类库.MFC是一个编程框架 MFC (Microsoft Foundation Class Library)中的各种类结...
  • wenzhoufeng
  • wenzhoufeng
  • 2007年11月12日 11:04
  • 30552

MFC:一个最简单的例子

全部的代码如下:你只需将以上代码拷贝下来,在VC++6.0编译器,建一个Window32工程,使用MFC链接库#include <afxwin.h> class samp...
  • jiazhen
  • jiazhen
  • 2007年04月06日 16:50
  • 7506

MFC中对窗口贴图

一、要修改窗口的背景,步骤如下:1、导入一个位图文件。 2、创建一个View窗体的删除背景时的相应函数BOOL CWndMapView::OnEraseBkgnd(CDC* pDC)或者在view类的...
  • limeng_leo
  • limeng_leo
  • 2005年10月30日 00:27
  • 5537

MFC下CSocket编程详解

MFC下CSocket编程详解: 1. 常用的函数和注意事项(详细的函数接口说明请查看MSDN):    CSocket::Create 初始化(一般写服务器程序都不要用为好,用下面的 CSocket...
  • yejiansnake
  • yejiansnake
  • 2008年03月13日 09:01
  • 68601

MFC单文档应用程序显示图像

1 创建一个MFC单文档应用程序,
  • u011331383
  • u011331383
  • 2014年10月14日 20:15
  • 2302

MfC打开过程详解及应用

本文主要介绍:在MFC中,菜单打开的
  • hong__fang
  • hong__fang
  • 2014年11月23日 15:21
  • 2268

MFC-最简单的MFC程序

       尽管刚接触MFC不久,但其开发模式已初有感受,抛开复杂的应用不谈,想想我们通常怎样来写一个简单的MFC程序。也许浮现在你脑海里的是程序向导,类向导,资源编辑器,以及程序代码,此时你大概会...
  • linzhengqun
  • linzhengqun
  • 2007年12月13日 09:39
  • 10161

如何学好VC和MFC(各前辈学习方法及感受整理)

如何学好VC和MFC(各前辈学习方法及感受整理)(一) 序: 近来,在论坛上面几乎每天都可以看到很多的人提出如何学习MFC,学习MFC的确不是一件很容易的事情,加上成千上万的API函数和微...
  • ccf19881030
  • ccf19881030
  • 2012年09月15日 22:23
  • 22480

MFC+Opencv在单文档程序中显示出一幅图像

在MFC中显示一幅图像程序是十分复杂的,而在Opencv中读入一幅图像只需要一句话,而且很多的图像处理操作都需要使用Opencv中已有的函数,所以在MFC中调用Opencv的函数显示一幅图像是很必要的...
  • kuaiyangliukuai
  • kuaiyangliukuai
  • 2015年11月30日 20:45
  • 1956

改变MFC中MDI默认打开方式(ID_FILE_OPEN)

在App类的CxxxApp::OnFileOpen()方法里不要调用CWinApp::OnFileOpen,而是调用自己的文件选择框取得文件路径,然后调用CWinApp::OpenDocumentFi...
  • Mirage520
  • Mirage520
  • 2012年03月25日 01:40
  • 1607
收藏助手
不良信息举报
您举报文章:mfc中使用OpenGL的方法
举报原因:
原因补充:

(最多只允许输入30个字)