📄 initview.cpp
字号:
/*//////////////////////////////////////////////////////
//
// by 啊德
//
*//////////////////////////////////////////////////////
// initView.cpp : implementation of the CInitView class
//
#include "stdafx.h"
#include "init.h"
#include "initDoc.h"
#include "initView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
GLfloat rtrix;
GLfloat rtriy;
GLfloat rtriz;
/////////////////////////////////////////////////////////////////////////////
// CInitView
IMPLEMENT_DYNCREATE(CInitView, CView)
BEGIN_MESSAGE_MAP(CInitView, CView)
//{{AFX_MSG_MAP(CInitView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_COMMAND(ID_DRAW_BOAT, OnDrawBoat)
ON_COMMAND(ID_DRAW_PEOPLE, OnDrawPeople)
ON_COMMAND(ID_EXIT, OnExit)
ON_COMMAND(ID_MOVE_LEFT, OnMoveLeft)
ON_COMMAND(ID_MOVE_RIGHT, OnMoveRight)
ON_COMMAND(ID_MOVE_UP, OnMoveUp)
ON_COMMAND(ID_ROTATE_X, OnRotateX)
ON_COMMAND(ID_ROTATE_Y, OnRotateY)
ON_COMMAND(ID_ROTATE_Z, OnRotateZ)
ON_COMMAND(ID_ROTATE_Z45, OnRotateZ45)
ON_COMMAND(ID_ZOOM_IN, OnZoomIn)
ON_COMMAND(ID_ZOOM_OUT, OnZoomOut)
ON_COMMAND(ID_MOVE_DOWN, OnMoveDown)
ON_WM_PAINT()
ON_COMMAND(ID_CUT, OnCut)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInitView construction/destruction
CInitView::CInitView()
{
// TODO: add construction code here
}
CInitView::~CInitView()
{
}
BOOL CInitView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
//cs.style|=WS_CLIPSILINGS|WS_CLIPCHILDREN;
cs.style|=WS_CLIPSIBLINGS |WS_CLIPCHILDREN;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CInitView drawing
void CInitView::OnDraw(CDC* pDC)
{
CInitDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CInitView diagnostics
#ifdef _DEBUG
void CInitView::AssertValid() const
{
CView::AssertValid();
}
void CInitView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CInitDoc* CInitView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CInitDoc)));
return (CInitDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CInitView message handlers
/*void CInitView::drawscene()
{
//clear the screen
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
//**************************
//draw your scene here
//**************************
//flush drawing command
glFlush();
}*/
/*关键一步,通过PIXELFORMATDESCRIPTOR定义所需的像素格式
RC句柄的创建*/
int CInitView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
//初始化象素表
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,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0,
};
//get the DC for the client area
CClientDC clientdc(this);
//return the requested pixel format closely mathed
int pf=ChoosePixelFormat(clientdc.m_hDC,&pfd);
//set the pixel format
BOOL rt=SetPixelFormat(clientdc.m_hDC,pf,&pfd);
//create rendering context
hglrc=wglCreateContext(clientdc.m_hDC);
return 0;
}
//函数在关闭窗口之前,删除RC,并将句柄RC置空
void CInitView::OnDestroy()
{
//CView::OnDestroy();
// TODO: Add your message handler code here
if(wglGetCurrentContext() != NULL)
wglMakeCurrent(NULL, NULL);
if(hglrc != NULL)
{
wglDeleteContext(hglrc);
hglrc=NULL;
}
CView::OnDestroy();
}
//将OnCreate()中创建的RC句柄置为当前RC,调用函数drawscene()完成OpenGL的绘图操作
//并交换前后缓冲区
/*void CInitView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
//设置当前RC
wglMakeCurrent(hDC,hglrc);
//调用drawscene()进行OpenGL绘图
drawscene();
//设置当前RC为空
wglMakeCurrent(NULL, NULL);
//交换前后缓冲区
SwapBuffers(hDC);
// Do not call CView::OnPaint() for painting messages
}*/
//作用是在窗口大小发生变化时,相应的改变窗口大小和投影变换方式
//将场景中的物体正确地显示于窗口当中
void CInitView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
GLsizei w=cx;
GLsizei h=cy;
//avoid the viewport
if(!h) return;
//define the viewport
glViewport(0,0,w,h);
//prepare for and then
glMatrixMode(GL_PROJECTION);
//define the projection transformation
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.1f,100.0f);
//******************************
//define your own projection transformation here
//*******************************
//back to modelview matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CInitView::draw_people()
{
myinit();
//glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glNewList(1,GL_COMPILE);
//glRotatef(rtri,0.0f,1.0f,0.0f);
/* glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-0.5f,-0.5f, 0.0f);
glColor3f(0.0f,0.0f,0.5f);
glVertex3f( 0.5f,-0.5f, 0.0f);
glEnd();*/
//rtri+=0.2f;
glBegin(GL_QUADS);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 0.5f, 0.5f,-0.5f);
glVertex3f(-0.5f, 0.5f,-0.5f);
glVertex3f(-0.5f, 0.5f, 0.5f);
glVertex3f( 0.5f, 0.5f, 0.5f);
glColor3f(1.0f,0.5f,0.0f);
glVertex3f( 0.5f,-0.5f, 0.5f);
glVertex3f(-0.5f,-0.5f, 0.5f);
glVertex3f(-0.5f,-0.5f,-0.5f);
glVertex3f( 0.5f,-0.5f,-0.5f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.5f, 0.5f, 0.5f);
glVertex3f(-0.5f, 0.5f, 0.5f);
glVertex3f(-0.5f,-0.5f, 0.5f);
glVertex3f( 0.5f,-0.5f, 0.5f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f( 0.5f,-0.5f,-0.5f);
glVertex3f(-0.5f,-0.5f,-0.5f);
glVertex3f(-0.5f, 0.5f,-0.5f);
glVertex3f( 0.5f, 0.5f,-0.5f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-0.5f, 0.5f, 0.5f);
glVertex3f(-0.5f, 0.5f,-0.5f);
glVertex3f(-0.5f,-0.5f,-0.5f);
glVertex3f(-0.5f,-0.5f, 0.5f);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f( 0.5f, 0.5f,-0.5f);
glVertex3f( 0.5f, 0.5f, 0.5f);
glVertex3f( 0.5f,-0.5f, 0.5f);
glVertex3f( 0.5f,-0.5f,-0.5f);
glEnd();
glEndList();
glNewList(2,GL_COMPILE);
//头
glLoadIdentity();
glTranslatef(0.0f,0.7f,0.0f);
glScalef(0.2f,0.3f,0.3f);
glCallList(1);
//体
glLoadIdentity();
glTranslatef(0.0f,0.2f,0.0f);
glScalef(0.4f,0.6f,0.6f);
glCallList(1);
//左脚
glLoadIdentity();
glTranslatef(-0.1f,-0.5f,0.0f);
glScalef(0.1f,0.7f,0.5f);
glCallList(1);
//右脚
glLoadIdentity();
glTranslatef(0.1f,-0.5f,0.0f);
glScalef(0.1f,0.7f,0.5f);
glCallList(1);
//左手
glLoadIdentity();
glTranslatef(-0.3f,0.1f,0.0f);
glScalef(0.08f,0.7f,0.5f);
glCallList(1);
//右手
glLoadIdentity();
glTranslatef(0.3f,0.1f,0.0f);
glScalef(0.08f,0.7f,0.5f);
glCallList(1);
glEndList();
glRotatef(12,1.0f,1.0f,0.0f);
glCallList(1);
stat=2;
glFlush();
}
void CInitView::draw_boat()
{
myinit();
glNewList(3,GL_COMPILE);
glBegin(GL_LINES);
glVertex3f(-0.4f,0.3f,0.0f);
glVertex3f(0.4f,0.3f,0.0f);
glVertex3f(0.4f,0.3f,0.0f);
glVertex3f(0.25f,-0.3f,0.0f);
glVertex3f(0.25f,-0.3f,0.0f);
glVertex3f(-0.25f,-0.3f,0.0f);
glVertex3f(-0.25f,-0.3f,0.0f);
glVertex3f(-0.4f,0.3f,0.0f);
glVertex3f(-0.2f,0.3f,0.0f);
glVertex3f(0.0f,0.6f,0.0f);
glVertex3f(0.0f,0.6f,0.0f);
glVertex3f(0.2f,0.3f,0.0f);
glEnd();
glEndList();
glCallList(3);
stat=3;
glFlush();
}
void CInitView::OnDrawBoat()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
glLoadIdentity();
draw_boat();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnDrawPeople()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
glLoadIdentity();
draw_people();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnExit()
{
// TODO: Add your command handler code here
exit(0);
}
void CInitView::OnMoveLeft()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glTranslatef(-0.05f,0.0f,0.0f);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnMoveRight()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glTranslatef(0.05f,0.0f,0.0f);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnMoveUp()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glTranslatef(0.0f,0.05f,0.0f);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnRotateX()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glRotatef(rtrix,1.0f,0.0f,0.0f);
/* glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-0.5f,-0.5f, 0.0f);
glColor3f(0.0f,0.0f,0.5f);
glVertex3f( 0.5f,-0.5f, 0.0f);
glEnd();*/
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
rtrix+=0.1f;
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnRotateY()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glRotatef(rtriy,0.0f,1.0f,0.0f);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
rtriy+=0.1f;
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnRotateZ()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glRotatef(rtriz,0.0f,0.0f,1.0f);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
rtriz+=0.1f;
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnRotateZ45()
{
// TODO: Add your command handler code here
}
void CInitView::OnZoomIn()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glScalef(0.8f,0.8f,0.8f);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnZoomOut()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glScalef(1.1f,1.1f,1.1f);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::myinit()
{
/* glClearColor(0.0,0.0,0.0,0.0);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);*/
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
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}
void CInitView::OnMoveDown()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
glTranslatef(0.0f,-0.05f,0.0f);
/*glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-0.5f,-0.5f, 0.0f);
glColor3f(0.0f,0.0f,0.5f);
glVertex3f( 0.5f,-0.5f, 0.0f);
glEnd();*/
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
void CInitView::OnCut()
{
// TODO: Add your command handler code here
HWND hWnd = GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc);
myinit();
GLdouble eqn[4]={0.0,1.0,0.0,0.0};
GLdouble eqn2[4]={1.0,0.0,0.0,0.0};
glClipPlane(GL_CLIP_PLANE0,eqn);
glEnable(GL_CLIP_PLANE0);
glClipPlane(GL_CLIP_PLANE1,eqn2);
glEnable(GL_CLIP_PLANE1);
if(stat==2) glCallList(1);
else if(stat==3) glCallList(3);
glFlush();
wglMakeCurrent(NULL, NULL);
SwapBuffers(hDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -