项目介绍:
近来公司需要建立一个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 */