OpenGL + Win32 SDK 开发框架的搭建(C语言版)

项目介绍:

近来公司需要建立一个OpenGL的开发环境,我需要设计一个框架,以便不熟悉Win32 API的用户能够直接”书写 glXXX代码”。


卖点:

1. 只使用C语言。

2. 只使用Win32 API和操作系统自带的动态库,决不使用第三方的库。

3. 支持多窗口管理。


开始摆 了~~~~~~~

=====================================================================================

设计思路:

GLWinApp.h 框架的头文件。

GLWinApp.c  实现了框架。

Example.c 一个测试例子。


先来按照“测试驱动开发模式”来说明我的Example.c如何使用我这个库。

#include "GLWinApp.h"

GLMY_WINDOW *gpWnd1, *gpWnd2, *gpWnd3;

/** 应用程序启动后的钩子 */
void myPreHook()
{
	RECT rect;
	GetClientRect(GetDesktopWindow(), &rect);
	gpWnd1 = glmyCreateWindow(TEXT("test0"), TRUE, rect, 32);

	rect.top  = 0;
	rect.left = 0;
	rect.right = 300;
	rect.bottom = 300;
	gpWnd2 = glmyCreateWindow(TEXT("test1"), FALSE, rect, 32);

	rect.left = 350;
	rect.top = 0;
	rect.right = 650;
	rect.bottom = 300;
	gpWnd3 = glmyCreateWindow(TEXT("test2"), FALSE, rect, 32);


	glmyTimer(gpWnd1, 0, 10, TRUE);		/**< 设定定时器0 */
	glmyTimer(gpWnd2, 0, 10, TRUE);		/**< 设定定时器0 */
	glmyRefreshRate(1);					/**< 设置刷新频率 */

	return;
}

/** 应用程序结束前的钩子 */
void myPostHook()
{
}

/** 窗口尺寸改变后的钩子 */
void myResizeHook(GLMY_WINDOW * pWnd)
{
	glViewport(0, 0, pWnd->nWidth, pWnd->nHeight);		/**< 设置视口 */

	glMatrixMode(GL_PROJECTION);			/**< 重置投影矩阵 */
	glLoadIdentity();

	//gluPerspective(45.0f, (float)pWnd->nWidth / (float)pWnd->nHeight, 0, 1000.0f);	/**< 使用对称透视视景体 */
	gluOrtho2D(0, pWnd->nWidth, pWnd->nHeight, 0);		/**< 使用平面坐标 */

	glMatrixMode(GL_MODELVIEW);				/**< 重置模型视点矩阵 */
	glLoadIdentity();
}

/** 绘制的钩子 */
void myDrawHook(GLMY_WINDOW * pWnd)
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT);

	glColor3f(1, 0, 0);
	glRecti(0, 0, 100, 100);
	if (pWnd == gpWnd1)
	{
		//Draw wind1
	}
	if (pWnd == gpWnd2)
	{
		//Draw wind2
	}
}

/** 定时器的钩子 */
void myTimerHook(GLMY_WINDOW * pWnd, unsigned char nIndex)
{
	if (pWnd == gpWnd1 && nIndex == 0)
	{
		//Do something
	}
	if (pWnd == gpWnd2 && nIndex == 0)
	{
		//Do something
	}
}
/** 键盘触发 */
void myKeyboardHook(GLMY_WINDOW * pWnd, GLMY_KEYBOARD_KEY key)
{
}

/** 鼠标触发 */
void myMouseHook(GLMY_WINDOW * pWnd, GLMY_MOUSE_BUTTON button, GLMY_MOUSE_ACTION action)
{
}

/** GLMY程序入口,给用户设置Hook的机会(必须由客户端实现) */
void	GLMYENTRY glmyEntry()
{
	glmySetPreHook(myPreHook);
	glmySetPostHook(myPostHook);
	glmySetResizeHook(myResizeHook);
	glmySetDrawHook(myDrawHook);
	glmySetTimerHook(myTimerHook);
	glmySetKeyboardHook(myKeyboardHook);
	glmySetMouseHook(myMouseHook);
}


=====================================================================================

框架介绍:

直接上代码吧:

先来头文件GLWinApp.h

/************************************************************************/
/* 

   建立OpenGL Windows应用程序的通用框架(C语言版)

   特点:
   1. 仅使用Windows系统自带的SDK。
   2. 使用C语言,不使用C++语言。
   3. 使用glmy前缀,表示自定义的库

   设计说明:
   1. 配置文件使用说明:
		修改GLWinAppConfig.h文件,使用自定义的配置信息。

		//可配置项说明
		GLMY_PRE_HOOK		glmyPreHook
		GLMY_POST_HOOK		glmyPostHook
		GLMY_KEYBOARD_HOOK	glmyKeyboardHook
		GLMY_MOUSE_HOOK		glmyMouseHook
		GLMY_DRAW_HOOK		glmyDrawHook
		GLMY_TIMER_HOOK		glmyTimerHook
		
   2. 接口说明:
		新建一个或多个*.c的文件,写相应的函数。
		
		//HOOK函数说明
		glmyPreHook			程序启动时的Hook,可以创建窗口
		glmyPostHook		程序结束时的Hook,可以销毁窗口
		glmyKeyboardHook	键盘响应Hook
		glmyMouseHook		鼠标响应Hook
		glmyDrawHook		绘图需求Hook
		glmyTimerHook		定时器响应Hook

		//可调用函数说明
		glmyCreateWindow		创建一个GL窗口
		glmyDestroyWindow		销毁一个GL窗口

*/
/************************************************************************/

#ifndef	_GLWINAPP_H_
#define	_GLWINAPP_H_

#ifdef __cplusplus
	extern "C" {
#endif

/************************************************************************/
/* 宏定义,预处理定义,头文件 声明                                      */
/************************************************************************/

#define	GLMYAPI		__declspec(dllexport)	/* 是否导出?			*/
#define	GLMYENTRY	__stdcall				/* 约定程序调用方式		*/

#pragma comment (lib, "opengl32.lib")	/* link Microsoft OpenGL lib	*/
#pragma comment (lib, "glu32.lib")		/* link OpenGL Utility lib		*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值