posts - 0,  comments - 0,  trackbacks - 0

MFC OpenGL 入门程序

创建步骤 :

1. 新建一个 MFC 向导程序 , 命名为 GLFrame, 单文档 , 去除打印支持 , 其余默认 , 生成一个 OpenGL 框架 .

2. 得到简单的窗口风格 .

   CMianFrame 中添加 PreCreateWindow 的代码 :

   BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 if( !CFrameWnd::PreCreateWindow(cs) )
  return FALSE;

 cs.cx =500;
 cs.cy =400;
 cs.lpszName =_T("OpenGL
框架程序 ");
 cs.style &=~FWS_ADDTOTITLE;//
不把标题加到标题栏
 return TRUE;
}

3. 添加 OpenGL 支持 :

CGLFrameView.h 中添加头文件如下 :

#include "gl\gl.h"
#include "gl\glu.h"
#include "gl\glaux.h"

在工程 -> 设置 ->Project Settings 对话框话中选择 Link 选项卡 , 在对象模块库中加入 glaux.lib  glu32.lib opengl32.lib .

(TIP: 当然 , 你也可以选择工程 -> 添加到工程 -> 添加文件命令 , 弹出的 Insert Files into Project 对话框中 , 转换到 VC98\lib 目录下面 , 选中 glaux.lib , glu32.lib, opengl32.lib 这几个文件 , 按下 OK, 把它们添加到项目文件 .)

以下操作均在 CGLFrameView 中进行

4. 给视图添加一个 RC 句柄 , 一个公共的变量

class CGLFrameView:public CView

{

public:

   ...// 其他变量

   HGLRC hglrc;

   ...// 其他变量

}

5. 给视图添加消息处理 :

使用 ClassWizard 添加 WM_CREATE,WM_DESTROY,WM_SIZE 这三个消息的处理函数 .

6. 修改 CGFrameView PreCreateWindow() 函数如下 :

BOOL CGLFrameView::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

 cs.style |=WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
 return CView::PreCreateWindow(cs);
}

7. 修改 CGFrameView OnCreate() 函数如下 :

int CGLFrameView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;
//=================================== 
 PIXELFORMATDESCRIPTOR pfd=
 {
  sizeof(PIXELFORMATDESCRIPTOR),
  1,
  PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
  PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI,
  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
 };

 CClientDC clientdc(this);
 int pf =ChoosePixelFormat(clientdc.m_hDC,&pfd);
 BOOL rt=SetPixelFormat(clientdc.m_hDC,pf,&pfd);
 hglrc=wglCreateContext(clientdc.m_hDC);
//======================================================= 
 return 0;
}
8. 修改 CGFrameView OnDestroy() 函数如下 :

void CGLFrameView::OnDestroy()
{
 CView::OnDestroy();
 
 // TODO: Add your message handler code here
 if(wglGetCurrentContext()!=NULL)
  wglMakeCurrent(NULL,NULL);
 if(hglrc!=NULL)
 {
  wglDeleteContext(hglrc);
  hglrc=NULL;
 }
}

9. 修改 CGFrameView OnSize() 函数如下 :

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

 GLsizei w=cx;
 GLsizei h=cy;
 if(!h)
  return ;
 CClientDC clientDC(this);
 wglMakeCurrent(clientDC.m_hDC,hglrc);
 glViewport(0,0,w,h);
 wglMakeCurrent(NULL,NULL);
/**/ 
 
}

posted on 2007-02-05 02:45 亮子 阅读(262) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(1)

文章档案

搜索

  •  

最新评论