#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gl/glaux.h>
#include <stdio.h>
#include <io.h>
HWND hWnd;
HDC hDC;
HGLRC hRC=NULL; //定义渲染环境
HINSTANCE hInstance; //得到程序的例子
RECT rect;
int sw = 640;
int sh = 480;
bool fullscreen=TRUE;
GLfloat aspect;
GLfloat rtri;//三角形的旋转角度
GLfloat rquad;//
#pragma comment( lib, "opengl32.lib" ) // 链接时使用OpenGL32.lib
#pragma comment( lib, "glu32.lib" ) // 链接时使用GLu32.lib
#pragma comment( lib, "glaux.lib" ) // 链接时使用GLaux.lib
void SceneInit(int w, int h)
{
glShadeModel(GL_SMOOTH); //允许平滑着色
glClearColor( 0.0f, 0.0f, 0.4f, 0.5F );
glClearDepth(1.0f); //设置深度缓冲区
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); //深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void SceneResizeViewport(GLsizei w, GLsizei h)
{
if(h==0)
{
h=1;
}
aspect = (GLfloat)w/(GLfloat)h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); //选择投影矩阵
glLoadIdentity();
gluPerspective( 45.0f, aspect, 0.1f, 100.0f );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SceneShow(GLvoid) //这里进行所有的绘图工作
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清屏和清除深度缓冲区
glLoadIdentity(); //重置当前Modelview矩阵
//glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//glLoadIdentity();//重置当前模型视矩阵
glTranslatef(-1.5f,0.0f,-6.0f);//向左移动1.5个单元,向屏幕里移动六个单元
glRotatef(rtri,0.0f,0.0f,5.0f);//三角形绕Z轴向外旋转5个单元
//绘制三角形
glBegin(GL_QUADS);//开始绘制
glColor3f(0.0,1.0,0.0);//设置第1个顶点为绿色
glVertex3f(-1.0,-1.0,0.0);//设置第1个顶点的坐标为(0.5,-0.5)
glColor3f(1.0,1.0,0.0);//设置第2个顶点为红色
glVertex3f(1.0,-1.0,0.0);//设置第2个顶点的坐标为(0.5,0.5)
glColor3f(1.0,0.0,1.0);//设置第2个顶点为红色
glVertex3f(1.0,1.0,0.0);//设置第2个顶点的坐标为(0.5,0.5)
glColor3f(0.0,0.0,0.0);//设置第2个顶点为红色
glVertex3f(-1.0,1.0,0.0);//设置第2个顶点的坐标为(0.5,0.5)
glEnd();//绘制结束
//lClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();//重置当前模型视矩阵
glTranslatef(-1.5f,0.0f,-6.0f);//向左移动1.5个单元,向屏幕里移动六个单元
glRotatef(rtri,0.0f,0.0f,5.0f);//三角形绕Z轴向外旋转5个单元
/*/绘制矩形
glColor3f(0.0,0.0,1.0);//设置第3个顶点为蓝色
glBegin(GL_TRIANGLES);//开始绘制
//glColor3f(0.0,1.0,0.0);//设置第1个顶点为绿色
glVertex3f(-1.0,1.0,0.0);//设置第1个顶点的坐标为(0.5,-0.5)
//glColor3f(1.0,0.0,0.0);//设置第2个顶点为红色
glVertex3f(1.0,1.0,0.0);//设置第2个顶点的坐标为(0.0,0.5)
glVertex3f(1.0,-1.0,0.0);
glVertex3f(-1.0,-1.0,0.0);//设置第3个顶点的坐标为(-0.5,-0.5)
glEnd();//绘制结束*/
rtri+=0.2f;
rquad-=0.15f;
}
void EnableOpenGL()
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
hDC = GetDC( hWnd );
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 16;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat( hDC, &pfd );
SetPixelFormat( hDC, iFormat, &pfd );
hRC = wglCreateContext( hDC );
wglMakeCurrent( hDC, hRC );
}
// 取消 OpenGL
void DisableOpenGL()
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
}
bool ChangeResolution(int w, int h, int bitdepth)
{
DEVMODE devMode;
int modeSwitch;
int closeMode = 0;
EnumDisplaySettings(NULL, closeMode, &devMode);
devMode.dmBitsPerPel = bitdepth;
devMode.dmPelsWidth = w;
devMode.dmPelsHeight = h;
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
modeSwitch = ChangeDisplaySettings(&devMode, CDS_FULLSCREEN);
if(modeSwitch == DISP_CHANGE_SUCCESSFUL)
{
return true;
}
else
{
ChangeDisplaySettings(NULL, 0);
return false;
}
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
switch ( message )
{
case WM_CREATE:
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
SceneResizeViewport(sw, sh);
return 0;
case WM_SIZE:
if(!fullscreen)
{
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
if(sw>0 && sh>0)
SceneResizeViewport(sw, sh);
}
else
{
SceneResizeViewport(GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ));
}
return 0;
case WM_CLOSE:
ShowWindow (hWnd, SW_HIDE);
PostQuitMessage( 0 );
return 0;
case WM_DESTROY:
return 0;
case WM_KEYDOWN:
switch( wParam )
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
return 0;
default:
return DefWindowProc( hWnd,message, wParam, lParam );
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
MSG msg;
bool bQuit = false;
if (MessageBox(NULL,"是否选择全屏显示模式?", "全屏方式运行?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=0; //窗口模式
}
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "Name";
RegisterClass( &wc );
if(fullscreen)
{
ChangeResolution(640, 480, 16);
hWnd = CreateWindow(
"Name",
"旋转",
WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ),
NULL, NULL,
hInstance,
NULL );
}else
{
hWnd = CreateWindow(
"Name",
"旋转",
WS_TILEDWINDOW | WS_VISIBLE,
GetSystemMetrics( SM_CXSCREEN )/2-sw/2,
GetSystemMetrics( SM_CYSCREEN )/2-sh/2,
sw,
sh,
NULL, NULL,
hInstance,
NULL );
ChangeDisplaySettings(NULL, 0);
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//初始化
EnableOpenGL();
SceneInit(sw, sh);
if(!fullscreen)
{
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
if(sw>0 && sh>0)
SceneResizeViewport(sw, sh);
}
else
{
SceneResizeViewport(GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ));
}
while ( !bQuit )
{
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
if ( msg.message == WM_QUIT )
bQuit = true;
else
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
// OpenGL 动画
SwapBuffers(hDC);
SceneShow();
}
}
//关闭,退出程序
DisableOpenGL();
ShowWindow (hWnd, SW_HIDE);
DestroyWindow( hWnd );
ChangeDisplaySettings(NULL, 0);
return msg.wParam;
return 0;
}