glwindow.cpp
来自「OpeNGL超级宝典源代码. OpeNGL超级宝典源代码.」· C++ 代码 · 共 369 行
CPP
369 行
// GLWindow.cpp : implementation file
//
#include "stdafx.h"
#include "GLView.h"
#include "GLWindow.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BYTE* gltResourceBMPBits(UINT nResource, int *nWidth, int *nHeight)
{
HINSTANCE hInstance; // Instance Handle
HANDLE hBitmap; // Handle to bitmap resource
BITMAPINFO bmInfo;
// Find the bitmap resource
hInstance = GetModuleHandle(NULL);
hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(nResource));
if(hBitmap == NULL)
return NULL;
GetObject(hBitmap,sizeof(BITMAPINFO),&bmInfo);
DeleteObject(hBitmap);
hBitmap = ::LoadResource(hInstance,
::FindResource(hInstance,MAKEINTRESOURCE(nResource), RT_BITMAP));
if(hBitmap == NULL)
return NULL;
BYTE *pData = (BYTE *)LockResource(hBitmap);
pData += sizeof(BITMAPINFO)-1;
*nWidth = bmInfo.bmiHeader.biWidth; //bm.bmWidth;
*nHeight = bmInfo.bmiHeader.biHeight;//bm.bmHeight;
return pData;
}
/////////////////////////////////////////////////////////////////////////////
// CGLWindow
CGLWindow::CGLWindow()
{
m_hRC = NULL;
m_hDC = NULL;
m_nPixelFormat;
}
CGLWindow::~CGLWindow()
{
}
BEGIN_MESSAGE_MAP(CGLWindow, CWnd)
//{{AFX_MSG_MAP(CGLWindow)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGLWindow message handlers
void CGLWindow::OnPaint()
{
static float fX = 0.0f;
static float fY = 0.0f;
if(m_hRC != NULL)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//fX += 0.015f;
//fY += 0.01f;
fX += 1.0f;
fY += 1.0f;
if(fX > 360.0f)
fX = 0.015f;
if(fY > 360.0f)
fY = 0.01f;
glPushMatrix();
glRotatef(fX, 1.0f, 0.0f, 0.0f);
glRotatef(fY, 0.0f, 1.0f, 0.0f);
float fSize = 20.0f;
// Front face of Cube
glBindTexture(GL_TEXTURE_2D, m_Sides[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-fSize, fSize, fSize);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-fSize, -fSize, fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(fSize,-fSize, fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(fSize,fSize, fSize);
glEnd();
// Back face of Cube
glBindTexture(GL_TEXTURE_2D, m_Sides[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(fSize,fSize, -fSize);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(fSize,-fSize, -fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-fSize, -fSize, -fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-fSize, fSize, -fSize);
glEnd();
// Top Face of Cube
glBindTexture(GL_TEXTURE_2D, m_Sides[2]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-fSize, fSize, fSize);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(fSize, fSize, fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(fSize, fSize, -fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-fSize, fSize, -fSize);
glEnd();
// Bottom Face of Cube
glBindTexture(GL_TEXTURE_2D, m_Sides[3]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-fSize, -fSize, -fSize);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(fSize, -fSize, -fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(fSize, -fSize, fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-fSize, -fSize, fSize);
glEnd();
// Left hand side of cube
glBindTexture(GL_TEXTURE_2D, m_Sides[4]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-fSize, fSize, -fSize);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-fSize, -fSize, -fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-fSize, -fSize, fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-fSize, fSize, fSize);
glEnd();
// Right hand side of cube
glBindTexture(GL_TEXTURE_2D, m_Sides[5]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(fSize, fSize, fSize);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(fSize, -fSize, fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(fSize, -fSize, -fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(fSize, fSize, -fSize);
glEnd();
glPopMatrix();
GLint eBuffer;
glGetIntegerv(GL_DRAW_BUFFER, &eBuffer);
if(eBuffer == GL_FRONT)
glFinish();
else
SwapBuffers(m_hDC);
}
else
{
CPaintDC dc(this); // device context for painting
RECT rect;
GetClientRect(&rect);
HDC m_hMemDC;
HBITMAP m_hBitmap, m_hOldBitmap;
m_hMemDC = CreateCompatibleDC(m_hDC);
// Load the bitmap
m_hBitmap = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BM_NOGL));
m_hOldBitmap = (HBITMAP) SelectObject(m_hMemDC, m_hBitmap);
// Do the blit for the background
StretchBlt(m_hDC, 0,0, rect.right, rect.bottom, m_hMemDC, 0, 0, 200, 200,SRCCOPY);
SelectObject(m_hMemDC, m_hOldBitmap);
DeleteObject(m_hBitmap);
::DeleteDC(m_hMemDC);
}
ValidateRect(NULL);
}
int CGLWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// Get the device context
m_hDC = ::GetDC(this->m_hWnd);
// Set the Pixel Format
SetPixelFormat(m_hDC, m_nPixelFormat, NULL);
// Create the rendering context and make it current
m_hRC = wglCreateContext(m_hDC);
if(m_hRC != NULL)
wglMakeCurrent(m_hDC, m_hRC);
// Setup the context
if(m_hRC != NULL)
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glGenTextures(6, m_Sides);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
BYTE *pBytes;
int nWidth, nHeight;
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_REPLACE);
// Load the texture objects
pBytes = gltResourceBMPBits(IDB_BITMAP1, &nWidth, &nHeight);
glBindTexture(GL_TEXTURE_2D, m_Sides[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
pBytes = gltResourceBMPBits(IDB_BITMAP2, &nWidth, &nHeight);
glBindTexture(GL_TEXTURE_2D, m_Sides[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
pBytes = gltResourceBMPBits(IDB_BITMAP3, &nWidth, &nHeight);
glBindTexture(GL_TEXTURE_2D, m_Sides[2]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
pBytes = gltResourceBMPBits(IDB_BITMAP4, &nWidth, &nHeight);
glBindTexture(GL_TEXTURE_2D, m_Sides[3]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
pBytes = gltResourceBMPBits(IDB_BITMAP5, &nWidth, &nHeight);
glBindTexture(GL_TEXTURE_2D, m_Sides[4]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
pBytes = gltResourceBMPBits(IDB_BITMAP6, &nWidth, &nHeight);
glBindTexture(GL_TEXTURE_2D, m_Sides[5]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,nWidth, nHeight, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pBytes);
}
SetTimer(101, 30, NULL);
return 0;
}
void CGLWindow::OnDestroy()
{
KillTimer(101);
CWnd::OnDestroy();
if(m_hRC)
{
glDeleteTextures(6, m_Sides);
wglMakeCurrent(m_hDC, NULL);
wglDeleteContext(m_hRC);
m_hRC = NULL;
}
::ReleaseDC(this->m_hWnd, m_hDC);
m_hDC = NULL;
}
void CGLWindow::OnSize(UINT nType, int w, int h)
{
CWnd::OnSize(nType, w, h);
GLfloat nRange = 100.0f;
GLfloat fAspect;
// Prevent a divide by zero
if(h == 0)
h = 1;
fAspect = (GLfloat)w/(GLfloat)h;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
// Reset coordinate system
glLoadIdentity();
// Setup perspective for viewing
gluPerspective(17.5f,fAspect,60,300);
// Viewing transformation
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -250.0f);
}
void CGLWindow::OnTimer(UINT nIDEvent)
{
InvalidateRect(NULL);
CWnd::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?