MFC中的OpenGL窗口

类别:VC语言 点击:0 评论:0 推荐:

建立一个基于对话框的工程(名称:OpenGL)

并且在设置的Link里加入库opengl32.lib glu32.lib glaux.lib

为对话框添加picture control 控件,ID:IDC_RENDER

主要程序:

// OpenGLDlg.cpp : implementation file
//

#include "stdafx.h"
#include "OpenGL.h"
#include "OpenGLDlg.h"


#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

 
// Dialog Data
 //{{AFX_DATA(CAboutDlg)
 enum { IDD = IDD_ABOUTBOX };
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CAboutDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 //{{AFX_MSG(CAboutDlg)
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
 //{{AFX_DATA_INIT(CAboutDlg)
 //}}AFX_DATA_INIT

 

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CAboutDlg)
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 //{{AFX_MSG_MAP(CAboutDlg)
  // No message handlers
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COpenGLDlg dialog

COpenGLDlg::COpenGLDlg(CWnd* pParent /*=NULL*/)
 : CDialog(COpenGLDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(COpenGLDlg)
  // NOTE: the ClassWizard will add member initialization here
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32

  PixelFormat=0;
     m_yRotate = 0;
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void COpenGLDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(COpenGLDlg)
  // NOTE: the ClassWizard will add DDX and DDV calls here
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COpenGLDlg, CDialog)
 //{{AFX_MSG_MAP(COpenGLDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_WM_TIMER()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COpenGLDlg message handlers

BOOL COpenGLDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
///////////////////////OPENGL INIT/////////////////////////
  CWnd *wnd=GetDlgItem(IDC_RENDER);
    hrenderDC=::GetDC(wnd->m_hWnd);
 if(SetWindowPixelFormat(hrenderDC)==FALSE)
  return 0;
 
 if(CreateViewGLContext(hrenderDC)==FALSE)
  return 0;
 glPolygonMode(GL_FRONT,GL_FILL);
 glPolygonMode(GL_BACK,GL_FILL);
///////////////////////////////////////////

 

 glEnable(GL_TEXTURE_2D);
 glShadeModel(GL_SMOOTH);
 glViewport(0,0,259,231);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45,1,0.1,100.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glShadeModel(GL_SMOOTH);       // Enable Smooth Shading
 glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // 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
 /////////////////////////////////////////////////////////////////////////
 glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);

 SetTimer(1,10,0);

////////////////////////////////////////////////////////////////

 // TODO: Add extra initialization here
 
 return TRUE;  // return TRUE  unless you set the focus to a control
}

void COpenGLDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void COpenGLDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR COpenGLDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

 

BOOL COpenGLDlg::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc;

pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;

pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
     PFD_SUPPORT_OPENGL |
     PFD_DOUBLEBUFFER |
     PFD_TYPE_RGBA;

pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 0;
pixelDesc.cRedShift = 0;
pixelDesc.cGreenBits = 0;
pixelDesc.cGreenShift = 0;
pixelDesc.cBlueBits = 0;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 0;
pixelDesc.cStencilBits = 1;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;

PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
if(PixelFormat==0) // Choose default
{
 PixelFormat = 1;
 if(DescribePixelFormat(hDC,PixelFormat,
  sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
 {
  return FALSE;
 }
}

if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE)

{
 return FALSE;
}

return TRUE;
}


BOOL COpenGLDlg::CreateViewGLContext(HDC hDC)
{
hrenderRC = wglCreateContext(hDC);

if(hrenderRC==NULL)
 return FALSE;

if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
 return FALSE;

 

return TRUE;
}

void COpenGLDlg::RenderScene()  
{


 /////////////////////////////////////////////////
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 
 glLoadIdentity();
 glTranslatef(0.0f,0.0f,-6.0f);      // Move Left 1.5 Units And Into The Screen 6.0
 glRotated(m_yRotate, 0.0, 1.0, 0.0);
 glBegin(GL_TRIANGLES); // Drawing Using Triangles
 
  glVertex3f( 0.0f, 1.0f, 0.0f);     // Top
  glVertex3f(-1.0f,-1.0f, 0.0f);     // Bottom Left
  glVertex3f( 1.0f,-1.0f, 0.0f);     // Bottom Right
 glEnd();           // Finished Drawing The Triangle
 SwapBuffers(hrenderDC);
}

void COpenGLDlg::OnTimer(UINT nIDEvent) //实时绘制场景
{
 // TODO: Add your message handler code here and/or call default
 RenderScene();
 m_yRotate +=3;
 CDialog::OnTimer(nIDEvent);
}

 

// OpenGLDlg.h : header file
//

#if !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_)
#define AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// COpenGLDlg dialog

class COpenGLDlg : public CDialog
{
// Construction
public:
 COpenGLDlg(CWnd* pParent = NULL); // standard constructor


  BOOL SetWindowPixelFormat(HDC hDC);   //设定象素格式
 BOOL CreateViewGLContext(HDC hDC);     //View GL Context
    void RenderScene();                                //绘制场景

 HDC hrenderDC;      //DC
 HGLRC hrenderRC;  //RC
 float m_yRotate;       //转速

 int PixelFormat;

 

// Dialog Data
 //{{AFX_DATA(COpenGLDlg)
 enum { IDD = IDD_OPENGL_DIALOG };
  // NOTE: the ClassWizard will add data members here
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(COpenGLDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 HICON m_hIcon;

 // Generated message map functions
 //{{AFX_MSG(COpenGLDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnTimer(UINT nIDEvent);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_)

 

http://www.7forever.com/rwdata/temp/opengl.rar

(注:由于超级链接地址为公司所有,所以可能会删除,如果不能下,请联系我索取)

mailto:[email protected]

本文地址:http://com.8s8s.com/it/it1321.htm