jyp3041222042view.cpp

来自「自己做的两个简单的茶壶!希望对初学者有点用!」· C++ 代码 · 共 445 行

CPP
445
字号
// Jyp3041222042View.cpp : implementation of the CJyp3041222042View class
//

#include "stdafx.h"
#include "Jyp3041222042.h"

#include "Jyp3041222042Doc.h"
#include "Jyp3041222042View.h"

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

/////////////////////////////////////////////////////////////////////////////
// CJyp3041222042View

IMPLEMENT_DYNCREATE(CJyp3041222042View, CView)

BEGIN_MESSAGE_MAP(CJyp3041222042View, CView)
	//{{AFX_MSG_MAP(CJyp3041222042View)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
	ON_WM_TIMER()
	ON_WM_RBUTTONDOWN()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEWHEEL()
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_Teapot1, OnTeapot1)
	ON_COMMAND(ID_Teapot2, OnTeapot2)
	ON_COMMAND(ID_Teapot3, OnTeapot3)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJyp3041222042View construction/destruction

CJyp3041222042View::CJyp3041222042View()
{
	// TODO: add construction code here
	m_timer = 1;
	
	m_theta[0]=0;
	m_theta[1]=0;
	m_theta[2]=0;
	
	m_axis=1;

}

CJyp3041222042View::~CJyp3041222042View()
{
}

BOOL CJyp3041222042View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
    cs.style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CJyp3041222042View drawing

void CJyp3041222042View::OnDraw(CDC* pDC)
{
	CJyp3041222042Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	DrawScene();
}

/////////////////////////////////////////////////////////////////////////////
// CJyp3041222042View printing

BOOL CJyp3041222042View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CJyp3041222042View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CJyp3041222042View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CJyp3041222042View diagnostics

#ifdef _DEBUG
void CJyp3041222042View::AssertValid() const
{
	CView::AssertValid();
}

void CJyp3041222042View::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CJyp3041222042Doc* CJyp3041222042View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJyp3041222042Doc)));
	return (CJyp3041222042Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CJyp3041222042View message handlers

int CJyp3041222042View::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	m_pDC = new CClientDC(this);	// get device context
	if( m_pDC == NULL )
	{
		::AfxMessageBox( "fail to get device context" );
		return FALSE;
	}

	if( !SetupPixelFormat() )	// setup pixel format
	{
		::AfxMessageBox( "SetupPixelFormat failed" );
		return FALSE;
	}
	
	// get rendering context
	if( ( m_hRC = wglCreateContext(m_pDC->GetSafeHdc()) ) == 0 )
	{
		::AfxMessageBox( "wglCreateContext failed" );
		return FALSE;
	}

	// make current rendering context
	if( wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC) == FALSE )
	{
		::AfxMessageBox( "wglMakeCurrent failed" );
		return FALSE;
	}

	KillTimer(m_timer);
	SetTimer(m_timer,50,NULL);

	return 0;


}

void CJyp3041222042View::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	if(wglMakeCurrent(0,0)==FALSE)
		::AfxMessageBox("wglMakeCurrent failed");
	if(m_hRC && (wglDeleteContext(m_hRC)==FALSE))
		::AfxMessageBox("wglDeleteContext failed");
	if(m_pDC)
		delete m_pDC;
}

BOOL CJyp3041222042View::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	//return CView::OnEraseBkgnd(pDC);
	return TRUE;
}

void CJyp3041222042View::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glViewport(0,0,cx,cy);
	
	glOrtho(-2.0,2.0,-2.0,2.0,-2.0,2.0);
	//glRotatef(30.0f,1.0f,0.0f,0.0f);
	//glRotatef(-135.0f,0.0f,1.0f,0.0f);
}

BOOL CJyp3041222042View::SetupPixelFormat(PIXELFORMATDESCRIPTOR* pPFD)
{
	PIXELFORMATDESCRIPTOR pfd = {
		sizeof( PIXELFORMATDESCRIPTOR ),
		1,
		PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
		PFD_TYPE_RGBA,
		24,
		0, 0, 0, 0, 0, 0,
		0, 0, 0, 
		0, 0, 0, 0, 
		16,
		0, 0, 
		PFD_MAIN_PLANE,
		0, 0, 0, 0 };

	int pixelformat;
	
	PIXELFORMATDESCRIPTOR* pPFDtoUse;

	pPFDtoUse = (0 == pPFD)? &pfd : pPFD;
	
	if ( 0 == ( pixelformat = ::ChoosePixelFormat( m_pDC->GetSafeHdc(), pPFDtoUse ) ) ) 
	{
		::AfxMessageBox( "ChoosePixelFormat failed" );
		return FALSE;
	}

	if ( FALSE == ::SetPixelFormat( m_pDC->GetSafeHdc(), pixelformat, pPFDtoUse ) ) 
	{
		::AfxMessageBox( "SetPixelFormat failed" );
		return FALSE;
	}

	return TRUE;
}


void CJyp3041222042View::DrawScene()
{
	glEnable(GL_DEPTH_TEST);

	glClearColor(1.0f,1.0f,1.0f,1.0f);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

//	glRotatef(30.0f,1.0f,0.0f,0.0f);
//	glRotatef(-45.0f,0.0f,1.0f,0.0f);

	glPushMatrix();
	switch(flag)
	{
	case 1: 
		{
		glEnable(GL_LIGHTING);
		glEnable(GL_LIGHT0);
	//	glEnable(GL_LIGHT1);

		GLfloat position0[]={0.0,1.0,0.0,0.0};
		GLfloat diffuse0[]={1.0,0.0,1.0,1.0};
		GLfloat specular0[]={1.0,1.0,1.0,1.0};
		GLfloat ambient0[]={0.1,0.1,0.1,1.0};
	
		glLightfv(GL_LIGHT0,GL_POSITION,position0);
		glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);
		glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);
		glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);
   
		glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.2);
		glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.1);
		glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.05);

		GLfloat mat_ambient[]={0.33,0.22,0.03,1.0};
		GLfloat mat_diffuse[]={0.78,0.57,0.11,1.0};
		GLfloat mat_specular[]={0.99,0.91,0.81,1.0};
		GLfloat mat_shininess=27.8;
		glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
		glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
		glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
		glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
		glPopMatrix();

		glutSolidTeapot(1.0);

		break;
		}

	case 2: 
		{
		glEnable(GL_LIGHTING);
		//glEnable(GL_LIGHT0);
		glEnable(GL_LIGHT0);

		GLfloat position0[]={1.0,1.0,0.0,0.0};
		GLfloat diffuse0[]={1.0,1.0,1.0,1.0};
		GLfloat specular0[]={1.0,1.0,1.0,1.0};
		GLfloat ambient0[]={0.1,0.1,0.1,1.0};
	
		glLightfv(GL_LIGHT0,GL_POSITION,position0);
		glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);
		glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);
		glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);
   
		glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.2);
		glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.1);
		glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.05);

		GLfloat mat_ambient[]={0.33,0.22,0.03,1.0};
		GLfloat mat_diffuse[]={0.78,0.57,0.11,1.0};
		GLfloat mat_specular[]={0.99,0.91,0.81,1.0};
		GLfloat mat_shininess=27.8;
		glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
		glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
		glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
		glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
		glPopMatrix();

		glutSolidTeapot(1.0);

		break;
		}

	case 3: 
		{
		glEnable(GL_LIGHTING);
		//glEnable(GL_LIGHT0);
		glEnable(GL_LIGHT0);

		GLfloat position0[]={1.0,1.0,0.0,0.0};
		GLfloat diffuse0[]={0.0,1.0,1.0,1.0};
		GLfloat specular0[]={1.0,1.0,1.0,1.0};
		GLfloat ambient0[]={0.1,0.1,0.1,1.0};
	
		glLightfv(GL_LIGHT0,GL_POSITION,position0);
		glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);
		glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);
		glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);
   
		glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.2);
		glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.1);
		glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.05);

		GLfloat mat_ambient[]={0.33,0.22,0.03,1.0};
		GLfloat mat_diffuse[]={0.78,0.57,0.11,1.0};
		GLfloat mat_specular[]={0.99,0.91,0.81,1.0};
		GLfloat mat_shininess=27.8;
		glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
		glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
		glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
		glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
		glPopMatrix();

		glutSolidTeapot(1.0);

		break;
		}
	}
	
	glutSolidTeapot(1.0);
	


	SwapBuffers(wglGetCurrentDC());
}

void CJyp3041222042View::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==m_timer)
	{
		m_theta[m_axis]+=2.0;
		if(m_theta[m_axis]>360.0)
			m_theta[m_axis]-=360.0;

		Invalidate();
	}
	else
	CView::OnTimer(nIDEvent);
}

void CJyp3041222042View::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_axis=2;
	CView::OnRButtonDown(nFlags, point);
}

void CJyp3041222042View::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_axis=0;
	CView::OnLButtonDown(nFlags, point);
}

BOOL CJyp3041222042View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	// TODO: Add your message handler code here and/or call default
	m_axis=1;
	return CView::OnMouseWheel(nFlags, zDelta, pt);
}

void CJyp3041222042View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	switch(nChar)
	{
	case'X':
		m_axis=0;
		break;
	case'Y':
		m_axis=1;
		break;
	case'Z':
		m_axis=2;
		break;
	case'Q':
	case VK_ESCAPE:
		exit(1);
	}

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CJyp3041222042View::OnTeapot1() 
{
	// TODO: Add your command handler code here
	flag=1;
	DrawScene();
}

void CJyp3041222042View::OnTeapot2() 
{
	// TODO: Add your command handler code here
	flag=2;
	DrawScene();
}

void CJyp3041222042View::OnTeapot3() 
{
	// TODO: Add your command handler code here
	flag=3;
	DrawScene();
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?