www.pudn.com > 基于SDK框架下OpenGL的实现.rar > WindowOpengGL.cpp
#include "WindowOpenGL.hpp"
int APIENTRY WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
WNDCLASS wc;
HWND hWnd;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = lpszAppName;
if(RegisterClass(&wc) == 0)
return FALSE;
hWnd = CreateWindow(
lpszAppName,
lpszAppName,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
100, 100,
600, 400,
NULL,
NULL,
hInstance,
NULL);
if(hWnd == NULL)
return FALSE;
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
while( GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HGLRC hRC;
static HDC hDC;
switch (message)
{
case WM_CREATE:
hDC = GetDC(hWnd);
SetDCPixelFormat(hDC);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
hPalette = GetOpenGLPalette(hDC);
SetupRC();
break;
case WM_SIZE:
ChangeSize(LOWORD(lParam), HIWORD(lParam));
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_UP:
xRot -= 5.0f;
SendMessage(hWnd,WM_PAINT,0,0l);
break;
case VK_DOWN:
xRot += 5.0f;
SendMessage(hWnd,WM_PAINT,0,0l);
break;
case VK_LEFT:
yRot -= 5.0f;
SendMessage(hWnd,WM_PAINT,0,0l);
break;
case VK_RIGHT:
yRot += 5.0f;
SendMessage(hWnd,WM_PAINT,0,0l);
break;
}
break;
case WM_PAINT:
RenderScene();
SwapBuffers(hDC);
ValidateRect(hWnd,NULL);
break;
case WM_QUERYNEWPALETTE:
if(hPalette)
{
int nRet;
SelectPalette(hDC, hPalette, FALSE);
nRet = RealizePalette(hDC);
InvalidateRect(hWnd,NULL,FALSE);
return nRet;
}
break;
case WM_PALETTECHANGED:
if((hPalette != NULL) && ((HWND)wParam != hWnd))
{
SelectPalette(hDC,hPalette,FALSE);
RealizePalette(hDC);
UpdateColors(hDC);
return 0;
}
break;
case WM_DESTROY:
KillTimer(hWnd,101);
wglMakeCurrent(hDC,NULL);
wglDeleteContext(hRC);
ReleaseDC(hWnd,hDC);
if(hPalette != NULL)
DeleteObject(hPalette);
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0L);
}
void SetDCPixelFormat(HDC hDC)
{
int nPixelFormat;
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0,0,0,0,0,0,
0,0,
0,0,0,0,0,
16,
0,
0,
0,
0,
0,0,0 };
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, nPixelFormat, &pfd);
}
HPALETTE GetOpenGLPalette(HDC hDC)
{
HPALETTE hRetPal = NULL;
PIXELFORMATDESCRIPTOR pfd;
LOGPALETTE *pPal;
int nPixelFormat;
int nColors;
int i;
BYTE RedRange,GreenRange,BlueRange;
nPixelFormat = GetPixelFormat(hDC);
DescribePixelFormat(hDC, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
if(!(pfd.dwFlags & PFD_NEED_PALETTE))
return NULL;
nColors = 1 << pfd.cColorBits;
pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +nColors*sizeof(PALETTEENTRY));
pPal->palVersion = 0x300;
pPal->palNumEntries = nColors;
RedRange = (1 << pfd.cRedBits) -1;
GreenRange = (1 << pfd.cGreenBits) - 1;
BlueRange = (1 << pfd.cBlueBits) -1;
for(i = 0; i < nColors; i++)
{
pPal->palPalEntry[i].peRed = (i >> pfd.cRedShift) & RedRange;
pPal->palPalEntry[i].peRed = (unsigned char)(
(double) pPal->palPalEntry[i].peRed * 255.0 / RedRange);
pPal->palPalEntry[i].peGreen = (i >> pfd.cGreenShift) & GreenRange;
pPal->palPalEntry[i].peGreen = (unsigned char)(
(double)pPal->palPalEntry[i].peGreen * 255.0 / GreenRange);
pPal->palPalEntry[i].peBlue = (i >> pfd.cBlueShift) & BlueRange;
pPal->palPalEntry[i].peBlue = (unsigned char)(
(double)pPal->palPalEntry[i].peBlue * 255.0 / BlueRange);
pPal->palPalEntry[i].peFlags = (unsigned char) NULL;
}
hRetPal = CreatePalette(pPal);
SelectPalette(hDC,hRetPal,FALSE);
RealizePalette(hDC);
free(pPal);
return hRetPal;
}
void ChangeSize(GLsizei w, GLsizei h)
{
GLfloat nRange = 1.7f;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset projection matrix stack
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Establish clipping volume (left, right, bottom, top, near, far)
if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
// Reset Model view matrix stack
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SetupRC()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
// Enable Depth Testing
glEnable(GL_DEPTH_TEST);
// Enable lighting
glEnable(GL_LIGHTING);
// Setup and enable light 0
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
glEnable(GL_LIGHT0);
// Enable color tracking
glEnable(GL_COLOR_MATERIAL);
// Set Material properties to follow glColor values
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
// All materials hereafter have full specular reflectivity
// with a high shine
glMaterialfv(GL_FRONT, GL_SPECULAR,specref);
glMateriali(GL_FRONT,GL_SHININESS,128);
// Set drawing color to blue
glColor3ub(0, 0, 255);
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glColor3f(0.0f,0.0f, 1.0f);
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glutSolidTeapot(1.0f);
glPopMatrix();
}