⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssg_026_01view.cpp

📁 用vc++制作的茶壶
💻 CPP
字号:
// SSG_026_01View.cpp : implementation of the CSSG_026_01View class
//

#include "stdafx.h"
#include "SSG_026_01.h"

#include "SSG_026_01Doc.h"
#include "SSG_026_01View.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSSG_026_01View

IMPLEMENT_DYNCREATE(CSSG_026_01View, CView)

BEGIN_MESSAGE_MAP(CSSG_026_01View, CView)
	//{{AFX_MSG_MAP(CSSG_026_01View)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
	ON_WM_TIMER()
	ON_WM_RBUTTONDOWN()
	ON_WM_MOUSEWHEEL()
	ON_WM_LBUTTONDOWN()
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_1, On1)
	ON_COMMAND(ID_2, On2)
	ON_COMMAND(ID_3, On3)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CSSG_026_01View construction/destruction

CSSG_026_01View::CSSG_026_01View()
{
	// TODO: add construction code here
	m_timer=1;

	m_theta[0]=0;
	m_theta[1]=0;
	m_theta[2]=0;

	m_axis=1;
	m_type=1;
}

CSSG_026_01View::~CSSG_026_01View()
{
}

BOOL CSSG_026_01View::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);
}

/////////////////////////////////////////////////////////////////////////////
// CSSG_026_01View drawing

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

/////////////////////////////////////////////////////////////////////////////
// CSSG_026_01View printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSSG_026_01View diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSSG_026_01View message handlers

int CSSG_026_01View::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,1000,NULL);

	return 0;
}

void CSSG_026_01View::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 CSSG_026_01View::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	//	return CView::OnEraseBkgnd(pDC);

	return TRUE;
}

void CSSG_026_01View::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(-4.0,4.0,-4.0,4.0,-5.0,5.0);
	//glOrtho(-2.0,2.0,-2.0,2.0,-2.0,2.0);
	//glRotatef(30.f,1.0f,0.0f,0.0f);
	//glRotatef(-135.0f,0.0f,1.0f,0.0f);
}
BOOL CSSG_026_01View::SetupPixelFormat(PIXELFORMATDESCRIPTOR* pPFD)
{
	PIXELFORMATDESCRIPTOR pfd = {
		sizeof( PIXELFORMATDESCRIPTOR ),
			1,
			//PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL,
			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 CSSG_026_01View::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();

	glPushMatrix();

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);

	GLfloat position0[]={0.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);
	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();*/
	glEnable(GL_DEPTH_TEST);
	glClearColor(1.0f,1.0f,1.0f,1.0f);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glColor3f(1.0f,0.0f,0.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glRotatef(30.0f,1.0f,0.0f,0.0f);
 
	switch(m_type)
	{
	case 1:
		{
			glPushMatrix();
				glEnable(GL_LIGHTING);
				glEnable(GL_LIGHT0);

				GLfloat position0[]={0,1,0,0};
				GLfloat diffuse0[]={1,0,0,1};
				GLfloat specular0[]={1,1,1,1};
				GLfloat ambient0[]={0.1,0.1,0.1,1};
				glLightfv(GL_LIGHT0,GL_POSITION,position0);
				glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);
				glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);
				glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);
				glutSolidTeapot(1.0);
			glPopMatrix();
			break;
		}
	case 2:
		{
			/*glPushMatrix();
				glEnable(GL_LIGHTING);
				glEnable(GL_LIGHT0);

				GLfloat position0[]={0,1,0,1};
				GLfloat diffuse0[]={1,0,0,1};
				GLfloat specular0[]={1,1,1,1};
				GLfloat ambient0[]={0.1,0.1,0.1,1};
				glLightfv(GL_LIGHT0,GL_POSITION,position0);
				glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);
				glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);
				glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);
				glutSolidTeapot(1.0);
			glPopMatrix();*/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();

	glPushMatrix();

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);

	GLfloat position0[]={0.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);
	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();
			break;
		}
	case 3:
		{
			glPushMatrix();
				glEnable(GL_LIGHTING);
				glEnable(GL_LIGHT0);

				GLfloat position0[]={0,1,0,1};
				GLfloat diffuse0[]={1,0,0,1};
				GLfloat specular0[]={1,1,1,1};
				GLfloat ambient0[]={0.1,0.1,0.1,1};
				glLightfv(GL_LIGHT0,GL_POSITION,position0);
				glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);
				glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);
				glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);

				GLfloat spot_direction0[]={0.0,-1.0,0.0};
				glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spot_direction0);
				glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,1.0);
				glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.5);
				glutSolidTeapot(1.0);
			glPopMatrix();
			break;
		}
	}
	//glColor3f(1.0f,0.0f,0.0f);
	glutSolidTeapot(1.0);
	SwapBuffers(wglGetCurrentDC());
}

void CSSG_026_01View::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 CSSG_026_01View::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_axis=0;
	CView::OnLButtonDown(nFlags, point);
}
BOOL CSSG_026_01View::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 CSSG_026_01View::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
		m_axis=2;
	CView::OnRButtonDown(nFlags, point);
}



void CSSG_026_01View::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 CSSG_026_01View::On1() 
{
	// TODO: Add your command handler code here
	m_type=1;
	DrawScene();  

}

void CSSG_026_01View::On2() 
{
	// TODO: Add your command handler code here
	m_type=2;
	DrawScene();
}

void CSSG_026_01View::On3() 
{
	// TODO: Add your command handler code here
	m_type=3;
	DrawScene();
}

⌨️ 快捷键说明

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