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

📄 cmyview.cpp

📁 本例程主要介绍了利用OpenGL来实现了如何建立一个落叶纷飞的场景
💻 CPP
字号:
// CmyView.cpp : implementation of the CCmyView class
//

#include "stdafx.h"
#include "Cmy.h"
#include "MainFrm.h"
#include "CmyDoc.h"
#include "CmyView.h"
#define ABS(x) ((x)<0?-(x):(x>0)?(x):0)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCmyView

IMPLEMENT_DYNCREATE(CCmyView, CView)

BEGIN_MESSAGE_MAP(CCmyView, CView)
	//{{AFX_MSG_MAP(CCmyView)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_BUTTON32771, OnButton32771)
	ON_WM_TIMER()
	ON_COMMAND(ID_BUTTONleaf, OnBUTTONleaf)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CCmyView construction/destruction

CCmyView::CCmyView()
{
	// TODO: add construction code here
	my_pDC=NULL;
	mytbar=FALSE;
	mysbar=FALSE;



	leafnum=0;
	leafkey=TRUE;
	jb=0.0f;
}

CCmyView::~CCmyView()
{
}

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

/////////////////////////////////////////////////////////////////////////////
// CCmyView drawing

void CCmyView::OnDraw(CDC* pDC)
{
	CCmyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	static BOOL bBusy=FALSE;
	if(bBusy)  return;
	bBusy=TRUE;
	glClearColor(0.5f,0.5f,1.0f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    //glMatrixMode(GL_MODELVIEW);
	//	glLoadIdentity();
	//mydraw();
	//glFinish();
	
	glPushMatrix();
	mydraw();
    glPopMatrix();
	
	SwapBuffers(wglGetCurrentDC());
	
	bBusy=FALSE;
}

/////////////////////////////////////////////////////////////////////////////
// CCmyView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCmyView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCmyView message handlers

int CCmyView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	first();
	return 0;
}

void CCmyView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	KillTimer(1);


	HGLRC hrc;
	hrc=::wglGetCurrentContext();
	::wglMakeCurrent(NULL,NULL);
	if (hrc)
		::wglDeleteContext(hrc);
	if(my_pDC)
		delete my_pDC;
}

void CCmyView::first()
{
	PIXELFORMATDESCRIPTOR pfd;
	int n;
	HGLRC hrc;
	my_pDC=new CClientDC(this);
	ASSERT(my_pDC!=NULL);
	if (!mypixelformat())return;
	n=::GetPixelFormat(my_pDC->GetSafeHdc());
	::DescribePixelFormat(my_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
	
	hrc=wglCreateContext(my_pDC->GetSafeHdc());
	wglMakeCurrent(my_pDC->GetSafeHdc(),hrc);
	
	GetClientRect(&my_oldRect);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

BOOL CCmyView::mypixelformat()
{
	static 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,
	};
	int pixelformat;
	
	if ((pixelformat=ChoosePixelFormat(my_pDC->GetSafeHdc(),&pfd))==0)
	{
		MessageBox("choosepixeformat failed");
		return FALSE;
	}
	if (SetPixelFormat(my_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
	{
		MessageBox("setpixwlformat failed");
		return FALSE;
	}
	return true;

}

void CCmyView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	if (cy>0)
	{
		my_oldRect.right=cx;
		my_oldRect.bottom=cy;
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		
		glFrustum(-1.0,1.0,-1.0*cy/cx,1.0*cy/cx,5.0,40.0);
		glViewport(0,0,cx,cy);
	}
	RedrawWindow();
}

void CCmyView::mydraw()
{
	//glClearColor(0.2f,0.2f,0.2f,0.9f);
   // glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

	glTranslatef(0.0f,0.0f,-5.0f);
	myfog();
    SetTimer(1,120,NULL);
	glEnable(GL_LINE_SMOOTH);
	glEnable(GL_POLYGON_SMOOTH);

	glEnable(GL_BLEND);
	glBlendFunc(GL_ONE,GL_SRC_ALPHA_SATURATE);

	glRotated(11,1.0,0.0,0.0);
	glPushMatrix();

	glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
	glColor3f(0.8f,0.2f,0.0f);
	wall();
	glTranslatef(2.0f,0.0f,0.0f);
	wall();
	glColor3f(0.5f,0.5f,0.0f);
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
	wall();
	glTranslatef(-2.0f,0.0f,0.0f);
	wall();
	glColor3f(0.1f,0.0f,0.1f);
	land();
	glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
	glColor3f(0.1f,0.2f,0.1f);
	land();
	glPopMatrix();

	for (int k=0;k<leafnum;k++)
	{
		glPushMatrix();
		glTranslatef(leafbh[k][0],leafbh[k][2],-34.0f*leafbh[k][1]+1.5f);
		glScalef(1.0f-leafbh[k][1],1.0f-leafbh[k][1],1.0f-leafbh[k][1]);
		if (leafbh[k][2]==-0.6f)
		{
			glRotated(-90,1.0,0.0,0.0);
			glRotated(leafbh[k][5]*180,0.0,0.0,1.0);
		}
		else{
			glRotated(leafbh[k][5]*180,0.0,1.0,0.0);
				glRotated(leafbh[k][3]*180,1.0,0.0,0.0);
					glRotated(leafbh[k][4]*180,0.0,0.0,1.0);
		}

		glScalef(0.5f,0.5f,0.5f);
		glColor3f(leafbh[k][3],leafbh[k][4]/1.1f,0.0f);
		myleaf2();
		glColor3f(leafbh[k][3]/1.1f,leafbh[k][4]/1.2f,0.0f);
		myleaf2();
		glPopMatrix();
	}

	glDisable(GL_BLEND);
	glDisable(GL_POLYGON_SMOOTH);
	glDisable(GL_LINE_SMOOTH);
	glDisable(GL_FOG);
}

void CCmyView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	pframe->xyshow(point.x,point.y);
	if (pframe->fullscreenkey)
	{
		if (point.y<5)
		{
			if (!mytbar)
			{
				mytbar=TRUE;
				pframe->PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
			}
			else
			{
				if (mytbar)
				{
					mytbar=FALSE;
					pframe->PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
				}
			}
		}
	}
	CView::OnMouseMove(nFlags, point);
}

void CCmyView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	pframe->xyshow(point.x,point.y);
	if (pframe->fullscreenkey)
	{
		if (!mysbar)
		{
			pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);
			mysbar=TRUE;
		}
	}
	CView::OnLButtonDown(nFlags, point);
}

void CCmyView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	pframe->xyshow(point.x,point.y);
	if (pframe->fullscreenkey)
	{
		if (mysbar)
		{
			pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);
			mysbar=FALSE;
		}
	}
	CView::OnLButtonUp(nFlags, point);
}

void CCmyView::OnButton32771() 
{
	// TODO: Add your command handler code here
	CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	if (pframe->fullscreenkey)
		
	{ if (!mysbar)
	{
		pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);
		mysbar=TRUE;
	}
	   }else
	   {
		   if (mysbar)
		   {
			   pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);mysbar=FALSE;
		   }
	   }
	   pframe->fullscreenkey=!pframe->fullscreenkey;
}

void CCmyView::land()
{
	BOOL kl=0;
	kl=0;
	for(int i=0;i<160;i++){
		glLineWidth(6.0f-0.16f*i);
		glBegin(GL_QUAD_STRIP);
		for(int j=0;j<22;j++){
			glVertex3f(-1.0f+0.2f*j-kl*0.1f,-0.61f,1.2f-0.25f*i);
			kl=!kl;
			glVertex3f(-1.0f+0.2f*j-kl*0.1f,-0.61f,0.95f-0.25f*i);
		};
		kl=!kl;
		glEnd();
	};
}

void CCmyView::wall()
{
	glShadeModel(GL_SMOOTH);
    BOOL kl=0;
	for(int i=0;i<36;i++){
		glLineWidth(4.0f-0.1f*i);
		glBegin(GL_QUAD_STRIP);
		for(int j=0;j<80;j++){
			glVertex3f(-1.0f,-0.6f+0.05f*i,1.2f-0.5f*j+kl*0.25f);
			glVertex3f(-1.0f,-0.55f+0.05f*i,1.2f-0.5f*j+kl*0.25f);
		};
		glEnd();
		kl=!kl;
	};
}

void CCmyView::myleaf2()
{
	glLineWidth(0.1f);
	glBegin(GL_LINES);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(0.15f,-0.04f,0.0f);
	glVertex3f(0.0f,0.02f,0.0f);
	glVertex3f(0.2f,0.05f,0.0f);
	glVertex3f(0.0f,0.05f,0.0f);
	glVertex3f(0.18f,0.16f,0.0f);
	glVertex3f(0.0f,0.1f,0.0f);
	glVertex3f(0.09f,0.17f,0.0f);
	glVertex3f(0.0f,0.0f,0.0f);
	glColor3f(0.7f,0.5f,0.0f);
	glVertex3f(0.0f,0.3f,0.0f);
	
	glColor3f(0.5f,0.5f,0.0f);
	glVertex3f(0.0f,0.0f,0.0f);
	glColor3f(0.3f,0.5f,0.0f);
	glVertex3f(-0.15f,-0.04f,0.0f);
	glColor3f(0.5f,0.5f,0.0f);
	glVertex3f(0.0f,0.01f,0.0f);
	glColor3f(0.3f,0.5f,0.0f);
	glVertex3f(-0.2f,0.05f,0.0f);
	glColor3f(0.5f,0.5f,0.0f);
	glVertex3f(0.0f,0.04f,0.0f);
	glColor3f(0.3f,0.5f,0.0f);
	glVertex3f(-0.18f,0.16f,0.0f);
	glColor3f(0.5f,0.5f,0.0f);
	glVertex3f(0.0f,0.09f,0.0f);
	glColor3f(0.3f,0.5f,0.0f);
	glVertex3f(-0.09f,0.17f,0.0f);
	glColor3f(0.5f,0.5f,0.0f);
	glVertex3f(0.0f,0.0f,0.0f);
	glColor3f(0.3f,0.5f,0.0f);
	glVertex3f(-0.0f,0.3f,0.0f);
	
	 glEnd();

}

void CCmyView::myfog()
{
	glEnable(GL_FOG);
	//		GLfloat fogC[4] = {0.6f, 0.5f, 0.0f, 1.0f};
	GLfloat fogC[4] = {0.5f, 0.5f, 1.0f, 1.0f};
	glFogi (GL_FOG_MODE, GL_EXP2);
	glFogfv (GL_FOG_COLOR, fogC);
	glFogf (GL_FOG_DENSITY, 0.025f*ABS(jb));
	glFogf (GL_FOG_START, 7.0);
	glFogf (GL_FOG_END, 9.0);
		glHint (GL_FOG_HINT, GL_DONT_CARE);
}

void CCmyView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (nIDEvent=1)
	{
		if (ABS(jb)>=6.1f)
		{
			jb=-6.0f;
		}
		else{
			jb=jb+0.05f;
		}

		leafbh[leafnum][0]=1.0f*(rand()-rand())/RAND_MAX;
		leafbh[leafnum][1]=1.0f*rand()/RAND_MAX;
		leafbh[leafnum][2]=1.0f*(rand()-rand())/RAND_MAX;
		leafbh[leafnum][3]=1.0f*rand()/RAND_MAX;
	    leafbh[leafnum][4]=1.0f*rand()/RAND_MAX;
        leafbh[leafnum][5]=1.0f*(rand()-rand())/RAND_MAX;

		leafnum++;
		if (leafnum>=599)
		{
			leafnum=200;
		}
		for (int k=0;k<leafnum;k++)
		{
			if (leafbh[k][2]<=-0.6f)
			{
				leafbh[k][2]=-0.6f;
			}
			else{
				leafbh[k][2]=leafbh[k][2]-0.025f;
				leafbh[k][5]=1.0f*(rand()-rand())/RAND_MAX;
			}
		}
		Invalidate(FALSE);
	}
	CView::OnTimer(nIDEvent);
}

void CCmyView::OnBUTTONleaf() 
{
	// TODO: Add your command handler code here
	/*if (leafkey)
	{
		SetTimer(1,120,NULL);

	}
	else{
		KillTimer(1);
	}

	leafkey=!leafkey;

	Invalidate(FALSE);*/
}

void CCmyView::myleaf()
{
	glShadeModel(GL_SMOOTH);
	glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

	glBegin(GL_TRIANGLE_FAN);
	glVertex3f(0.0f,0.0f,0.0f);
	glVertex3f(0.16f,-0.05f,0.0f);
	glVertex3f(0.2f,-0.05f,0.0f);
	glVertex3f(0.1f,0.0f,0.0f);
	glVertex3f(0.2f,0.05f,0.0f);
	glVertex3f(0.1f,0.06f,0.0f);
	glVertex3f(0.16f,0.08f,0.0f);
	glVertex3f(0.18f,0.16f,0.0f);
	glVertex3f(0.1f,0.16f,0.0f);
	glVertex3f(0.08f,0.09f,0.0f);
	glVertex3f(0.09f,0.17f,0.0f);
	glColor3f(0.6f,0.5f,0.0f);
	glVertex3f(0.0f,0.3f,0.0f);
	
	glColor3f(0.6f,0.5f,0.0f);
	glVertex3f(0.0f,0.3f,0.0f);
	glColor3f(0.6f,0.5f,0.0f);
	glVertex3f(-0.09f,0.17f,0.0f);
	glVertex3f(-0.08f,0.09f,0.0f);
	glVertex3f(-0.1f,0.16f,0.0f);
	glVertex3f(-0.18f,0.16f,0.0f);
	glVertex3f(-0.16f,0.08f,0.0f);
	glVertex3f(-0.1f,0.06f,0.0f);
	glVertex3f(-0.2f,0.05f,0.0f);
	glVertex3f(-0.1f,0.0f,0.0f);
	glVertex3f(-0.2f,-0.05f,0.0f);
	glVertex3f(-0.16f,-0.05f,0.0f);
	    glEnd();


}

⌨️ 快捷键说明

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