OpenGL编程-OpenGL框架-win32项目
在win32项目中开发的程序
小知识: 控制台应用程序运行就是dos的界面 项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的
程序运行结果是这样的

源代码:对第45行进行覆盖
#include <windows.h> //Windows的头文件
#include <gl\gl.h> //包含OpenGL基本库
#include <gl\glu.h> //包含OpenGL实用库
#include <gl\glaux.h> //包含OpenGL辅助库
#include <gl\glut.h> //包含OpenGL工具库
//设置程序中使用的所有变量
HGLRC hRC = NULL; //OpenGL着色描述表句柄
HDC hDC = NULL; //设备描述表句柄
HWND hWnd = NULL; //保存窗口句柄
HINSTANCE hInstance; //保存程序的实例
//增加两个全局变量来控制这两个对象的旋转。
GLfloat rtri; //用于三角形的角度
GLfloat rquad; //用于四边形的角度 bool keys[]; //保存键盘按键的数组
bool active = TRUE; //口的活动标志,缺省为TRUE
bool fullscreen = TRUE; //全屏标志缺省,缺省设定成全屏模式
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //WndProc定义
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) //重置OpenGL窗口大小
{
if (height == ) //防止被零除
{
height = ;
} //将Height设为
glViewport(, , width, height); //重置当前的视口
glMatrixMode(GL_PROJECTION); //选择投影矩阵
glLoadIdentity(); //重置投影矩阵
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); //设置视景体
glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵
glLoadIdentity(); //重置模型观察矩阵
}
int InitGL(GLvoid) //开始对OpenGL进行所有设置
{
glShadeModel(GL_SMOOTH); //启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //黑色背景
glClearDepth(1.0f); //设置深度缓存
glEnable(GL_DEPTH_TEST); //启用深度测试
glDepthFunc(GL_LEQUAL);//所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //告诉系统对透视进行修正
return TRUE; //初始化OK
} //将这段代码覆盖之后,往里面添加东西。就能进行OpenGL int DrawGLScene(GLvoid) //开始进行所有的绘制
{ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存
glLoadIdentity(); //重置当前的模型观察矩阵
return TRUE; } // 一切OK GLvoid KillGLWindow(GLvoid) //正常销毁窗口
{
if (fullscreen) { //处于全屏模式吗?
ChangeDisplaySettings(NULL, ); //切回桌面
ShowCursor(TRUE);
} //显示鼠标指针
if (hRC) { //拥有OpenGL着色描述表吗?
if (!wglMakeCurrent(NULL, NULL)) {
//能否释放DC和RC描述表?
MessageBox(NULL, "释放DC和RC失 败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)){ //能否删除RC?
MessageBox(NULL, "释放RC失 败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
}
hRC = NULL;
} //将RC设为NULL
if (hDC && !ReleaseDC(hWnd, hDC)) {
//能否释放DC?
MessageBox(NULL, "释放DC失败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
hDC = NULL;
} //将DC设为NULL
if (hWnd && !DestroyWindow(hWnd)) {
//能否销毁窗口?
MessageBox(NULL, "释放窗口句柄失 败。", "关闭错误", MB_OK | MB_ICONINFORMATION);
hWnd = NULL;
} //将hWnd设为NULL
if (!UnregisterClass("OpenGL", hInstance)) {
//能否注销类?
MessageBox(NULL, "不能注销窗口类 。", " 关闭错误", MB_OK | MB_ICONINFORMATION);
hInstance = NULL;
}
} //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); //将Left 设为
WindowRect.right = (long)width; //将Right设为要求的宽度
WindowRect.top = (long); //将Top设为0
WindowRect.bottom = (long)height; //将Bottom设为要求的高度
fullscreen = fullscreenflag; //设置全局全屏标志
hInstance = GetModuleHandle(NULL); //取得窗口实例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; //移动时重画,为窗口取得DC
wc.lpfnWndProc = (WNDPROC)WndProc; //WndProc处理消息
wc.cbClsExtra = ; //窗口类额外字节数
wc.cbWndExtra = ; //窗口实例额外字节数
wc.hInstance = hInstance; //设置实例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); //装入缺省图标
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //装入鼠标指针
wc.hbrBackground = NULL; //GL不需要背景
wc.lpszMenuName = NULL; //不需要菜单
wc.lpszClassName = "OpenGL"; //设定类名字
if (!RegisterClass(&wc)) //尝试注册窗口类
{
MessageBox(NULL, "注册窗口失败。", " 错误", MB_OK | MB_ICONEXCLAMATION);
return FALSE; //退出并返回FALSE
}
if (fullscreen) //要尝试全屏模式吗?
{
DEVMODE dmScreenSettings; //设备模式
memset(&dmScreenSettings, , sizeof(dmScreenSettings)); //确保内存为零
dmScreenSettings.dmSize = sizeof(dmScreenSettings); //Devmode结构大小
dmScreenSettings.dmPelsWidth = width; //所选屏幕宽度
dmScreenSettings.dmPelsHeight = height; //所选屏幕高度
dmScreenSettings.dmBitsPerPel = bits; //每像素所选的色彩深度 dmScreenSettings.dmFields= DM_BITSPERPEL|DM_PELSWIDTH| DM_PELSHEIGHT;
//尝试设置显示模式并返回结果。
//注: CDS_FULLSCREEN 移去了状态条。
if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
//若模式失败,退出或在窗口内运行
if (MessageBox(NULL, "全屏模式在当前 显卡上设置失败!使用窗口模式? ", "OpenGL程序", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
{
fullscreen = FALSE; //选择窗口模式
}
else {
//弹出对话框告诉用户程序结束
MessageBox(NULL, "程序将被关 闭。", "错误", MB_OK | MB_ICONSTOP);
return FALSE; // 退出并返回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, //扩展窗体风格
"OpenGL", //类名字
title, //窗口标题
WS_CLIPSIBLINGS | //必须窗体风格属性
WS_CLIPCHILDREN |//必须窗体风格属性
dwStyle, //选择的窗体属性
, , //窗口位置
WindowRect.right - WindowRect.left, //计算调整好的窗口宽度
WindowRect.bottom - WindowRect.top, //计算调整好的窗口高度
NULL, //无父窗口
NULL, //无菜单
hInstance, //实例
NULL))) //不向WM_CREATE传任何东西
{
KillGLWindow(); //重置显示区
MessageBox(NULL, "创建窗口失败。", "错误", MB_OK | MB_ICONEXCLAMATION);
return FALSE;
} //返回FALSE
static PIXELFORMATDESCRIPTOR pfd = //pfd 告诉窗口使用的像素格式
{
sizeof(PIXELFORMATDESCRIPTOR), //上述格式描述符的大小
, //版本号
PFD_DRAW_TO_WINDOW | //格式支持窗口
PFD_SUPPORT_OPENGL | //格式必须支持OpenGL
PFD_DOUBLEBUFFER, //必须支持双缓冲
PFD_TYPE_RGBA, //申请RGBA 格式
bits, //选定色彩深度
, , , , , , //忽略的色彩位
, //无Alpha缓存
, //忽略Shift Bit
, //无累加缓存
, , , , //忽略聚集位
, //16位Z-缓存(深度缓存)
, //无模板缓存
, //无辅助缓存
PFD_MAIN_PLANE, //主绘图层
, //Reserved
, , //忽略层遮罩
};
if (!(hDC = GetDC(hWnd))) //获取设备描述表?
{
KillGLWindow(); //重置显示区
MessageBox(NULL, "不能创建GL设备描 述表。", "错误", MB_OK | MB_ICONEXCLAMATION);
return FALSE;
} //返回FALSE
if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) //Windows找到相应像素格式了吗?
{
KillGLWindow(); //重置显示区
MessageBox(NULL, "不能创建一种相匹配 的像素格式。", "错误", MB_OK | MB_ICONEXCLAMATION);
return FALSE;
} //返回FALSE
if (!SetPixelFormat(hDC, PixelFormat, &pfd)) //能够设置象素格式么?
{
KillGLWindow(); //重置显示区
MessageBox(NULL, "不能设置像素格式。 ", "错误", MB_OK | MB_ICONEXCLAMATION);
return FALSE; //返回FALSE
}
if (!(hRC = wglCreateContext(hDC))) //能否取得着色描述表?
{
KillGLWindow(); //重置显示区
MessageBox(NULL, "不能创建着色描述 表。", "错误", MB_OK | MB_ICONEXCLAMATION);
return FALSE;
} //返回FALSE
if (!wglMakeCurrent(hDC, hRC)) //尝试激活着色描述表
{
KillGLWindow(); //重置显示区
MessageBox(NULL, "不能激活当前的 OpenGL着色描述表。", "错误", MB_OK | MB_ICONEXCLAMATION);
return FALSE;
} //返回FALSE
ShowWindow(hWnd, SW_SHOW);//显示窗口
SetForegroundWindow(hWnd); //稍微提高优先级
SetFocus(hWnd); //设置键盘的焦点至此窗口
ReSizeGLScene(width, height); //设置透视GL 屏幕
if (!InitGL()) //初始化新建的GL窗口
{
KillGLWindow(); //重置显示区
MessageBox(NULL, "初始化失败。", "错误 ", MB_OK | MB_ICONEXCLAMATION);
return FALSE; //返回FALSE
}
return TRUE; //成功
}
LRESULT CALLBACK WndProc(
HWND hWnd, //窗口的句柄
UINT uMsg, //窗口的消息
WPARAM wParam, //附加的消息内容
LPARAM lParam) //附加的消息内容
{
switch (uMsg) { //检查Windows消息
case WM_ACTIVATE: //监视窗口激活消息
{
if (!HIWORD(wParam)) //检查最小化状态
{
active = TRUE;
} //程序处于激活状态
else
{
active = FALSE;
} //程序不再激活
return ; //返回消息循环
}
case WM_SYSCOMMAND: //系统中断命令
{
switch (wParam) { //检查系统调用
case SC_SCREENSAVE: //屏保要运行?
case SC_MONITORPOWER: //显示器要进入节电模式?
return ;
} //阻止发生
break; //退出
}
case WM_CLOSE: //收到Close消息?
{
PostQuitMessage(); //发出退出消息
return ; //返回
}
case WM_KEYDOWN: //有键按下么?
{
keys[wParam] = TRUE; //若是设为TRUE
return ; //返回
}
case WM_KEYUP: //有键放开么?
{
keys[wParam] = FALSE;//是则设为FALSE
return ; //返回
}
case WM_SIZE: //调整OpenGL窗口大小
{
ReSizeGLScene(LOWORD(lParam), HIWORD(lParam));
//LoWord=Width,HiWord=Height
return ; //返回
}
}
//向DefWindowProc传递所有未处理的消息。
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance, //当前窗口实例
HINSTANCE hPrevInstance, //前一个窗口实例
LPSTR lpCmdLine, //命令行参数
int nCmdShow) //窗口显示状态
{
MSG msg; //Windowsx消息结构
BOOL done = FALSE; //退出循环的Bool变量
//提示用户选择运行模式
if (MessageBox(NULL, "你想在全屏模式下运 行吗?", "设置全屏模式?", MB_YESNO | MB_ICONQUESTION) == IDNO)
{
fullscreen = FALSE; //FALSE为窗口模式
}
//创建OpenGL窗口
if (!CreateGLWindow("OpenGL程序框架", , , , fullscreen))
{
return ; //失败退出
}
while (!done) //保持循环直到done=TRUE
{
if (PeekMessage(&msg, NULL, , , PM_REMOVE)) //有消息在等待吗?
{
if (msg.message == WM_QUIT)
//收到退出消息?
{
done = TRUE; //是则done=TRUE
}
else //不是,处理窗口消息
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg); //发送消息
}
}
else //如果没有消息
{
//绘制场景。监视ESC键和来自 //的退出消息,然后调用DrawGLScene()
if (active) //程序激活的么?
{
if (keys[VK_ESCAPE])//ESC按下么?
{
done = TRUE; //ESC发退出信号
}
else //不是退出的时候,刷新屏幕
{
DrawGLScene(); //绘制场景
SwapBuffers(hDC); //交换缓存(双缓存)
}
}
if (keys[VK_F1]) //F1键按下了么?
{
keys[VK_F1] = FALSE; //若是,使对应的Key数组中的值为FALSE
KillGLWindow(); //销毁当前窗口
fullscreen = !fullscreen; //切换全屏/窗口模式
//重建OpenGL 窗口
// if (!CreateGLWindow("OpenGL程 序框架",640,480,16,fullscreen))
// {
// return 0; //如果窗口未能创建,程序退出
// }
// }
if (!CreateGLWindow("绘制基本图元", , , , fullscreen))
{
return ; //若窗口未能创建程序退出
}
} }
}
//关闭程序
KillGLWindow(); //销毁窗口
return (msg.wParam); //退出程序
}
OpenGL编程-OpenGL框架-win32项目的更多相关文章
- Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤
http://blog.csdn.net/vagrxie/article/details/4602961 Win32 OpenGL 编程( 1 ) Win32 下的 OpenGL 编程必须步骤 wri ...
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 在 Mac OS X Yosemite 10.10.5 上配置 OpenGL 编程环境
这个教程主要参考了youtube上的视频 Getting Started in OpenGL with GLFW/GLEW in Xcode 6 ,这个视频有点问题,不能照搬.本人通过自己摸(瞎)索( ...
- C#+OpenGL编程之再见小桃子(The Tao Framework)
本文基础: C#+OpenGL编程之OpenGL 纹理载入 C#+OpenGL编程之OpenGL 多重纹理 小桃子The Tao FrameworkTao提供的所有库都是完全开源的.其中的多数库都可以 ...
- 用MFC实现OpenGL编程
一.OpenGL简介 众所周知,OpenGL原先是Silicon Graphics Incorporated(SGI公司)在他们的图形工作站上开发高质量图像的接口.但最近几年它成为一个非常优秀的开放式 ...
- VS15 openGL 编程指南 配置库 triangle例子
最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决
最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...
- [转]VS 2012环境下使用MFC进行OpenGL编程
我就不黏贴复制了,直接给出原文链接:VS 2012环境下使用MFC进行OpenGL编程 其它好文链接: 1.OpenGL系列教程之十二:OpenGL Windows图形界面应用程序
随机推荐
- HTML5 ④
块元素和行元素: 1.行元素:在一行内显示,不会自动换行的标签.不能设置宽高. 块元素:自动换行的标签,能设置宽高.*利于我们页面布局 比如:段落标签,标题标签都是块元素 2.两者可以互相转换,通 ...
- 主机访问虚拟机centos7的服务器
一.虚拟机开启桥梁接 1.编辑-->虚拟网络编辑器 2.虚拟机-->设置 二.Centos的配置---关闭防火墙下的服务器接口 Centos7.0 默认使用firewall作为防火墙,这里 ...
- java中的方法method
java中的方法必须存在于类class里,不能独立存在.类是描述具有某种特征的事物,方法则是这类 事物具有的某种功能,通过调用方法可以实现某种特定的功能.方法名一般以小写的动词开头. 例: publi ...
- 六. Python基础(6)--语法
六. Python基础(6)--语法 1 ● Python3中, Unicode转字节的方法 print(bytes("李泉", encoding = 'utf-8')) prin ...
- Centos常用快捷键
终端快捷键 tab=补全 ctrl+a=开始位置 ctrl+e=最后位置 ctrl+k=删除此处至末尾所有内容 ctrl+u=删除此处至开始所有内容 ctrl+d=删除当前字母 ctrl+w=删除此 ...
- intelij idea常用设置
1.genneral设置 2.自动导包 3.设置显示行号和方法分隔符 4.忽略大小写提示代码 比如:输入str会让其提示String 5.去掉单行显示类,让idea多行显示,容易找到类 6.设置字体及 ...
- capjoint conversations with Chenweiwen
This event is quite small for teleseismic stations, which means it will be more strongly affected by ...
- ansible暂停模块
pause 在playbook执行的过程中暂停一定时间或者提示用户进行某些操作 常用参数: minutes:暂停多少分钟 seconds:暂停多少秒 prompt:打印一串信息提示用户操作 示例: - ...
- js 自执行匿名函数(转载)
自执行匿名函数: 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命 ...
- mac下python2.7升级到3.6
1. 前言 Mac系统自带python2.7,本文目的是将自带的python升级到3.6版本. 网上有本多的做法是让python2.7和python3.X两个版本共存,博主并不知道,是两版本共存好,还 ...