#include "stdafx.h"
#include<gl/glew.h>
#include <stdlib.h>
#include<iostream>
#include <GL/glut.h>
#include<gl/gl.h>
#include <windows.h>
static float angle=0;
void init(void)
{
// all parameters of lighting attrubutes
float light_specular[]={0.8, 0.0, 0.8, 1.0};
float light_ambient[]={0.2, 0.0, 0.2, 1.0};
float light_diffuse[]={0.8, 0.0, 0.8, 1.0};
float light_position[]={0.0, 0.0, 3.0,0.0};
float spot_direction[]={0.0, 0.0, 0.0,0.0};
glLight0 gets the parameters
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
/*
// attenuation parameters are set
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.5);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.5);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.2);
// spot cutoff and direction and eponent
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 2.0);
*/
// all parameters of material attributes
float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
float mat_shininess[] = { 50.0 };
float mat_ambient[]={1.0, 1.0, 1.0, 1.0};
float mat_diffuse[]={1.0, 1.0, 1.0, 1.0};
// material is set
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
// ligthtmodel information
GLfloat lightmodel_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightmodel_ambient);
// fundanmental information
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
// enable lighting
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
glColorMask(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//left teapot
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColorMask(1.0,0.0,0.0,0.0);
glPushMatrix();
glRotatef(angle, 0, 0, 1);
glTranslatef(-0.2, 0.0, -10.0);
glutSolidTeapot(2.0);
glPopMatrix();
//right teapot
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glColorMask(0.0,0.0,1.0,0.0);
glRotatef(angle, 0, 0, 1);
glTranslatef(0.2,0.0,0.0);
glutSolidTeapot(2.0);
glPopMatrix();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho (-5, +5, -5, +5, -15.0, 10.0);
}
void idle()
{
angle=angle+1;
if(angle>360)
angle=angle-360;
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
还有一个是:
- #pragma comment( lib, "opengl32.lib" )
- #pragma comment( lib, "glu32.lib" )
- #pragma comment( lib, "GLut32.lib" )
- #pragma comment( lib, "GLaux.lib" )
- #include <windows.h> // Windows的头文件
- #include <stdio.h> // 标准输入/输出库的头文件 (新增)
- #include <gl\gl.h> // OpenGL32库的头文件
- #include <gl\glu.h> // GLu32库的头文件
- #include <gl\glaux.h> // GLaux库的头文件
- HGLRC hRC=NULL; // 永久着色描述表
- HDC hDC=NULL; // 私有GDI设备描述表
- HWND hWnd=NULL; // 保存我们的窗口句柄
- HINSTANCE hInstance; // 保存程序的实例
- bool keys[256]; // 用于键盘例程的数组
- bool active=TRUE; // 窗口的活动标志,缺省为TRUE
- bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
- int FSpeed=3; // 红篮交换帧频的速度,越大越慢
- int FrameSpeed=FSpeed;
- float RSpeed=4.0f; // 旋转速度,越大越快
- float Rot=0.0f;
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定义
- GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置并初始化GL窗口大小
- {
- if (height==0) // 防止被零除
- {
- height=1; // 将Height设为1
- }
- glViewport(0,0,width,height); // 重置当前的视口(Viewport)
- 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.5f); // 黑色背景
- glClearDepth(1.0f); // 设置深度缓存
- glEnable(GL_DEPTH_TEST); // 启用深度测试
- glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精细的透视修正
- return TRUE; // 初始化 OK
- }
- //画导弹模型
- void drawMissile(void)
- {
- float scale=0.06;
- float P[3]={0*scale,0*scale,13*scale}; //导弹顶点
- // float Pr[3]={9,0,0};//导弹尾点
- float A[3]={ 1*scale, 1.732*scale, 7*scale}; //前六边形
- float B[3]={ 2*scale, 0*scale , 7*scale};
- float C[3]={ 1*scale,-1.732*scale, 7*scale};
- float D[3]={-1*scale,-1.732*scale, 7*scale};
- float E[3]={-2*scale, 0*scale , 7*scale};
- float F[3]={-1*scale, 1.732*scale, 7*scale};
- float Ar[3]={ 1*scale, 1.732*scale, -7*scale}; //后六边形
- float Br[3]={ 2*scale, 0*scale , -7*scale};
- float Cr[3]={ 1*scale,-1.732*scale, -7*scale};
- float Dr[3]={-1*scale,-1.732*scale, -7*scale};
- float Er[3]={-2*scale, 0*scale , -7*scale};
- float Fr[3]={-1*scale, 1.732*scale, -7*scale};
- //四个尾翼,每个尾翼4个点
- float WY[4][4][3]={
- {{2*scale ,0*scale ,3*scale},{3.5*scale ,0*scale ,-5.5*scale},{4*scale ,0*scale ,-9*scale},{2*scale ,0*scale ,-8*scale}},
- {{0*scale ,1.732*scale ,3*scale},{0*scale ,3.5*scale ,-5.5*scale},{0*scale ,4*scale ,-9*scale},{0*scale ,1.732*scale ,-8*scale}},
- {{-2*scale ,0*scale ,3*scale},{-3.5*scale ,0*scale ,-5.5*scale},{-4*scale ,0*scale ,-9*scale},{-2*scale ,0*scale ,-8*scale}},
- {{0*scale ,-1.732*scale ,3*scale},{0*scale ,-3.5*scale ,-5.5*scale},{0*scale ,-4*scale ,-9*scale},{0*scale ,-1.732*scale ,-8*scale}}
- }; //1
- //glColor3f(1,0,0);
- glBegin(GL_TRIANGLES); //画顶盖=========================
- //glShadeModel(GL_SMOOTH);
- glVertex3fv(P);
- glVertex3fv(A);
- glVertex3fv(F);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3fv(P);
- glVertex3fv(F);
- glVertex3fv(E);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3fv(P);
- glVertex3fv(E);
- glVertex3fv(D);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3fv(P);
- glVertex3fv(D);
- glVertex3fv(C);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3fv(P);
- glVertex3fv(C);
- glVertex3fv(B);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3fv(P);
- glVertex3fv(B);
- glVertex3fv(A);
- glEnd();
- //画弹身===================================
- //glColor3f(0.5,0.5,0.5);
- glBegin(GL_QUADS);
- glVertex3fv(A);
- glVertex3fv(Ar);
- glVertex3fv(Fr);
- glVertex3fv(F);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3fv(F);
- glVertex3fv(Fr);
- glVertex3fv(Er);
- glVertex3fv(E);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3fv(E);
- glVertex3fv(Er);
- glVertex3fv(Dr);
- glVertex3fv(D);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3fv(D);
- glVertex3fv(Dr);
- glVertex3fv(Cr);
- glVertex3fv(C);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3fv(C);
- glVertex3fv(Cr);
- glVertex3fv(Br);
- glVertex3fv(B);
- glEnd();
- glBegin(GL_QUADS);
- glVertex3fv(B);
- glVertex3fv(Br);
- glVertex3fv(Ar);
- glVertex3fv(A);
- glEnd();
- //画底盖
- glBegin(GL_POLYGON);
- glVertex3fv(Ar);
- glVertex3fv(Br);
- glVertex3fv(Cr);
- glVertex3fv(Dr);
- glVertex3fv(Er);
- glVertex3fv(Fr);
- glEnd();
- //画尾翼========================================
- //glColor3f(0.1,0.5,1.0);
- for(int i=0;i<=3;i++)
- {
- glBegin(GL_QUADS);
- glVertex3f(WY[i][0][0],WY[i][0][1],WY[i][0][2]);
- glVertex3f(WY[i][1][0],WY[i][1][1],WY[i][1][2]);
- glVertex3f(WY[i][2][0],WY[i][2][1],WY[i][2][2]);
- glVertex3f(WY[i][3][0],WY[i][3][1],WY[i][3][2]);
- glEnd();
- }
- }
- //********************************************************
- int DrawGLScene(GLvoid) //从这里开始进行所有的绘制
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
- glLoadIdentity(); // 重置当前的模型观察矩阵
- float pos[3]; //物体的位置
- float color[3]; //物体的颜色
- pos[1]=-0.1f;
- pos[2]=-3.0f;
- if(FrameSpeed<=(FSpeed/2))
- {
- pos[0]=-0.02f;
- color[0]=1.0f;
- color[1]=0.0f;
- color[2]=0.0f;
- }
- else
- {
- pos[0]=0.02f;
- color[0]=0.0f;
- color[1]=0.0f;
- color[2]=1.0f;
- }
- glPushMatrix();
- glTranslatef(pos[0],pos[1],pos[2]);
- glColor3f(color[0],color[1],color[2]);
- glRotatef(Rot,1,1,1);//degree X、Y、Z
- /*
- glBegin(GL_TRIANGLES);
- glVertex3f( 0.0f, 1.0f, 0.0f);
- glVertex3f(-0.5f, 0.0f, 0.0f);
- glVertex3f( 0.5f, 0.0f, 0.0f);
- glEnd();
- */
- drawMissile();
- glPopMatrix();
- FrameSpeed--;//帧减一
- if(FrameSpeed<0)FrameSpeed=FSpeed;
- Rot+=RSpeed;
- if(Rot>=360.0f)Rot=0.0f;
- return TRUE; // 一切 OK
- }
- //此代码只在程序退出之前调用
- GLvoid KillGLWindow(GLvoid) // 正常销毁窗口
- {
- if (fullscreen) // 我们处于全屏模式吗?
- {
- ChangeDisplaySettings(NULL,0); // 是的话,切换回桌面
- ShowCursor(TRUE); // 显示鼠标指针
- }
- if (hRC) // 我们拥有着色描述表吗?
- {
- if (!wglMakeCurrent(NULL,NULL)) // 我们能否释放DC和RC描述表?
- {
- MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
- }
- if (!wglDeleteContext(hRC)) // 我们能否删除RC?
- {
- MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
- }
- hRC=NULL; // 将RC设为 NULL
- }
- if (hDC && !ReleaseDC(hWnd,hDC)) // 我们能否释放 DC?
- {
- MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
- hDC=NULL; // 将 hDC 设为 NULL
- }
- if (hWnd && !DestroyWindow(hWnd)) // 能否销毁窗口?
- {
- MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
- hWnd=NULL; // 将 hWnd 设为 NULL
- }
- if (!UnregisterClass("OpenGL",hInstance)) // 能否注销类?
- {
- MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
- hInstance=NULL; // 将 hInstance 设为 NULL
- }
- }
- /* This Code Creates Our OpenGL Window. Parameters Are: *
- * title - Title To Appear At The Top Of The Window *
- * width - Width Of The GL Window Or Fullscreen Mode *
- * height - Height Of The GL Window Or Fullscreen Mode *
- * bits - Number Of Bits To Use For Color (8/16/24/32) *
- * fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)
- 此过程返回布尔变量(TRUE或FALSE)。
- 他还带有5个参数:
- 窗口的标题栏,窗口的宽度,窗口的高度,色彩位数(16/24/32),
- 和全屏标志(TRUE — 全屏模式,FALSE — 窗口模式)。返回的布尔值告诉我们窗口是否成功创建。
- */
- 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)0; // 将Left 设为 0
- WindowRect.right=(long)width; // 将Right 设为要求的宽度
- WindowRect.top=(long)0; // 将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 = 0; // 无额外窗口数据
- wc.cbWndExtra = 0; // 无额外窗口数据
- 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,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // 退出并返回FALSE
- }
- if (fullscreen) // 要尝试全屏模式吗?
- {
- DEVMODE dmScreenSettings; // 设备模式
- memset(&dmScreenSettings,0,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,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","kingwise GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
- {
- fullscreen=FALSE; // 选择窗口模式(Fullscreen=FALSE)
- }
- else
- {
- // Pop Up A Message Box Letting User Know The Program Is Closing.
- MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
- return FALSE; // Return 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); // 调整窗口达到真正要求的大小
- // Create The Window
- if (!(hWnd=CreateWindowEx( dwExStyle, // 扩展窗体风格
- "OpenGL", // 类名字
- title, // 窗口标题
- dwStyle | // Defined Window Style
- WS_CLIPSIBLINGS | // 必须的窗体风格属性
- WS_CLIPCHILDREN, // 必须的窗体风格属性
- 0, 0, // 窗口位置
- WindowRect.right-WindowRect.left, // 计算调整好的窗口宽度
- WindowRect.bottom-WindowRect.top, // 计算调整好的窗口高度
- NULL, // 无父窗口
- NULL, // 无菜单
- hInstance, // 实例
- NULL))) // 不向WM_CREATE传递任何东东
- {
- KillGLWindow(); // 重置显示区
- MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // Return FALSE
- }
- static PIXELFORMATDESCRIPTOR pfd= // pfd 告诉窗口我们所希望的东东
- {
- sizeof(PIXELFORMATDESCRIPTOR), // 上诉格式描述符的大小
- 1, // 版本号
- PFD_DRAW_TO_WINDOW | // 格式必须支持窗口
- PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL
- PFD_DOUBLEBUFFER, // 必须支持双缓冲
- PFD_TYPE_RGBA, // 申请 RGBA 格式
- bits, // 选定色彩深度
- 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 // 忽略层遮罩
- };
- if (!(hDC=GetDC(hWnd))) // 取得设备描述表了么?
- {
- KillGLWindow(); // 重置显示区
- MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // Return FALSE
- }
- if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Windows 找到相应的象素格式了吗?
- {
- KillGLWindow(); // Reset The Display
- MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // Return FALSE
- }
- if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // 能够设置象素格式么?
- {
- KillGLWindow(); // Reset The Display
- MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // Return FALSE
- }
- if (!(hRC=wglCreateContext(hDC))) // 能否取得着色描述表?
- {
- KillGLWindow(); // Reset The Display
- MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // Return FALSE
- }
- if(!wglMakeCurrent(hDC,hRC)) // 尝试激活着色描述表
- {
- KillGLWindow(); // Reset The Display
- MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // Return FALSE
- }
- ShowWindow(hWnd,SW_SHOW); // 显示窗口
- SetForegroundWindow(hWnd); // 略略提高优先级
- SetFocus(hWnd); // 设置键盘的焦点至此窗口
- ReSizeGLScene(width, height); // 设置透视 GL 屏幕
- if (!InitGL()) // 初始化新建的GL窗口
- {
- KillGLWindow(); // Reset The Display
- MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
- return FALSE; // Return FALSE
- }
- return TRUE; // Success
- }
- LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄
- UINT uMsg, // 窗口的消息
- WPARAM wParam, // 附加的消息内容
- LPARAM lParam) // 附加的消息内容
- {
- switch (uMsg) // 检查Windows消息
- {
- case WM_ACTIVATE: // 监视窗口激活消息
- {
- if (!HIWORD(wParam)) // 检查最小化状态
- {
- active=TRUE; // Program Is Active
- }
- else
- {
- active=FALSE; // Program Is No Longer Active
- }
- return 0; // Return To The Message Loop
- }
- case WM_SYSCOMMAND: // 中断系统命令Intercept System Commands
- {
- switch (wParam) // 检查系统调用Check System Calls
- {
- case SC_SCREENSAVE: // 屏保要运行?
- case SC_MONITORPOWER: // 显示器要进入节电模式?
- return 0; // 阻止发生
- }
- break; // Exit
- }
- case WM_CLOSE: // 收到Close消息?
- {
- PostQuitMessage(0); // 发出退出消息
- return 0; // Jump Back
- }
- case WM_KEYDOWN: // 有键按下么?
- {
- keys[wParam] = TRUE; // 如果是,设为TRUE
- return 0; // Jump Back
- }
- case WM_KEYUP: // 有键放开么?
- {
- keys[wParam] = FALSE; // If So, Mark It As FALSE
- return 0; // Jump Back
- }
- case WM_SIZE: // Resize The OpenGL Window
- {
- ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height
- return 0; // Jump Back
- }
- }
- // 向 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,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
- {
- fullscreen=FALSE; // Windowed Mode
- }
- // 创建OpenGL窗口*****************************!!
- if (!CreateGLWindow("kingwise's OpenGL Framework",640,480,16,fullscreen))
- {
- return 0; // Quit If Window Was Not Created
- }
- while(!done) // 保持循环直到 done=TRUE
- {
- if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // 有消息在等待吗?
- {
- if (msg.message==WM_QUIT) // 收到退出消息?
- {
- done=TRUE; // If So done=TRUE
- }
- else // 不是,处理窗口消息
- {
- TranslateMessage(&msg); // 翻译消息
- DispatchMessage(&msg); // 发送消息
- }
- }
- else // If There Are No Messages
- {
- // 绘制场景。监视ESC键和来自DrawGLScene()的退出消息
- if (active) // Program Active?
- {
- if (keys[VK_ESCAPE]) // Was ESC Pressed?
- {
- done=TRUE; // ESC Signalled A Quit
- }
- else // 不是退出的时候,刷新屏幕
- {
- DrawGLScene(); // 绘制场景
- SwapBuffers(hDC); // 交换缓存 (双缓存)
- }
- }
- if (keys[VK_F1]) // F1键按下了么?
- {
- keys[VK_F1]=FALSE; // 若是,使对应的Key数组中的值为 FALSE
- KillGLWindow(); // 销毁当前的窗口
- fullscreen=!fullscreen; // 切换 全屏 / 窗口 模式
- // 重建 OpenGL 窗口
- if (!CreateGLWindow("kingwise's OpenGL Framework",640,480,16,fullscreen))
- {
- return 0; // 如果窗口未能创建,程序退出
- }
- }
- }
- }
- // 关闭程序
- KillGLWindow(); // 销毁窗口
- return (msg.wParam); // 退出程序
- }