2012-03-12 19:33:35|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 图形/图像, MFC|来源:唯设编程网
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口(Application programming interface)的规格,它用于生成二维、三维图像。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库,提供了非常优秀的二维、三维图象操作API。使用VC可以方便的进行OpenGL编程,由于它函数全名、基础类库丰富、接口函数灵活多样,已经被广泛应用在各个工业领域。
本文主要介绍VC进行OpenGL编程时建立视场和程序框架,这是一个通用的OpenGL程序框架,通过调用OpenGL函数完成五子棋棋盘的绘制,读者将一步步地建立一个基础性的OpenGL程序,对VC+OpenGL进行开发的基础设置工作建立初步的认识。
Step 1、启动VS2008,一个基于基于对话框的MFC应用程序glGobang。
Step 2、使用同样的方法,在同一个解决下面创建一个Win32应用程序OpenGLLib,引用程序类型选择dll,附加选项选择导出符号,添加公公头文件以用于栏勾选MFC复选框,以便我们的类库中能够使用MFC定义的数据类型。
Step 3、在OpenGLLib项目的stdafx.h中添加使用OpenGL相关类库的头文件包含语句和Lib导入语句:
// 添加OpenGL使用的相关类库 #include "glgl.h" #include "glglu.h" #pragma comment (lib,"OpenGL32.lib") #pragma comment (lib,"glu32.lib")
Step 4、在OpenGLLib项目定义绘图用到的类COpenGLLib,完整的头文件如下:
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 OPENGLLIB_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // OPENGLLIB_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef OPENGLLIB_EXPORTS #define OPENGLLIB_API __declspec(dllexport) #else #define OPENGLLIB_API __declspec(dllimport) #endif // 添加矩阵相关计算类库 #include "..libMatrix.h" #include "..libVector_math.h" #pragma comment (lib,"..libMathUtility.lib") // 此类是从 OpenGLLib.dll 导出的 class OPENGLLIB_API COpenGLLib { private: CClientDC* my_pDC; // 初始化OpenGl环境 void init(void); // 初始化定义像素格式 BOOL initPixelformat(); public: COpenGLLib(CClientDC* pDC); ~COpenGLLib(); // 重置画布大小 void resetCanvasSize(int cx,int cy); // 执行绘图操作 void draw(); //draw的实现函数,以后采用外部接入的方式 void drawChessboard(CMatrix& matrix); //绘制一个棋子 void drawChessman(); }; extern OPENGLLIB_API int nOpenGLLib; OPENGLLIB_API int fnOpenGLLib(void);
由于程序使用到了线性代数矩阵和向量的相关运算,所以添加头文件Matrix.h、Vector_math.h并导入用到的库MathUtility.lib,这些和OpenGL的使用没有必然联系,读者可以忽略。
Step 5、OpenGLLib绘图类的具体实现。
//定义线的宽度 float lWidth[2]; COpenGLLib::COpenGLLib(CClientDC* pDC){ //验证my_pDC不能等于NULL ASSERT(my_pDC!=NULL); my_pDC=pDC; init(); } COpenGLLib::~COpenGLLib(){ HGLRC hrc; hrc=::wglGetCurrentContext(); ::wglMakeCurrent(NULL,NULL); if(hrc) ::wglDeleteContext(hrc); }
构造函数首先对绘图类OpenGLLib的CClientDC进行赋值,并调用init函数初始化OpenGL绘图用到的相关资源。析构函数中调用::wglGetCurrentContext()函数获取当前线程的当前OpenGL渲染描述表保存在临时变量hrc中,然后将当前的OpenGL选人描述表设置成NULL,最后调用::wglDeleteContext函数释放保存在hrc中的OpenGL渲染描述表。