opengl 旋转三角形

// openglTestDlg.cpp : 实现文件

//

#include "stdafx.h"

#include "openglTest.h"

#include "openglTestDlg.h"

#include "math.h"

#pragma comment( lib, "glaux.lib")

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// 对话框数据

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

// CopenglTestDlg 对话框

CopenglTestDlg::CopenglTestDlg(CWnd* pParent /*=NULL*/)

: CDialog(CopenglTestDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CopenglTestDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CopenglTestDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_WM_CREATE()

ON_WM_DESTROY()

ON_WM_SIZE()

ON_WM_ERASEBKGND()

ON_WM_TIMER()

ON_WM_TIMER()

END_MESSAGE_MAP()

// CopenglTestDlg 消息处理程序

BOOL CopenglTestDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。

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);

}

}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

//  执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

///////////////////////OPENGL INIT///////////////////////// 

CWnd *wnd=GetDlgItem(IDC_RENDER); 

wnd->MoveWindow(10,10,600,500);

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,600,500); 

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,50,NULL); 

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

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

void CopenglTestDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// 如果向对话框添加最小化按钮,则需要下面的代码

//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

//  这将由框架自动完成。

void CopenglTestDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中

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;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

RenderScene();

}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。

//

HCURSOR CopenglTestDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

BOOL CopenglTestDlg::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 CopenglTestDlg::CreateViewGLContext(HDC hDC) 

hrenderRC = wglCreateContext(hDC); 

if(hrenderRC==NULL) 

return FALSE; 

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

return FALSE; 

return TRUE; 

void CopenglTestDlg::RenderScene()    

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity(); 

glTranslatef(0.0f,0.0f,-5.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 

glColor3f(1.0,1.0,0.0); /* red color */

glVertex3f( 0.0f, 1.0f, -0.0f);     // Top 

glVertex3f(-0.0f,-1.0f, 1.0f);     // Bottom Left 

glVertex3f( 1.0f,-1.0f, 0.0f);     // Bottom Right 

glEnd();           // Finished Drawing The Triangle

SwapBuffers(hrenderDC); 

void CopenglTestDlg::OnTimer(UINT_PTR nIDEvent)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

RenderScene(); 

m_yRotate = m_yRotate + 10; 

CDialog::OnTimer(nIDEvent);

}

posted on 2011-09-28 22:20  zhixing  阅读(2253)  评论(0编辑  收藏  举报