#include <windows.h> // Windows头文件
#include "glew.h" // OpenGL头文件
#include "NeHeGL.h" // NeheGL头文件
/***********************************新添的代码***********************************************************************************/
#include "math.h"
#include "ArcBall.h"
extern ArcBallT ArcBall;
extern Point2fT MousePt;
extern bool isClicked;
extern bool isRClicked;
/********************************************************************************************************************************/
// 定义一个用户自定义消息
#define WM_TOGGLEFULLSCREEN (WM_USER+1)
static BOOL g_isProgramLooping; // 是否进行程序循环
static BOOL g_createFullScreen; // 如果TRUE,则创建全屏窗口
void TerminateApplication (GL_Window* window) // 关闭程序
{
PostMessage (window->hWnd, WM_QUIT, 0, 0); // 发送退出命令
g_isProgramLooping = FALSE; // 停止程序循环
}
void ToggleFullscreen (GL_Window* window) // 切换全屏/窗口模式
{
PostMessage (window->hWnd, WM_TOGGLEFULLSCREEN, 0, 0); // 发送切换命令
}
void ReshapeGL (int width, int height) // 根据窗口大小,调整OpenGL视口大小
{
glViewport (0, 0, (GLsizei)(width), (GLsizei)(height)); // 设置窗口可见区为窗口大小
glMatrixMode (GL_PROJECTION); // 设置投影矩阵
glLoadIdentity (); // 重置它
gluPerspective (45.0f, (GLfloat)(width)/(GLfloat)(height), // 设置可视冷苔体
1.0f, 100.0f);
glMatrixMode (GL_MODELVIEW); // 设置为模型变换矩阵
glLoadIdentity (); // 重置它
/***********************************新添的代码***********************************************************************************/
ArcBall.setBounds((GLfloat)width, (GLfloat)height);
/********************************************************************************************************************************/
}
BOOL ChangeScreenResolution (int width, int height, int bitsPerPixel) // 改变屏幕的大小和位深
{
DEVMODE dmScreenSettings; // 设备模式
ZeroMemory (&dmScreenSettings, sizeof (DEVMODE)); // 清0
dmScreenSettings.dmSize = sizeof (DEVMODE); // 设置为该结构的大小
dmScreenSettings.dmPelsWidth = width; // 设置宽度
dmScreenSettings.dmPelsHeight = height; // 设置高度
dmScreenSettings.dmBitsPerPel = bitsPerPixel; // 设置位深
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; // 设置需要改变的地方
if (ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) // 改变显示模式
{
return FALSE; // 出错则返回
}
return TRUE; // 成功返回
}
BOOL CreateWindowGL (GL_Window* window)
{
DWORD windowStyle = WS_OVERLAPPEDWINDOW; // 设置窗口类型为一般的弹出式窗口
DWORD windowExtendedStyle = WS_EX_APPWINDOW; // 设置窗口的扩展属性
PIXELFORMATDESCRIPTOR pfd = //pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式
{
sizeof (PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 格式支持窗口
PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL
PFD_DOUBLEBUFFER, // 必须支持双缓冲
PFD_TYPE_RGBA, // 申请 RGBA 格式
window->init.bitsPerPixel, // 选定色彩深度
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 无Alpha缓存
0, // 忽略Shift Bit
0, // 无累加缓存
0, 0, 0, 0, // 忽略聚集位
16, // 16位 Z-缓存 (深度缓存)
0, // 无蒙板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
0, // 不使用重叠层
0, 0, 0 // 忽略层遮罩
};
RECT windowRect = {0, 0, window->init.width, window->init.height}; // 记录窗口的大小
GLuint PixelFormat; // 将保存的像素格式
if (window->init.isFullScreen == TRUE) // 如果为全屏模式
{
if (ChangeScreenResolution (window->init.width, window->init.height, window->init.bitsPerPixel) == FALSE)
{
//全屏模式失败,弹出对话框,告知在窗口模式下运行
MessageBox (HWND_DESKTOP, "模式切换失败\n在窗口模式下运行", "错误", MB_OK | MB_ICONEXCLAMATION);
window->init.isFullScreen = FALSE; // 设置isFullscreen为False
}
//在全屏模式下运行
else
{
ShowCursor(FALSE); // 不显示光标
windowStyle = WS_POPUP; // 设置窗口模式为弹出式窗口
windowExtendedStyle |= WS_EX_TOPMOST; // 设置窗口的扩展模式为最顶层窗口
}
}
else //如果不为全屏模式
{
//调整窗口大小,以容纳边框等窗口部件
AdjustWindowRectEx (&windowRect, windowStyle, 0, windowExtendedStyle);
}
// 创建OpenGL窗口
window->hWnd = CreateWindowEx (windowExtendedStyle, // 扩展窗体风格
window->init.application->className, // 类名字
window->init.title, // 窗口标题
windowStyle, // 必须的窗体风格属性
0, 0, // 窗口位置
windowRect.right - windowRect.left, // 计算调整好的窗口宽度
windowRect.bottom - windowRect.top, // 计算调整好的窗口高度
HWND_DESKTOP, // 无父窗口
0, // 无菜单
window->init.application->hInstance, // 实例
window); // 向window的WM_CREATE传递window结构
if (window->hWnd == 0) // 窗口创建是否成功
{
return FALSE; // 不成功则返回
}
window->hDC = GetDC (window->hWnd); // 返回设备描述表
if (window->hDC == 0) // 是否成功获得设备描述表
{
// 失败
DestroyWindow (window->hWnd); // 删除窗口
window->hWnd = 0; // 设置窗口句柄为0
return FALSE; // 返回失败
}
PixelFormat = ChoosePixelFormat (window->hDC, &pfd); // 选择一种相容的像素格式
if (PixelFormat == 0) // 是否获得相容的像素格式
{
// 失败
ReleaseDC (window->hWnd, window->hDC); // 释放设备描述表
window->hDC = 0; // 设置窗口设备描述表为0
DestroyWindow (window->hWnd); // 删除窗口
window->hWnd = 0; // 设置窗口句柄为0
return FALSE; // 返回错误
}
if (SetPixelFormat (window->hDC, PixelFormat, &pfd) == FALSE) // 设置像素格式
{
// 错误
ReleaseDC (window->hWnd, window->hDC); // 释放设备描述表
window->hDC = 0; // 设置窗口设备描述表为0
DestroyWindow (window->hWnd); // 删除窗口
window->hWnd = 0; // 设置窗口句柄为0
return FALSE; // 返回错误
}
window->hRC = wglCreateContext (window->hDC); // 设置OpenGL渲染描述表
if (window->hRC == 0) // 如果没有成功创建
{
ReleaseDC (window->hWnd, window->hDC); // 释放设备描述表
window->hDC = 0; // 设置窗口设备描述表为0
DestroyWindow (window->hWnd); // 删除窗口
window->hWnd = 0; // 设置窗口句柄为0
return FALSE; // 返回错误
}
if (wglMakeCurrent (window->hDC, window->hRC) == FALSE) // 设置RC为当前的OpenGL的渲染描述表
{
wglDeleteContext (window->hRC); // 删除当前的OpenGL渲染描述表
window->hRC = 0; // 释放设备描述表
ReleaseDC (window->hWnd, window->hDC); // 设置窗口设备描述表为0
window->hDC = 0; // 删除窗口
DestroyWindow (window->hWnd); // 设置窗口句柄为0
window->hWnd = 0; // 返回错误
return FALSE;
}
ShowWindow (window->hWnd, SW_NORMAL); // 显示窗口
window->isVisible = TRUE; // 设置窗口为可见
ReshapeGL (window->init.width, window->init.height); // 根据窗口大小,调整OpenGL对应的窗口大小
ZeroMemory (window->keys, sizeof (Keys)); // 初始化按键记录表
window->lastTickCount = GetTickCount ();
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
bunny.rar (50个子文件)
bunny
bunny.ncb 8.98MB
bunny.cpp 9KB
48_ArcBall.vcproj.20090401-1254.Administrator.user 1KB
bunny.rc 1KB
NeHeGL.h 1KB
UpgradeLog.XML 3KB
ArcBall.h 13KB
wglew.h 38KB
_UpgradeReport_Files
UpgradeReport.xslt 12KB
UpgradeReport_Minus.gif 69B
UpgradeReport.css 3KB
UpgradeReport_Plus.gif 71B
48_ArcBall.ncb 7.36MB
OpenGL32.Lib 75KB
GlU32.Lib 12KB
bunny.suo 25KB
48_ArcBall.vcproj 4KB
GLAUX.H 12KB
GLAUX.LIB 1.25MB
ArcBall.cpp 2KB
glut32.lib 78KB
bunny.dat 2.31MB
NeHeGL.cpp 17KB
ve-22.tmp 17KB
resource.h 403B
glut.h 21KB
bunny.aps 32KB
bunny.sln 879B
eire_utility.h 1KB
Debug
48_ArcBall.exe 580KB
glu32.dll 119KB
BuildLog.htm 10KB
glut32.dll 166KB
ArcBall.obj 28KB
48_ArcBall.exe.embed.manifest.res 212B
48_ArcBall.ilk 1.24MB
48_ArcBall.exe.embed.manifest 146B
glew32.dll 188KB
mt.dep 67B
48_ArcBall.pdb 2.24MB
bunny.dat 2.31MB
vc80.pdb 116KB
vc80.idb 387KB
NeHeGL.obj 39KB
bunny.obj 54KB
48_ArcBall.exe.intermediate.manifest 145B
48_ArcBall.obj 47KB
opengl32.dll 697KB
glew.h 463KB
glew32.lib 275KB
共 50 条
- 1
easter123
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3