有些时候用到OpenGL需要每次进行配置,有点麻烦,可以直接基于CWND派生一个OpenGL类,在需要的时候直接用就可以了。下面附赠上这样一个类,其中删掉了我项目具体绘制的一些东西,如有错误不能用请联系我~~~
h文件:
#if !defined(AFX_OPENGL_H__38B5D1C8_2DFF_4A7D_9A99_3AC401C19D72__INCLUDED_)
#define AFX_OPENGL_H__38B5D1C8_2DFF_4A7D_9A99_3AC401C19D72__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// OpenGL.h : header file
#include
#inclede
/
// COpenGL window
class COpenGL : public CWnd
{
// Construction
public:
COpenGL();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(COpenGL)
//}}AFX_VIRTUAL
// Implementation
public:
virtual void RenderGLScene();
void Create(CRect rect, CWnd *parent);
virtual ~COpenGL();
// Generated message map functions
protected:
CRect m_rect;
CWnd* m_parent;
DEVMODE m_DMsaved;
public:
// 根据需要增、删
BOOL m_bInit;
HDC m_hDC;
HGLRC m_hRC;
// 读取数据
int DrawXXX();
int InitGL();
void KillGLWindow();
//{{AFX_MSG(COpenGL)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_OPENGL_H__38B5D1C8_2DFF_4A7D_9A99_3AC401C19D72__INCLUDED_)
CPP文件:
#include "stdafx.h"
#include "OpenGL.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
COpenGL::COpenGL():m_bInit(FALSE),m_hDC(NULL),m_hRC(NULL),m_parent(NULL)
{
}
COpenGL::~COpenGL()
{
KillGLWindow(); // Shutdown
}
BEGIN_MESSAGE_MAP(COpenGL, CWnd)
//{{AFX_MSG_MAP(COpenGL)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_SIZE()
//}}AFX_MSG_MAP
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
/
// COpenGL message handlers
void COpenGL::Create(CRect rect, CWnd *parent)
{
if (m_bInit) return;
ASSERT(rect);
ASSERT(parent);
m_rect = rect;
m_parent = parent;
CString className = AfxRegisterWndClass(
CS_HREDRAW | CS_VREDRAW | CS_OWNDC,NULL,(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);
CreateEx(WS_EX_CLIENTEDGE,className,_T("OpenGL"),WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,rect,parent,0);
}
int COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &m_DMsaved);
GLuint PixelFormat; // Holds The Results After Searching For A Match
static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
m_DMsaved.dmBitsPerPel, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored
};
if ( !( m_hDC = ::GetDC ( m_hWnd ) ) )
{ // Did We Get A Device Context?
KillGLWindow (); // Reset The Display
TRACE ( "Can't Create A GL Device Context." );
return FALSE;
}
if ( !( PixelFormat = ChoosePixelFormat ( m_hDC, &pfd ) ) )
{ // Did Windows Find A Matching Pixel Format?
KillGLWindow (); // Reset The Display
TRACE ( "Can't Find A Suitable PixelFormat." );
return FALSE;
}
if ( !SetPixelFormat ( m_hDC, PixelFormat, &pfd ) )
{ // Are We Able To Set The Pixel Format?
KillGLWindow (); // Reset The Display
TRACE ( "Can't Set The PixelFormat." );
return FALSE;
}
if ( !( m_hRC = wglCreateContext ( m_hDC ) ) )
{ // Are We Able To Get A Rendering Context?
KillGLWindow (); // Reset The Display
TRACE( " Can't Create A GL Rendering Context." );
return FALSE;
}
if ( !wglMakeCurrent ( m_hDC, m_hRC ) ) { // Try To Activate The Rendering Context
KillGLWindow (); // Reset The Display
TRACE ( "Can't Activate The GL Rendering Context." );
return FALSE;
}
if ( !InitGL () )
{ // Initialize Our Newly Created GL Window
KillGLWindow (); // Reset The Display
TRACE ( "Initialization Failed." );
return FALSE;
}
m_bInit = TRUE;
return 0;
}
void COpenGL::KillGLWindow()
{
if ( m_hRC )
{ // Do We Have A Rendering Context?
if ( !wglMakeCurrent ( NULL, NULL ) )
{ // Are We Able To Release The DC And RC Contexts?
TRACE ( "Release Of DC And RC Failed." );
}
if ( !wglDeleteContext ( m_hRC ) )
{ // Are We Able To Delete The RC?
TRACE ( "Release Rendering Context Failed." );
}
m_hRC = NULL; // Set RC To NULL
}
if ( m_hDC && !::ReleaseDC ( m_hWnd, m_hDC ) )
{ // Are We Able To Release The DC
TRACE ( "Release Device Context Failed." );
m_hDC = NULL; // Set DC To NULL
}
if ( m_hWnd && !::DestroyWindow ( m_hWnd ) )
{ // Are We Able To Destroy The Window?
TRACE( "Could Not Release m_hWnd." );
m_hWnd = NULL; // Set m_hWnd To NULL
}
}
int COpenGL::InitGL()
{
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
return TRUE; // Initialization Went OK
}
void COpenGL::RenderGLScene()
{
if(!m_bInit)
return;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//画模型
DrawXXX();
SwapBuffers(m_hDC);
}
void COpenGL::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
::ValidateRect ( m_hWnd, NULL );
RenderGLScene();
// Do not call CWnd::OnPaint() for painting messages
}
void COpenGL::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if ( cy==0)
{ // Prevent A Divide By Zero By
cy=1; // Making Height Equal One
}
glViewport(0,0,cx,cy); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); //设置投影矩阵
glLoadIdentity(); // 初始化
gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f); //设置视点
glMatrixMode(GL_MODELVIEW); //设置模型矩阵
glLoadIdentity(); // 初始化
}
int COpenGL::DrawXXX()
{
//具体的绘制
return 1;
}