VC6.0中基于MFC 和OpenGL的图形编程

合集下载

如何在vc++6.0里面使用openGl

如何在vc++6.0里面使用openGl

如何在vc++6.0里面使用openGl?你既可以建立Win32项目使用API,也可以建立MFC工程(一般不用MFC框架直接用API)我给你一个例子吧,建立Win32空项目,添加一个cpp文件,编译执行就行了(这是一个经典的opengl框架了)代码如下:#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")#pragma comment(lib,"glaux.lib")#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glaux.h>HDC hDC=NULL;HGLRC hRC=NULL;HWND hWnd=NULL;HINSTANCE hInstance;BOOL keys[256];BOOL active=TRUE;BOOL fullscreen=TRUE;GLfloat rtri;GLfloat rquad;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);GLvoid ResizeGLScene(GLsizei width,GLsizei height){if(height==0)height=1;glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}int InitGL(GLvoid){glShadeModel(GL_SMOOTH);glClearColor(0.0f,0.0f,0.0f,0.5f);glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); return TRUE;}int DrawGLScene(GLvoid){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity();glTranslatef(-1.5f,0.0f,-6.0f);glRotatef(rtri,0.0f,1.0f,0.0f);glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f(-1.0f,-1.0f,1.0f); glEnd();glLoadIdentity(); glTranslatef(1.5f,0.0f,-7.0f); glRotatef(rquad,1.0f,1.0f,1.0f); glBegin(GL_QUADS); glColor3f(0.0f,1.0f,0.0f); glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(1.0f,1.0f,1.0f);glColor3f(1.0f,0.5f,0.0f); glVertex3f(1.0f,-1.0f,1.0f); glVertex3f(-1.0f,-1.0f,1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f); glVertex3f(1.0f,1.0f,1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(-1.0f,-1.0f,1.0f); glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,1.0f,0.0f);//glVertex3f(1.0f,-1.0f,-1.0f); //glVertex3f(-1.0f,-1.0f,-1.0f); //glVertex3f(-1.0f,1.0f,-1.0f); //glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glVertex3f(1.0f,1.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glEnd();rtri+=0.2f;rquad-=0.15f;return TRUE;}GLvoid KillGLWindow(GLvoid){if(fullscreen){ChangeDisplaySettings(NULL,0);ShowCursor(TRUE);}if(hRC){if(!wglMakeCurrent(NULL,NULL))MessageBox(NULL,"释放DC或RC失败","关闭错误",MB_OK|MB_ICONINFORMA TION);if(!wglDeleteContext(hRC))MessageBox(NULL,"释放RC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hRC=NULL;}if(hDC && !ReleaseDC(hWnd,hDC)){MessageBox(NULL,"释放DC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hDC=NULL;}if(hWnd && !DestroyWindow(hWnd)){MessageBox(NULL,"释放窗口句柄失败","关闭错误",MB_OK|MB_ICONINFORMA TION); hWnd=NULL;}if(!UnregisterClass("OpenG",hInstance)){MessageBox(NULL,"不能注销窗口类","关闭错误",MB_OK|MB_ICONINFORMATION); hInstance=NULL;}}BOOL CreateGLWindow(char* title,int width,int height,int bits,BOOL fullscreenflag){GLuint PixelFormat;WNDCLASS wc;DWORD dwExStyle;DWORD dwStyle;RECT WindowRect;WindowRect.left=(long)0;WindowRect.right=(long)width;WindowRect.top=(long)0;WindowRect.bottom=(long)height;fullscreen=fullscreenflag;hInstance=GetModuleHandle(NULL);wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;wc.lpfnWndProc=(WNDPROC)WndProc;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hInstance=hInstance;wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hbrBackground=NULL;wc.lpszMenuName=NULL;wc.lpszClassName="OpenG";if(!RegisterClass(&wc)){MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONINFORMATION); return FALSE;}if(fullscreen){DEVMODE dmScreenSettings;memset(&dmScreenSettings,0,sizeof(dmScreenSettings));dmScreenSettings.dmSize=sizeof(dmScreenSettings);dmScreenSettings.dmPelsWidth=width;dmScreenSettings.dmPelsHeight=height;dmScreenSettings.dmBitsPerPel=bits;dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCE SSFUL){if(MessageBox(NULL,"全屏模式设置失败!\n使用窗口模式?","OpenGL 3D游戏编程",MB_YESNO|MB_ICONEXCLAMA TION)==IDYES){fullscreen=FALSE;}else{MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}}}if(fullscreen){dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;ShowCursor(FALSE);}else{dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;dwStyle=WS_OVERLAPPEDWINDOW;}AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);if(!(hWnd=CreateWindowEx(dwExStyle,"OpenG",title,dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,0,0,WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL))){KillGLWindow();MessageBox(NULL,"窗口创建失败","错误",MB_OK|MB_ICONINFORMATION);return FALSE;}static PIXELFORMA TDESCRIPTOR pfd={sizeof(PIXELFORMA TDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,bits,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,PFD_MAIN_PLANE,0,0,0,0};if(!(hDC=GetDC(hWnd))){KillGLWindow();MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))){KillGLWindow();MessageBox(NULL,"不能创建一个匹配的像素格式","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!SetPixelFormat(hDC,PixelFormat,&pfd)){KillGLWindow();MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONINFORMATION); return FALSE;}if(!(hRC=wglCreateContext(hDC))){KillGLWindow();MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!wglMakeCurrent(hDC,hRC)){KillGLWindow();MessageBox(NULL,"不能激活当前的OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}ShowWindow(hWnd,SW_SHOW);SetForegroundWindow(hWnd);SetFocus(hWnd);ResizeGLScene(width,height);if(!InitGL()){KillGLWindow();MessageBox(NULL,"初始化失败","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_ACTIV ATE:{if(!HIWORD(wParam))active=TRUE;elseactive=FALSE;return 0;}case WM_SYSCOMMAND:{switch(wParam){case SC_SCREENSA VE:case SC_MONITORPOWER:return 0;}break;}case WM_CLOSE:{PostQuitMessage(0);return 0;}case WM_KEYDOWN:{keys[wParam]=TRUE;return 0;}case WM_KEYUP:{keys[wParam]=FALSE;return 0;}case WM_SIZE:{ResizeGLScene(LOWORD(lParam),HIWORD(lParam));return 0;}}return DefWindowProc(hWnd,uMsg,wParam,lParam);}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){MSG msg;BOOL done=FALSE;if(MessageBox(NULL,"你想在全屏模式下运行吗?","设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO){fullscreen=FALSE;}if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;while(!done){if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){if(msg.message==WM_QUIT)done=TRUE;else{TranslateMessage(&msg);DispatchMessage(&msg);}}else{if(active){if(keys[VK_ESCAPE])done=TRUE;else{DrawGLScene();SwapBuffers(hDC);}}if(keys[VK_F1]){keys[VK_F1]=FALSE;KillGLWindow();fullscreen=!fullscreen;if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;}}}KillGLWindow();return msg.wParam;}。

基于MFC的OpenGL绘图

基于MFC的OpenGL绘图

基于MFC的OpenGL绘图本文更新版本请点击[置顶]《基于MFC的OpenGL编程》系列文章一、简介GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。

每一个GDI命令需要传给它一个DC,但与GDI不同,OpenGL使用当前绘制环境(RC)。

一旦在一个线程中指定了一个当前RC,在此线程中其后所有的OpenGL命令都使用相同的当前RC。

虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。

下面我将首先产生一个OpenGL RC并使之成为当前RC,这将分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC。

二、MFC中的OpenGL基本框架1、首先创建工程用AppWizard产生一个MFC EXE项目,其他默认即可。

2、将此工程所需的OpenGL文件和库加入到工程中在工程菜单中,选择"Build"下的"Settings"项。

单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"opengl32.lib glu32.lib glut.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),选择"OK"结束。

然后打开文件"stdafx.h",加入下列头文件:#include <gl\gl.h>#include <gl\glu.h>3、改写OnPreCreate函数并给视图类添加成员函数和成员变量OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。

VC++6.0-MFC编程实例

VC++6.0-MFC编程实例

第10章 Visualห้องสมุดไป่ตู้C++编程实例
//框架窗口类的成员函数 void CMyWnd::OnLButtonDown(UINT nFlags,CPoint point) {
if(m_nBubbleCount<MAX_BUBBLE) {
int r=rand()%50+10; CRect rect(point.x-r,point.y-r,point.x+r,point.y+r); m_rectBubble[m_nBubbleCount]=rect; m_nBubbleCount++; InvalidateRect(rect,FALSE); }
图 10-1
第10章 Visual C++编程实例
一个MFC程序运行的一般过程如下: (1) 生成CwinApp的一个实例(调用CwinApp的构造函数),
初始化全局对象; (2) Win32入口程序函数WinMain调用函数AfxWinMain; (3) AfxWinMain调用函数CwinApp的成员函数InitInstance; (4) AfxWinMain调用函数CwinApp的成员函数Run; (5) AfxWinMain函数返回到WinMain,WimMain结束,程
第10章 Visual C++编程实例
第10章 Visual C++编程实例
10.1 MFC编程流程 10.2 常用MFC类和消息处理 10.3 对话框的应用 10.4 菜 单 的 应 用 10.5 工具栏应用
第10章 Visual C++编程实例
10.1 MFC编程流程
在普通的C/C++程序中,可以看到程序从main函数 开始到结束的所有代码,但在Visual C++中MFC封装了 一部分类,同时也隐藏了一部分代码,因此我们看不 到源程序的所有代码,例如从项目的所有源文件中找 不到main函数。

手把手教你搭建用MFC进行OpenGL编程的框架

手把手教你搭建用MFC进行OpenGL编程的框架

手把手教你搭建用MFC进行OpenGL编程的框架手把手教你搭建用MFC进行OpenGL编程的框架第一步:创建项目文件File || New || Project || MFC AppWizard (exe) || 输入Project Name || 创建一个基于SDI,View类基于CView的工程文件;第二步:向项目文件中添加OpenGL的绘图函数Project || Settings || 在Object/library modules:中输入opengl32.lib,glu32.lib,glaux.lib,三者之间用空格隔开,逗号不用输入;第三步:添加一些代码1)在项目工作区的FileView中找到StdAfx.h,添加下面的代码:#include#include#include2)在项目工作区的ClassView中找到CView类,右击CView类,选择Add Member Vairable,添加一个成员变量HGLRC m_hRC;选择Add Member Founction,添加一个成员函数void DrawScene();3)在项目工作区的ClassView中找到CView类,右击CView类,选择Add Windows Message Handler,为CView类添加WM_CREATE,WM_DESTORY(方法:在左边的New windows message/events中选中并双击,然后点击OK)。

在项目工作区的ClassView中找到CView类,找到函数OnCreate(),在该函数中添加如下代码://定义像素存储格式PIXELFORMATDESCRIPTOR pfd={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,PFD_TYP E_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 dc(this);int pixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);BOOL success=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd); m_hRC=wglCreateContext(dc.m_hDC);同理找到函数OnDestory(),在该函数中添加下面的代码:wglDeleteContext(m_hRC);4)在类CView中的函数PreCreateWindows()中添加下面的代码: cs.style|=(WS_CLIPSIBLINGS|WS_CLIPCHILDREN);5)在类CView中的函数OnDraw()中添加下面的代码:wglMakeCurrent(pDC->m_hDC,m_hRC);DrawScene();//用户自定义的场景绘制函数wglMakeCurrent(pDC->m_hDC,NULL);这样,一个基于OpenGl标准的程序框架已经构造好了,用户只需在DrawScene()函数中添加程序代码即可。

VC(MFC)开发OPENGL程序

VC(MFC)开发OPENGL程序

VC(MFC)开发OPENGL程序作者:李英江日期: 2006-08-10 19:07:00网站:转载请保留作者内容!利用使用VC开发OPENGL程序,运用MFC库,做一个简单例子我简单介绍一下图形接口,现在流行的两大图形接口Direct3D 和OpenGL,Direct3D主要是针对游戏,像starcaft星际争霸,它支持DX5.0以上的版本,但是不少游戏同时支持两种图形加速,如CS,魔兽争霸。

OpenGL主要是针对专业的图形应用,在军事,医学,GIS地理信息系统,动画(3dsmax,maya...),电影,等应用广泛,并且可以在不同的平台上应用,DX相对来说就只能限于Windows操作系统了。

1.运用MFC向导,生成一个单文档应用程序,不做任何事的MFC 框架程序。

2.视图类中添加窗口样式。

/************************************************************** *******/BOOL CMfc_basicView::PreCreateWindow(CREATESTRUCT& cs){// Add Window styles required for OpenGL before window iscreatedcs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CS_OWNDC);return CView::PreCreateWindow(cs);}/************************************************************** *******/3.在afxcmn.h中包含OPENGL头文件。

/************************************************************** *******/#include <afxcmn.h>// MFC support for Windows Common Controls// Inserted these files for openGL#include <gl.h>#include <glut.h>#include <glu.h>#include <glaux.h>#endif // _AFX_NO_AFXCMN_SUPPORT/************************************************************** *******/4.视图类中 .h文件中加入四个public 成员变量/************************************************************** *******/HGLRC m_hRC; // Permanent Rendering ContextHDC m_myhDC; // Private GDI Device Contextint m_height; // Stores the height of the Viewint m_width; // Stores the width of the view/************************************************************** *******/5.视图类中右键添加一个BOOL成员函数SetupPixelFormat/************************************************************** *******/BOOL COglm_demoView::SetupPixelFormat(){GLuint PixelFormat;static PIXELFORMATDESCRIPTOR pfd= {sizeof(PIXELFORMATDESCRIPTOR),// Size Of This Pixel Format Descriptor1,// Version Number (?)PFD_DRAW_TO_WINDOW | // Format Must Support WindowPFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format24, // Select A 24Bit Color Depth0, 0, 0, 0, 0, 0, // Color Bits Ignored (?)0, // No Alpha Buffer0, // Shift Bit Ignored (?)0, // No Accumulation Buffer0, 0, 0, 0, // Accumulation Bits Ignored (?)16, // 16Bit Z-Buffer (Depth Buffer)0, // No Stencil Buffer0, // No Auxiliary Buffer (?)PFD_MAIN_PLANE, // Main Drawing Layer0, // Reserved (?)0, 0, 0 // Layer Masks Ignored (?)};m_myhDC = ::GetDC(m_hWnd); // Gets A Device Context For The WindowPixelFormat = ChoosePixelFormat(m_myhDC, &pfd); // Finds The Closest Match To The Pixel Format We Set Aboveif (!PixelFormat){::MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);// This Sends A 'Message' Telling The Program To Quitreturn false ; // Prevents The Rest Of The Code From Running}if(!SetPixelFormat(m_myhDC,PixelFormat,&pfd)){::MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}m_hRC = wglCreateContext(m_myhDC);if(!m_hRC){::MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}if(!wglMakeCurrent(m_myhDC, m_hRC)){::MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);PostQuitMessage(0);return false;}// Now that the screen is setup we can// initialize OpenGL();InitGL();return true;}/************************************************************** *******/6.关闭WM_ERASEBACKGROUND消息,不关闭的话,画图时会闪动.在视图类中选择“Add Windows Message Handler”加入消息处理函数./************************************************************** *******/BOOL CMfc_basicView::OnEraseBkgnd(CDC* pDC){return FALSE;}/************************************************************** *******/7.初始化OPENGL 添加InitGL()函数./************************************************************** *******/void CMfc_basicView::InitGL(){// Enables Depth TestingglEnable(GL_DEPTH_TEST);// Enable the point size for selected pointsglPointSize(5.0f);// This Will Clear The Background Color To BlackglClearColor(.4, 0.2, 0.0, 0.0f);// Reset the current projection matrixSetProjection();glMatrixMode(GL_MODELVIEW);glLoadIdentity();//Enable back face culling, defaults to Clock wise vertices.glEnable(GL_CULL_FACE);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glShadeModel(GL_SMOOTH);glPolygonMode(GL_FRONT, GL_FILL);}/************************************************************** *******/8. 在视图类中添加调窗口大小的处理函数OnSize() 消息句柄/************************************************************** *******/void CMfc_basicView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);glMatrixMode(GL_MODELVIEW);glLoadIdentity();// Make the rendering context currentwglMakeCurrent(m_myhDC,m_hRC);// Reset The Current Viewport And Perspective TransformationglViewport(0, 0, cx, cy);m_height= cy;m_width = cx;// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)cx/(GLfloat)cy,0.1f,1000.0f);}9.添加SetPorjection()函数void CMfc_basicView::SetProjection(){glViewport(0, 0, m_width, m_height);// Reset The Projection MatrixglMatrixMode(GL_PROJECTION);glLoadIdentity();// It's a perspective projection// Calculate The Aspect Ratio Of The WindowgluPerspective(60.0f,(GLfloat)m_width/(GLfloat)m_height, 0.1f,3000.0f);}/************************************************************** *******/10.在Project 菜单选择Settings. 单击Link 选项页Object/library Module添加库文件.opengl32.lib glu32.lib glut.lib glaux.lib11.在视图类中加入OnCreate消息句柄/*********************************************************************/int CMfc_basicView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;SetupPixelFormat();wglMakeCurrent(NULL,NULL);return 0;}/************************************************************** *******///现在编译程序的话,会看到一个无法刷新的应用程序了。

基于MFC的OpenGL简易绘图系统

基于MFC的OpenGL简易绘图系统

基于MFC的OpenGL简易绘图系统作者:尤王杰来源:《计算机应用文摘》2022年第07期关键词:MFC;OpenGL;绘图系统;C++面向对象中图法分类号:TP391 文献标识码:A1概述MFC 是微软公司开发的一个类库,以C++类的形式封装了Windows 的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。

其中,MFC包含大量Windows 句柄封装类和很多Windows 的内建控件和组件的封装类[1] 。

OpenGL 是一个开放式图形库,是用于渲染2D 和3D 矢量图形的跨语言、跨平台的应用程序编程接口,是一个功能强大、支持底层绘制和造型能力的软件图形函数库。

它独立于硬件和窗口系统,为程序员进行图形学相关的程序编写提供了极大的帮助[2] 。

绘图软件一般指基于计算机绘制图形的软件,如Windows 自带的画图软件等。

它的开发语言和技术已经十分成熟。

本系统实现了基于基本类库MFC 和OpenGL 图形库面向对象的二维图形绘制应用程序,可以实现绘图的功能同时也可以让软件开发人员对软件开发过程有进一步了解。

2软件开发环境软件主要使用C++编程语言编写,使用了C++的基本库类MFC 和图形库OpenGL 以及C++常用库;开发软件的操作系统环境为Windows 10;软件的集成开发环境为Viusal Studio 2017;软件开发的硬件环境为16GB 内存,intel Core i5⁃9400F CPU(2.9GHz);软件支持跨平台使用,可以在不同操作系统中实现功能,同时可以进行本地保存[3] 。

3系统框架设计本系统采用了C++编程语言以及面向对象的编程风格,其基本思想是将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。

通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。

同时,面向对象能有效提高编程的效率,通过封装技术,可以更高效地开发出一个全新的系统[4] 。

实验一vc6.0opengl绘图环境及简单图形的输出

实验一vc6.0opengl绘图环境及简单图形的输出

任课教师:马文娟《3D图形学》(2013-2014学年第1学期)实验报告学号:姓名:班级:实验一VC++6.0+OpenGL绘图环境及简单图形的输出一、实验目的1、熟练使用实验主要开发平台VC++6.0;2、进一步熟悉OpenGL的主要功能;3、掌握OpenGL的绘图流程和原理;4、掌握OpenGL的基本数据类型、核心函数的使用。

二、实验内容创建一个OpenGL工程,利用OpenGL库函数进行简单图形设计与绘制。

三、实验原理1、基本语法(C版本下的OpenGL语法)OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。

OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。

一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式,如glColor3b()、glColor3d()、glColor3f()和glColor3bv ()等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。

OpenGL定义了一些特殊标识符,如GLfloat、GLvoid,它们其实就是C中的float 和void。

2、程序的基本结构OpenGL程序的基本结构可分为三个部分:1)第一部分是初始化,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA 或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验、裁剪等。

这些状态一般都用函数glEnable(…)、glDisable(…)来设置,“…”表示特定的状态。

2)第二部分设置观察坐标系下的取景模式和取景框位置大小,主要利用了三个函数:函数void glViewport(left, top, right, bottom) 设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以像素表示);函数void glOrtho(left, right, bottom, top, near, far) 设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;函数void gluPerspective(fovy, aspect, zNear, zFar) 设置投影方式为透视投影,其取景体积是一个截头锥体。

VC环境下基于OPenGLl的程序步骤

VC环境下基于OPenGLl的程序步骤

VC 环境下基于OpenGL 的编程步骤下面介绍在VC 环境中建立基于OpenGL 标准的应用程序框架的具体方法与步骤:1. 创建项目文件:选择File /New 菜单选项,建立一个名为MyTest 项目文件,MyTest 基于单文档(SDI),View 类基于Cview。

2. 选择Build /Setting 菜单选项,在Link 栏的Lib 输入域中添加openg132.lib、glu32.lib,若需使用OpenGL 的辅助库函数,则还需添加glut32.lib。

3. 选择View /ClassWizard 菜单选项,打开MFC 对话框,在ClassName 栏中选择CMyTestView 类,进行以下操作:1) 选择WM_CREATE 消息,鼠标单击EditCode,将OpenGL 初始化代码添加到OnCreate() 函数中:/*定义像素存储格式*/PIXELFORMATDESCRIPTOR pfd={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,032,0,0,PFD_MAIN_PLANE,0,0,0,0};CCLient dc(this);int pixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);BOOL success=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);m_hRC=wglCreateContext(dc.m_hDC);(可以自己定义一个初始化函数(init()),将上述代码进行封装)2) 选择WM_DESTORY消息,在OnDestory()中添加以下代码:wglDeleteContext(m_hRC);3) 在MyTestView.cpp中,将以下代码添加到PreCreateWindows()函数中:cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效;4) 在MyTestView.cpp中,将以下代码添加到OnDraw()函数中:wglMakeCurrent(pDC->m_hDC,m_hRC);DrawScene(); //用户自定义函数,用于绘制三维场景;wglMakeCurrent(pDC->m_hDC,NULL);5) 在MyTestView.cpp中,添加成员函数DrawScene():void CMyTestView::DrawScene(){/*绘制三维场景*/}6) 选择WM_SIZE 消息,鼠标单击EditCode,在OnSize()中添加观察变换函数。

实验一 opengl高级图形图像实验报告

实验一 opengl高级图形图像实验报告

高级图形图像第一次实验报告一、实验描述以及关键步骤1.opengl编程环境组建(基于VC6.0)1)下载opengl开发库文件夹;2)复制glut32.dll和glut.dll到…\windows\system32;3)复制glut.h到...\Microsoft Visual Studio\VC98\Include\GL;4)复制glut32.lib和glut.lib到…\Microsoft Visual Studio\VC98\Lib;5)新建工程后,进入Project菜单,选Settings项,弹出 Settings 对话框,选Link项,在 Libraries 栏目中加入OpenGL库:opengl32.lib glu32.lib glaux.lib。

2.基本图形绘制首先运行一个Windows环境下的一个基本OpenGL程序,直接打开60version文件夹内的工程,它将显示一个空的OpenGL窗口,可以在定制窗口大小和全屏模式下切换(按F1),按ESC退出,该程序为以后的应用程序提供了实验平台,并预留了绘图接口。

根据教材P67-70,了解绘制函数,根据附件2提供的源码baseshape.cpp,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,修改图形绘制命令和参数,显示出点、线、矩形、三角形等,可设置不同线宽。

3.图形的二维变换根据附件3提供源码,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,通过调用glTranslate*, glRotate*,glscale*等二维变换函数实现平移、旋转、缩放等变换,通过参数操作和矩阵操作两种方式执行。

glTranslatef:在opengl中,函数glTranslatef的作用就是移动坐标原点。

glRotatef:glRotatef( angle, x, y, z )函数的作用是将当前坐标系以a( x, y, z )向量为旋转轴旋转angle角度,满足右手法则,即沿着右手握拳时四个手指指向的方向旋转。

基于MFC和VC6.0的连连看系统设计论文

基于MFC和VC6.0的连连看系统设计论文

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。

摘要从2001年开始,游戏作为一种产业已经渐渐地为中国大众接受,它所带来的经济效益和社会效益更是人们之前所没有估计到的,当游戏作为一种很重要的娱乐手段被大众接受时,游戏产业就已经注定会带来巨大的经济效益。

连连看游戏是一款经典小游戏,操作简单,适合所有玩家。

连连看游戏软件在Windows环境下用VC++6.0工具,基于MFC框架设计开发,可以实现初始化界面,用户使用鼠标点击两张相同图案的小方块进行消除,并有多种地图样式和道具选择,丰富了游戏的娱乐性。

此连连看游戏程序界面美观,操作简单,具有一定的趣味性,是一款老少皆宜的休闲佳品。

本文通过需求分析与方案论证,首先对开发连连看游戏程序进行初步的分析,然后通过总体设计和详细设计论述了系统的开发和实现过程。

关键词:连连看;单机游戏;游戏开发AbstractStarted from 2001, the game took one industry already gradually to accept for the Chinese populace, it brought before the economic efficiency and the social efficiency were people, has not estimated that when played takes one very important entertainment method is accepted by the populace, the game industry already was doomed to be able to bring the huge economic efficiency.Looked again and again the game is a section of classics small game, the simplicity of operator, suits all plays the family. Looked again and again the game software under the Windows environment with the VC++6.0 tool, based on the MFC frame design development, may realize the initialization contact surface, the user use mouse clicks on two same designs the dice to carry on eliminates, and has many kinds of map styles and the stage prop choice, has enriched game's entertainment. This looked again and again the game procedure contact surface is artistic, the simplicity of operator, has certain interest, is section of good for both young and old leisure high quality goods.This article through the demand analysis and the project concept demonstration, first to develops looked again and again the game procedure carries on the preliminary analysis, then elaborated system's performance history through the system design and the detailed design as well as realizes the process.Keywords:Lianliankan ;Stand-alone game;Game-Development目录第1章绪论 ...................................................................................... 错误!未定义书签。

如何在VC_中用MFC进行OpenGL编程_胡伟

如何在VC_中用MFC进行OpenGL编程_胡伟

收稿日期:2001-02-28 作者简介:胡伟(1976-),男,硕士研究生,主要研究方向:CAD 、图形学应用; 王弘(1948-),男,副教授,主要研究方向:CIMS 系统规划及应用研究.文章编号:1001-9081(2001)08-0087-03如何在VC ++中用MFC 进行OpenGL 编程胡 伟,王 弘(华中科技大学动力工程系,湖北武汉430074)摘 要:介绍了OpenGL 的基本概念及其基本程序结构,通过对用标准C 和用MFC 这两种方法进行OpenGL 编程的相通点的分析,详细叙述了如何在VC ++中用MFC 编写OpenGL 程序的一般过程。

关键词:OpenGL ;MFC ;设备描述表(DC );绘制描述表(RC )中图分类号:TN911.73 文献标识码:A1 简介随着三维图形的应用越来越广泛,计算机图形学的发展也越来越迅速,各种图形应用软件也就随之应运而生。

Open GL (Open Graphic Library ,开放性图形库)是目前比较完善的三维图形标准,已被广泛的用于可视化技术、实体造型、CAD /CAM 、模拟仿真等诸多领域。

OpenGL 作为一种硬件图形的软件接口,其优点是作为一个独立的工作平台,独立于硬件设备、窗口系统和操作系统,用它编写的软件可以在Unix 、Windows95OSR2、Windows98/NT /2000等系统间移植。

Open GL 编程类似于C 编程,实际接口就是C ,所以市面上的很多有关OpenGL 的书中的程序都是使用标准C (或是Win32Console Application )调用OpenGL 函数实现的。

这样做,只是为了使读者尽快地掌握Open GL 的基本操作。

但是,Open GL 仅仅是一个包含120多个图形函数的图形库,并没有窗口函数(尽管Open GL 的辅助库提供了一些窗口和事件管理的函数,但是这些函数在实际应用中是远远不够的。

OpenGL在VC_6_0开发环境下的编程实现

OpenGL在VC_6_0开发环境下的编程实现

山西电子技术2011年第1期软件技术收稿日期:2010-12-03作者简介:王正强(1986-),男,青海互助县人,硕士研究生,专业是信号与信息处理。

文章编号:1674-4578(2011)01-0066-01OpenGL 在VC++6.0开发环境下的编程实现王正强(中北大学信息与通信工程学院,山西太原030051)摘 要:近年来,由于三维技术的飞速发展和广泛应用,许多原来采用V is ua l C ++作为基础语言创建应用程序的领域,都有了虚拟现实、科学计算可视化等三维仿真处理的应用要求。

基于此介绍了O pen GL 的工作方式、VC ++下的Open GL 的程序框架、O pen GL 绘制过程以及双缓存技术。

最后给出工程上某个时刻的效果图。

关键词:VC++;O penGL ;三维技术中图分类号:TP311.5 文献标识码:A0 引言O penGL 是一个优秀的专业化的3D AP I 。

它最早是SG I 为图形工作站开发的。

随着Open GL 成为高性能图形与交互式视景处理的工业标准,目前几乎所有的3D 图形显示卡都已经支持OpenGL 。

O pen GL 的应用范围已经从游戏开发、三维设计等逐步扩展到3D 图形、图形处理、广告、动画、虚拟实现、科学计算可视化、仿真等多种领域多个层面。

可以说OpenGL 在三维领域的霸主地位是毋庸置疑的。

1 OpenGL 工作方式O penGL 指令模型是C /S(C li ent/Server ,客户、服务器)模型,通常用户程序(客户)发出命令提交给内核程序(服务器),内核程序再对各种指令进行解释,并初步处理,之后交给操作系统服务而转交给硬件[1]。

上述过程可以在同一台计算机上完成,也可以在网络环境中,由不同的计算机合作完成,OpenGL 通过上述合作实现网络透明。

简单的工作流程如图1所示。

图1 Op enGL 工作流程O penGL 库函数被封装在动态链接库O peng l 32.dll 中,应用程序发出O pen GL 命令后,O pen GL 函数调用被动态链接库Openg l 32.dll 处理。

在vc++6.0中配置OpenGL环境

在vc++6.0中配置OpenGL环境

OpenGL入门学习——写给想用计算机画图的朋友OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。

1、与C语言紧密结合。

OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。

如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。

2、强大的可移植性。

微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。

而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。

并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。

3、高性能的图形渲染。

OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。

OpenGL官方网站(英文)下面将对Windows下的OpenGL编程进行简单介绍。

学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。

这里我们选择VC++6.0作为学习OpenGL的环境。

第二步,安装GLUT工具包GLUT下载地址:(大小约为150k)/resources/libraries/glut/glut_downloads.php /glutdlls37beta.zipWindows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件(glut.h glut.lib glut32.lib glut.dll glut32.dll)2、把解压得到的glut.h复制到VC的“include\gl”文件夹下。

3、把解压得到的glut.lib和glut32.lib复制到静态函数库所在文件夹“VC\lib”文件夹。

OpenGL及其基于VC6.0的开发

OpenGL及其基于VC6.0的开发

第21卷 第4期西安科技学院学报Vol.21 No.4 2001年12月 JOURNAL OF XI’AN UN IV ERSIT Y OF SCIENCE&TECHNOLO GY Dec.2001 文章编号:1671-1912(2001)04-0365-04Open G L及其基于VC++6.0的开发田红鹏,马 苗(西安科技学院网络中心,陕西西安 710054)摘 要:简述了计算机3D图形、图像与Open G L的关系,给出Open G L的明确定义以及它与Di2rect X的区别。

并进一步描述了Open G L跨各种平台的移植性。

文章从Open G L的工作顺序、状态机制及构成出发,介绍了Open G L的编程原理。

最后,讨论了在VC++6.0中开发Open G L程序的步骤。

关键词:Open G L;图形/图像;图形显示卡;VC++6.0中图分类号:TP391.41 文献标识码:A1 Open G L概述目前,计算机图形学已进入3D时代,色彩缤纷的计算机广告、扣人心弦的3D游戏、震撼人心的影视特效,无一不是三维图形的力作。

总之,3D已无处不在。

随着计算机图形、图像技术的迅猛发展,科学可视化、计算机动画和虚拟现实成为计算机图形学的三大热门话题,而这三大热门话题的技术核心均为3D 图形。

那么如何快速实现3D图形/图像?Open G L即可作为主要途径之一。

1.1 Open G L的概念Open G L是一种与硬件、窗口系统和OS相独立的一系列API。

它的前身是由SGI公司为其图形工作站开发的IRIS G L,是一个工业标准3D计算机软件接口。

后来,为了实现向其它平台移植,开发了Open G L。

Open G L不仅有G L的功能,而且是开放的,可用于多种硬件及OS。

1.2 Open G L与DirectX的区别相异点:Direct X是一种Windows环境下标准的高性能游戏、多媒体开发工具包。

如何在vc++6.0里面使用openGl

如何在vc++6.0里面使用openGl
GLvoid ResizeGLScene(GLsizei width,GLsizei height)
{
if(height==0)
height=1;
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
HGLRC hRC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;
BOOL keys[256];
BOOL active=TRUE;
BOOL fullscreen=TRUE;
GLfloat rtri;
GLfloat rquad;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);Color3f(1.0f,0.5f,0.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.5f,0.0f,-7.0f);

用VisualC_中的MFC和OpenGL建立三维图形应用环境

用VisualC_中的MFC和OpenGL建立三维图形应用环境

用VisualC_中的MFC和OpenGL建立三维图形应用环境用Visual C++中的MFC和OpenGL建立三维图形应用环境哈尔滨工业大学现代生产技术中心(150001) 凌云储林波摘要:使用Visual C++的基本类库MFC建立面向对象的OpenGL三维图形应用程序的开发环境。

关键词:三维图形编程OpenGL三维图形库M FC类库O penGL是一个功能强大的三维图形库,它与操作系统无关,用O penGL编写的应用程序可以很容易地移植到支持O penG L的操作系统上,例如U N IX。

在Windo ws N T和W indo w s95中提供了对OpenGL的支持,在Window s N T和W indow s95上可以使用V i-sual C++V2.0以上版本来开发OpenGL的应用程序。

而V isual C++完善的基本类库M FC和应用向导A ppW izard使得开发一个复杂的应用程序变得轻松自如。

如果将二者结合起来,便可开发出相当有水平的Windo ws下三维图形应用程序。

1 OpenGL绘图环境初始化使用OpenGL函数库之前,需要以特定的过程进行初始化。

因为O penG L函数库和操作系统无关,它有自已的独特设计,与W indo ws的图形设备接口GDI 模型以及多数M FC应用程序的建立方法不太一致。

Windo ws为此提供了一些专门的A P I函数。

下面简要介绍一下Win32下使用O penG L函数库特殊的初始化过程。

首先,必须重新设置画图窗口的象素格式,使其符合O penGL对象素格式的需要。

为此需声明一个P IX-ELF O RM A T D ESCR IPT OR 结构的变量,并适当地设置某些结构成员的值,使其支持O penG L及其颜色模式。

变量的声明见后面SetupPix elFo rma t()函数的描述。

再以此变量为参数调用Choo seP ix elFo rmat()函数分配1个象素格式号,然后调用SetPix elF or mat()将其设置为当前象素格式。

基于MFC的OpenGL编程

基于MFC的OpenGL编程

光荣在于平淡,艰巨因为漫长《基于MFC的OpenGL编程》系列文章1,《基于MFC的OpenGL编程》Part 1 A Primer2,《基于MFC的OpenGL编程》Part 2 Setting up OpenGL on Windows3,《基于MFC的OpenGL编程》Part 3 Drawing Simple 2D Shapes4,《基于MFC的OpenGL编程》Part 4 Drawing Simple 3D objects5,《基于MFC的OpenGL编程》Part 5 Transformations - Rotations, Translations and Scaling6,《基于MFC的OpenGL编程》Part 6 Keyboard and Mouse Control7,《基于MFC的OpenGL编程》Part 7 Animation8,《基于MFC的OpenGL编程》Part 8 Colors9,《基于MFC的OpenGL编程》Part 9 Lighting10,《基于MFC的OpenGL编程》Part 10 Texture Mapping11,《基于MFC的OpenGL编程》Part 11 Blending, Antialiasing and Fog12,《基于MFC的OpenGL编程》Part 12 Creating and Using Display Lists13,《基于MFC的OpenGL编程》Part 13 Creating 2D and 3D Text14,《基于MFC的OpenGL编程》Part 14 Quadrics15,《基于MFC的OpenGL编程》Part 15 Selection16,《基于MFC的OpenGL编程》Part 16 Reflection17,《基于MFC的OpenGL编程》Part 17 Shadows18,《基于MFC的OpenGL编程》Part 18 Reading objects from the OBJ File Format 19,《基于MFC的OpenGL编程》Part 19 Creating a Virtual Reality Walkthrough Application2(请您对文章做出评价)光荣在于平淡,艰巨因为漫长《基于MFC的OpenGL编程》Part 1 A Primer3D图形学基本概念PerspectivePerspective refers to the angles between the lines that lend the illusion of three dimensions.Colors and ShadingMoving beyond line drawing, we need to add color to create a solid object. Shading refers to the way the color is applied to the polygon. Shading can be of two types in OpenGL - Flat or Smooth.Lights and ShadowsPlain solid color doesn’t offer enough realism. By applying Lighting effects we can make objects appear as they would in reality depending on their material properties and the lighting parameters. Adding a shadow further increases realism.Texture MappingWith Texture Mapping we can have wood grains, cloth textures, brick like textures etc instead of plain materials. This technique of applying an image to the surface of a polygon is called Texture Mapping. The image we use is called the Texture and the individual elements of the texture are called Texels.FogFog is an atmospheric effect that adds haziness to objects in a scene depending on how far the objects are from the viewer.Blending and TransparencyBlending is the combination of colors of objects on the screen. This effect can be used for a variety of purposes. By varying the amount each object is blended with the scene we can make objects look transparent.Anti-AliasingAliasing is an effect that is visible on screen due to the fact that an image consists of discrete pixels. By carefully blending the lines with the background color we can eliminate jagged edges and give them a smooth appearance. This blending technique is called anti-aliasing. 第一个OpenGL程序//Simple.cpp - First OpenGL Program#include <windows.h> //Required for every Windows Program#include <gl\glut.h> //Required for using the GLUT library//Perform OpenGL Initialization herevoid SetupRC(){//Set the background clearing color to blueglClearColor(0.0f,0.0f,1.0f,1.0f);//设置背景色为蓝色}//The drawing callback functionvoid RenderScene(){//Clear the color bufferglClear(GL_COLOR_BUFFER_BIT);//Flush the rendering pipelineglFlush();}void main(){//Choose the display mode settingsglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//初始化显示模式(单缓冲, RGB)//Create the WindowglutCreateWindow("Simple");//创建窗口//Set the RenderScsne function as the display callbackglutDisplayFunc(RenderScene);//绘制回调函数,当窗口需要绘制时,GLUT会调用此函数//Initialize OpenGLSetupRC();//初始化OpenGL//Start the GLUT frameworkglutMainLoop();//开始消息循环}光荣在于平淡,艰巨因为漫长《基于MFC的OpenGL编程》Part 2 Setting up OpenGL on Windows源代码下载:OpenGL_ch2.rarWGL – Windows的OpenGL扩展层The WGL extension consists of a set of functions (wglCreateContext, wglDeleteContext etc.) and structures (such as PIXELFORMATDESCRIPTOR, GLYPHMETRICSFLOAT) etc. Thus every OpenGL implementation has a platform-specific portion which has to be set up and used according to the particular platform.设备上下文The Windows Graphical Device Interface (GDI) is capable of drawing to screen, to memory, to printers or to any other device that provides a GDI interface layer and that can process GDI calls. GDI accomplishes this by a rendering handle to the currently selected device, which is called the device context, or DC.绘制上下文A rendering context is the OpenGL equivalent of the GDI DC. All OpenGL calls are rendered to the device through a RC. The rendering context maintains OpenGL state variables such as current background color, current color etc. just as the DC maintains GDI state variables such as current pen, current brush etc.像素格式Pixel formats are the translation layer between OpenGL calls and the rendering operation that Windows performs.举个例子,若像素格式只支持很少一部分颜色值,则OpenGL在用RGB值(128,120,135)绘制一个像素时,就可能使用转换后的值(128,128,128)来绘制.The pixel format selected essentially describes such things as how colors are displayed, depth of field resolution and what additional capabilities are supported by the rendering context created.第一个基于MFC的OpenGL应用程开发环境:VC6.01,首先下载需要的GLUT头文件,DLL和Lib文件,下载链接: glutdlls37beta.zip (149 kilobytes),解压缩后把gltu.h放到"VC98/Include/GL"下,把glut.lib和glut32.lib放到"VC9/Lib" 下,glut32.dll和glut.dll放到你创建的应用程序的运行目录下2,创建一个MFC SDI应用程序,在项目属性中加入所需要链接的库文件1,在stdafx.h中加入下列语句://OpenGL Headers#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>#include <gl/glaux.h>2,打开ClassWizard,选择CCY457OpenGLView类,为下述消息加入消息处理函数:WM_CREATE (for OnCreate), WM_DESTROY (for OnDestroy), WM_SIZE (for OnSize),WM_ERASEBACKGROUND (for OnEraseBkground).3,在窗口创建之前我们必须设置窗口风格包含WS_CLIPCHILDREN和WS_CLIPSIBLINGS,从而避免OpenGL绘制到其他窗口中去。

MFC下基于OpenGL绘图程序的开发步骤和框架

MFC下基于OpenGL绘图程序的开发步骤和框架

。 能 体 整 和 识 意 任 责 员 高 提 范 规 描 位 岗 、 操 认 确 述 口 指 手 实 落 面 作 工 训 培 育 教 术 技 全 安 抓 狠 设 ”建 基 “双 化 深 断 不 , 织 组 合 理 管 学 科
int m_GLPixelIndex; 其它具体函数及其参数含义,大家可以通过 OpenGL 手册或者 MSDN 查询。这里不作累述。 (2)现在绘制窗口像素格式已经定义好,下一步工作是产生绘制上下文(RC)并使之成为当 前绘制上下文。在视类中加入一个私有型成员函数 BOOL CreateViewGLContext(HDC hDC)。 其中,m_hGLContext 为在视类中添加的一私有型的成员变量: HGLRC m_hGLContext;HGLRC 是一个指向 rendering context 的句柄。 (3)最后,在视类的 OnCreate 函数(OnCreate 函数相应 Window 消息 WM_CREATE,可以通 过 VC 的类向导 Class Wizard Ctrl+W 进行添加,如图)中实现上述两个函数的调用,实现 RC 的定义、产生以及和当前视区窗口 DC 的通讯。 6、添加绘图函数 视类函数 OnDraw 主要负责视区的绘图工作。为了在视区窗口利用 OpenGL 绘制图形,我 们自定义一个绘图函数 DrawScene(), 并 OnDraw 函数中调用该函数, 从而实现在视区窗口绘图。 7、修改视类 OnSize 函数 当视区绘图窗口大小变化时,应及时将新的窗口大小通知 OpenGL,才能在绘图窗口以正 确的比例显示图形。当视区窗口大小变化时,WM_SIZE 消息被触发,所以可以通过 VC 的类向 导 Class Wizard Ctrl+W 添加 WM_SIZE 的消息映射函数 OnSize。 然后对 OnSize 函数做修改。 8、修改视类 OnEraseBkgnd 函数 仿造第 7 步的方法通过类向导 Class Wizard 添加视类对消息 WM_ERASEBKGND 的映射函 数 OnEraseBkgnd,并对该函数进行修改。修改该函数的主要原因是:OpenGL 自身具有重绘能 力,通过修改该函数屏蔽 Window 的重绘操作,从而可以防止窗口频繁刷新时产生的闪烁现象。 9、回收 RC 所占用的资源 通过 VC 的类向导 Class Wizard Ctrl+W 添加 Window 消息 WM_DESTROY 的映射函数 OnDestroy 函数。在该函数中调用 OpenGL 函数 wglDeleteContext 对 RC 所占资源进行回收。注 意,回收之前需要先使用 OpenGL 函数 wglMakeCurrent 断开 RC 与 DC 的连接。 10、初始化绘图数据 编辑视类构造函数,初始化绘图数据。 至此,我们已构造好了框架,使该工程可以利用 OpenGL 进行绘图了。假设现在绘制一个 三角形,只需要在第 6 步添加的 DrawScene 函数中添加绘制三角形的函数, (二)生成三维物体 1) 首先,在 OnSize()中,把 gluOrtho2D(0.0, 500.0*aspect,0.0, 500.0)换成 gluPerspective(60, aspect, 1, 10.0);这样就实现了三维透视坐标系的设置。该语句说明了视点在原点,透视角是 60 度,近裁剪面在 z=1 处,远裁剪面在 z=10.0 处。 2) 在 DrawScene 函数中生成三维图形;

基于Visual C+ +6.0的MFC和OpenGL的六自由度并联机器人的三维建模

基于Visual C+ +6.0的MFC和OpenGL的六自由度并联机器人的三维建模

基于Visual C+ +6.0的MFC和OpenGL的六自由度并联
机器人的三维建模
王艳;王占林
【期刊名称】《液压与气动》
【年(卷),期】2004(000)012
【摘要】OpenGL是近年广泛使用的一个三维图形标准,Visual C++的基础类库MFC(Microsoft Foundation Class Library)提供了窗口程序的界面和基本输入输出,是开发Windows应用软件的有力手段.该文使用Visual C++ 6.0的MFC建立了一个面向对象的OpenGL三维图形应用程序开发环境,用于开发OpenGL应用程序,并用OpenGL完成了六自由度并联机器人的三维建模.
【总页数】3页(P47-49)
【作者】王艳;王占林
【作者单位】北京航空航天大学自动化科学与电气工程学院,北京,100083;北京航空航天大学自动化科学与电气工程学院,北京,100083
【正文语种】中文
【中图分类】TP242
【相关文献】
1.基于OpenGL的六自由度机械臂三维建模与仿真 [J], 张华文;梁艳阳;赖永林
2.基于Visual C+ +6.0实现有限元分析系统的前置处理 [J], 胡国辉;何为;杨浩
3.在Visual C+ +中利用MFC类库访问数据库中的长二进制类型数据 [J], 王井阳;
张晓明;阮冬茹;白云飞
4.基于OpenGL和MFC的三维建模教学实践与改革 [J], 张志华;程耀东;张新秀
5.一种基于LabWindows/CVI和OpenGL的六自由度机械手三维建模的方法 [J], 伍文伟;朱志杰;伍良伟
因版权原因,仅展示原文概要,查看原文内容请购买。

基于MFC的OpenGL编程

基于MFC的OpenGL编程

一、简介GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。

每一个GDI命令需要传给它一个DC,但与GDI 不同,OpenGL使用当前绘制环境(RC)。

一旦在一个线程中指定了一个当前RC,在此线程中其后所有的OpenGL命令都使用相同的当前RC。

虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。

下面我将首先产生一个OpenGL RC并使之成为当前RC,这将分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC。

二、MFC中的OpenGL基本框架1、首先创建工程用AppWizard产生一个MFC EXE项目,其他默认即可。

2、将此工程所需的OpenGL文件和库加入到工程中在工程菜单中,选择"Build"下的"Settings"项。

单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"opengl32.lib glu32.lib glut.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),选择"OK"结束。

然后打开文件"stdafx.h",加入下列头文件:#include <gl\gl.h>#include <gl\glu.h>3、改写OnPreCreate函数并给视图类添加成员函数和成员变量OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC6.0中基于MFC 和OpenGL的图形编程第一步:选择一个开发工具在Windows系统中,我们选择VC++ 6.0作为学习OpenGL的环境。

第二步:安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。

Windows环境下的GLUT下载地址:(大小约为150k)/resources/libraries/glut/glutdlls37beta.zip Windows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件2、以我的安装目录为例:(1)“c:\Program Files\Microsoft Visual Studio\VC98\include\GL文件夹”。

把解压得到的glut.h放到这个GL文件夹里。

没有GL文件夹可以自己建一个,一般都有的。

(2)“c:\Program Files\Microsoft Visual Studio\VC98\lib文件夹”。

把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹,即lib文件夹。

(3)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。

(典型的位置为:C:\Windows\System32)这是非常重要的动态链接库设置!第三步,创建并设置工程(1)在VC++ 6.0中创建一个MFC AppWizard[exe]的单文档应用程序,例如工程名为MFCOpenGL。

(2)链接OpenGL libraries:在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上opengl32.lib Glut32.lib Glaux.lib glu32.lib 。

第四步,初始化OpenGL绘图环境1,在stdafx.h中加入下列语句://OpenGL Headers#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>#include <gl/glaux.h>2,打开ClassWizard,选择CMFCOpenGLView类,为下述消息加入消息处理函数:WM_CREATE (for OnCreate),WM_DESTROY (for OnDestroy),WM_SIZE (for OnSize),WM_ERASEBACKGROUND (for OnEraseBkground).3,在窗口创建之前我们必须设置窗口风格包含WS_CLIPCHILDREN和WS_CLIPSIBLINGS,从而避免OpenGL绘制到其他窗口中去。

这些应该放在PreCreateWindow()中。

BOOL CMFCOpenGLView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modi fying// the CREATESTRUCT cs//An OpenGL Window must be created with the following flags cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;return CView::PreCreateWindow(cs);}4, 在CMFCOpenGLView.h中加入如下语句:HGLRC m_hRC; //Rendering ContextCDC* m_pDC; //Device ContextBOOL InitializeOpenGL(); //Initialize OpenGLBOOL SetupPixelFormat(); //Set up the Pixel F ormatvoid RenderScene(); //Render the Scene5, 在OnCreate()中我们将通过建立像素格式和绘制上下文来初始化OpenGL. 在InitializeOpenGL()中会创建一个设备上下文(DC),为这个DC选择一个像素格式,创建和这个DC相关的绘制上下文(RC),然后选择这个RC.这个函数会调用SetupPixelFormat()来建立像素格式。

int CMFCOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;//Initialize OpenGL HereInitializeOpenGL();return 0;}BOOL CMFCOpenGLView::InitializeOpenGL(){//Get a DC for the Client Aream_pDC = new CClientDC(this);//Failure to Get DCif(m_pDC == NULL){MessageBox("Error Obtaining DC");return FALSE;}//Failure to set the pixel formatif(!SetupPixelFormat()){return FALSE;}//Create Rendering Contextm_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());//Failure to Create Rendering Contextif(m_hRC == 0){MessageBox("Error Creating RC");return FALSE;}//Make the RC Currentif(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE){MessageBox("Error making RC Current");return FALSE;}//Specify Black as the clear color::glClearColor(0.0f,0.0f,0.0f,0.0f);//Specify the back of the buffer as clear depth::glClearDepth(1.0f);//Enable Depth Testing::glEnable(GL_DEPTH_TEST);return TRUE;}//Setup Pixel Format///////////////////////////////////////////////////////////////////// ////////BOOL CMFCOpenGLView::SetupPixelFormat(){static PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd1,// version numberPFD_DRAW_TO_WINDOW | // supp ort windowPFD_SUPPORT_OPENGL | // supp ort OpenGLPFD_DOUBLEBUFFER, // double bufferedPFD_TYPE_RGBA, // RGBA type24,// 24-bit color depth0, 0, 0, 0, 0, 0, / / color bits ignored0,// no alpha buffer0,// shift bit ignored0,// no accumulation buffer0, 0, 0, 0,// accum bits ignored16,// 16-bit z-buffer0,// no stencil buffer0,// no auxiliary bufferPFD_MAIN_PLANE, // main layer0,// reserved0, 0, 0// layer masks ignored};int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);if ( m_nPixelFormat == 0 ){return FALSE;}if ( ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE){return FALSE;}return TRUE;}6, 在OnSize()中一般用来设置视口和视锥,因为这些是和窗口大小相关的。

基本操作包括设置视口,选择投影矩阵,设置模型视图矩阵。

void CMFCOpenGLView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);GLdouble aspect_ratio; // width/height ratioif ( cx <= 0 || cy <= 0 ){return;}// select the full client area::glViewport(0, 0, cx, cy);// compute the aspect ratio// this will keep all dimension scales equalaspect_ratio = (GLdouble)cx/(GLdouble)cy;// select the projection matrix and clear it::glMatrixMode(GL_PROJECTION);::glLoadIdentity();// select the viewing volume::gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);// switch back to the modelview matrix and clear it::glMatrixMode(GL_MODELVIEW);::glLoadIdentity();}7,在绘制场景时,一般包括如下步骤:1)清空缓存。

相关文档
最新文档