📄 ssg_026_01view.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 + -