www.pudn.com > music_spring.rar > springView.cpp


// springView.cpp : implementation of the CSpringView class 
// 
 
#include "stdafx.h" 
#include "spring.h" 
 
#include "springDoc.h" 
#include "springView.h" 
#include "glaux.h" 
 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CSpringView 
 
IMPLEMENT_DYNCREATE(CSpringView, CView) 
 
BEGIN_MESSAGE_MAP(CSpringView, CView) 
	//{{AFX_MSG_MAP(CSpringView) 
	ON_WM_ERASEBKGND() 
	ON_WM_CREATE() 
	ON_WM_DESTROY() 
	ON_WM_SIZE() 
	ON_WM_TIMER() 
	ON_COMMAND(ID_LIGHT_C, OnLightC) 
	ON_COMMAND(ID_LIGHT_O, OnLightO) 
	ON_COMMAND(ID_MUSIC_C, OnMusicC) 
	ON_COMMAND(ID_CHANGE, OnChange) 
	ON_COMMAND(ID_LOW, OnLow) 
	ON_COMMAND(ID_MEDIA, OnMedia) 
	ON_COMMAND(ID_HIGH, OnHigh) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSpringView construction/destruction 
 
CSpringView::CSpringView() 
{ 
	// TODO: add construction code here 
	t=0; 
	blight=TRUE; 
	number=6000; 
 
} 
 
CSpringView::~CSpringView() 
{ 
} 
 
BOOL CSpringView::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); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CSpringView drawing 
 
void CSpringView::OnDraw(CDC* pDC) 
{ 
	CSpringDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
	drawSence(); 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CSpringView diagnostics 
 
#ifdef _DEBUG 
void CSpringView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CSpringView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CSpringDoc* CSpringView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSpringDoc))); 
	return (CSpringDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CSpringView message handlers 
 
BOOL CSpringView::OnEraseBkgnd(CDC* pDC)  
{ 
	// TODO: Add your message handler code here and/or call default 
	return TRUE; 
	 
	//return CView::OnEraseBkgnd(pDC); 
} 
 
int CSpringView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	// TODO: Add your specialized creation code here 
	m_hrc=setUpOpengl(); 
	InitGL(); 
	SetTimer(1,25,NULL); 
	//PlaySound("Data/yesterday.wav", NULL, SND_SYNC); 
	wave.Play(this,"Data/情人.wav"); 
	wave.OpenDevice(); 
	 
	 
	return 0; 
} 
 
 
HGLRC CSpringView::setUpOpengl() 
{ 
	HGLRC hglrc; 
	PIXELFORMATDESCRIPTOR pfd={ 
		sizeof(PIXELFORMATDESCRIPTOR),//象素格式大小 
			1,//版本 
			PFD_DRAW_TO_WINDOW|//使之能在窗口或其他设备中画图 
			PFD_SUPPORT_OPENGL|//使之能调用OpenGL函数 
			PFD_DOUBLEBUFFER,//使之支持双缓存 
			// 		PFD_STEREO,//支持立体(NT不支持) 
			PFD_TYPE_RGBA,//使之采用RGBA模式 
			24,//24位颜色深度 
			0,0,0,//颜色位可忽略 
			0,0,0,//颜色位可忽略 
			0,//无Alpha颤抖 
			0,//无颜色抖动 
			0,//没有累积缓存 
			0,0,0,0,//累积缓存位数可以忽略 
			32,//32位深度缓存 
			0,//深度缓存位数 
			0,//辅助缓存 
			PFD_MAIN_PLANE,//主存类型 
			0,//保留 
			0,0,0,//相关掩码在此不设置 
	}; 
	CClientDC dc(this); 
	int pixelformat=ChoosePixelFormat(dc.GetSafeHdc(),&pfd); 
	if (0==pixelformat) 
	{ 
		MessageBox("ChoosePixelFormat Failed"); 
		return 0; 
	} 
	BOOL bSetpix=SetPixelFormat(dc.GetSafeHdc(),pixelformat,&pfd); 
	if (FALSE==bSetpix) 
	{ 
		MessageBox("SetPixelFormat Failed"); 
		return FALSE; 
	} 
 
 
	hglrc=::wglCreateContext(dc.GetSafeHdc()); 
	::wglMakeCurrent(dc.GetSafeHdc(),hglrc); 
	return hglrc; 
	 
} 
 
void CSpringView::OnDestroy()  
{ 
	CView::OnDestroy(); 
	 
	// TODO: Add your message handler code here 
	HGLRC hrc=NULL; 
	hrc=wglGetCurrentContext(); 
	if (hrc) 
	{ 
		wglDeleteContext(hrc); 
	} 
	 
	 
} 
 
void CSpringView::OnSize(UINT nType, int cx, int cy)  
{ 
	CView::OnSize(nType, cx, cy); 
	 
	// TODO: Add your message handler code here 
	glViewport(0,0,cx,cy); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluPerspective(65,(GLfloat)cx/(GLfloat)cy,0.1,100); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	 
} 
 
void CSpringView::InitGL() 
{ 
	 
	glClearColor(0.0,0.0,0.0,0.0); 
	glClearDepth(1.0f); 
	glShadeModel(GL_SMOOTH); 
	for (int loop=0;loop(number/4)&&loop<=(number-number/4)) 
		particle[loop].speed.yspeed=(float)(rand()%39)/10.0f+15.9; 
		else 
		particle[loop].speed.yspeed=(float)(rand()%19)/10.0f+17.9; 
		particle[loop].speed.zspeed=(float)(rand()%30-15)/10.0f; 
		particle[loop].gravity.xgravity=0.0; 
		particle[loop].gravity.ygravity=-9.8; 
		particle[loop].gravity.zgravity=0.0; 
		 
	} 
	loadTexture("Data/Particle.bmp"); 
	glEnable(GL_BLEND); 
	glBlendFunc(GL_SRC_ALPHA,GL_ONE); 
	GLfloat whieLight[]={0.6,0.6,0.6,1.0}; 
	GLfloat lightAmbient[]={0.8,0.8,0.8,1.0}; 
	GLfloat lightSpecular[]={0.3,0.3,0.3,1.0}; 
	GLfloat MatShininess[]={50.0}; 
	GLfloat MatDiffuse[]={0.2,0.2,0.2,1.0}; 
	GLfloat MatSpecular[]={0.5,0.5,0.5,1.0}; 
	GLfloat lightPosition[]={10,10,-35,1.0}; 
	GLfloat lightModel[]={0.4,0.4,0.4,1.0}; 
	glLightfv(GL_LIGHT1,GL_AMBIENT,lightAmbient); 
	glLightfv(GL_LIGHT1,GL_DIFFUSE,whieLight); 
	glLightfv(GL_LIGHT1,GL_SPECULAR,lightSpecular); 
	glLightfv(GL_LIGHT1,GL_POSITION,lightPosition); 
	glMaterialfv(GL_FRONT,GL_SPECULAR,MatSpecular); 
	glMaterialfv(GL_FRONT,GL_SHININESS,MatShininess); 
  	glMaterialfv(GL_FRONT,GL_DIFFUSE,MatDiffuse); 
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lightModel); 
    glEnable(GL_LIGHTING); 
	glEnable(GL_LIGHT1); 
 
 
	 
	 
} 
 
 
void CSpringView::drawSence() 
{ 
 
 
 
	float x,y,z; 
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
	glBindTexture(GL_TEXTURE_2D,TEXTURE); 
	glEnable(GL_TEXTURE_2D); 
	glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
	if (blight) 
		glEnable(GL_LIGHTING); 
	else 
		glDisable(GL_LIGHTING); 
	glPushMatrix(); 
	for (int loop=0;loop=-10) 
		glColor3f(particle[loop].color.r, 
		particle[loop].color.g,particle[loop].color.b); 
		if (particle[loop].pos.y<-10) 
		glColor4f(particle[loop].color.r, 
		particle[loop].color.g, 
		particle[loop].color.b,particle[loop].color.a); 
		glBegin(GL_QUADS); 
		glTexCoord2f(1.0,1.0); glVertex3f(x+0.5f,y+0.5f,z); 
		glTexCoord2d(0.0,1.0); glVertex3f(x-0.5f,y+0.5f,z);  
		glTexCoord2d(0.0,0.0); glVertex3f(x-0.5f,y-0.5f,z);  
		glTexCoord2d(1.0,0.0); glVertex3f(x+0.5f,y-0.5f,z); 
		glEnd(); 
 
		particle[loop].pos.x+=particle[loop].speed.xspeed*0.025; 
		if (particle[loop].pos.y>=-10) 
		particle[loop].pos.y+=particle[loop].speed.yspeed*0.025; 
		if (particle[loop].pos.y<-10) 
		{ 
		particle[loop].pos.y+=particle[loop].speed.yspeed*0; 
		particle[loop].color.a-=0.04; 
		} 
		particle[loop].pos.z+=particle[loop].speed.zspeed*0.025; 
		particle[loop].life-=particle[loop].fade; 
		particle[loop].speed.yspeed+=particle[loop].gravity.ygravity*0.025; 
		 
 
 
	} 
	for (loop=0;loop(number/4)&&loop<=(number-number/4)) 
		particle[loop].speed.yspeed=(float)(rand()%39)/10.0f+15.9; 
		else 
		particle[loop].speed.yspeed=(float)(rand()%19)/10.0f+17.9; 
		particle[loop].speed.zspeed=(float)(rand()%30-15)/10.0f; 
		particle[loop].gravity.xgravity=0.0; 
		particle[loop].gravity.ygravity=-9.8; 
		particle[loop].gravity.zgravity=0.0; 
	} 
	} 
 
 
 
	glPopMatrix(); 
	glFlush(); 
	CClientDC dc(this); 
	SwapBuffers(dc.GetSafeHdc()); 
} 
 
void CSpringView::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	CView::OnTimer(nIDEvent); 
	if (nIDEvent==1) 
	{ 
		Invalidate(FALSE); 
 
	} 
  
} 
 
void CSpringView::loadTexture(char* str) 
{ 
	AUX_RGBImageRec* texture; 
	texture=auxDIBImageLoad(str); 
	if (texture) 
	{ 
		glGenTextures(1,&TEXTURE); 
		glGenTextures(1,&TEXTURE); 
		 glBindTexture(GL_TEXTURE_2D,TEXTURE); 
		 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
		 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
		 glTexImage2D(GL_TEXTURE_2D,0,3,texture->sizeX,texture->sizeY, 
			 0,GL_RGB,GL_UNSIGNED_BYTE,texture->data); 
	} 
	if (texture) 
	{ 
		if (texture->data) 
		{ 
			free(texture->data); 
 
		} 
		free(texture); 
	} 
} 
 
 
 
void CSpringView::OnLightC()  
{ 
	// TODO: Add your command handler code here 
	blight=FALSE; 
	Invalidate(FALSE); 
} 
 
void CSpringView::OnLightO()  
{ 
	// TODO: Add your command handler code here 
	blight=TRUE; 
	Invalidate(FALSE); 
	 
} 
 
void CSpringView::OnMusicC()  
{ 
	// TODO: Add your command handler code here 
	wave.Stop(); 
	wave.CloseDevice(); 
 
	 
} 
 
 
 
void CSpringView::OnChange()  
{ 
	// TODO: Add your command handler code here 
	CFileDialog dlg(TRUE,"wav","*.wav"); 
	if (dlg.DoModal()!=IDOK) 
	{ 
		return; 
	} 
	CString str; 
	str=dlg.GetPathName(); 
	char* pstr=str.GetBuffer(str.GetLength()); 
	wave.Stop(); 
	wave.CloseDevice(); 
	wave.OpenDevice(); 
	wave.Play(this,pstr); 
	Invalidate(FALSE); 
 
	 
} 
 
void CSpringView::OnLow()  
{ 
	// TODO: Add your command handler code here 
	number=1000; 
	Invalidate(FALSE); 
 
	 
	 
} 
 
void CSpringView::OnMedia()  
{ 
	// TODO: Add your command handler code here 
	number=2000; 
	Invalidate(FALSE); 
	 
	 
} 
 
void CSpringView::OnHigh()  
{ 
	// TODO: Add your command handler code here 
	number=6000; 
	Invalidate(FALSE); 
	 
}