www.pudn.com > stlreader.rar > ShowFirstRight.cpp


// ShowFirstRight.cpp : implementation file 
// 
 
#include "stdafx.h" 
//#include "RecordSyetem.h" 
//#include "ShowFirstRight.h" 
#include "ShowFirstRight.h" 
#include "3DModel.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CShowFirstRight 
extern C3DModel m_Model; 
CShowFirstRight::CShowFirstRight() 
{ 
	/*CString sfile1,sfile2; 
	sfile1.Format("%s","res\\xie2.bmp"); 
    sfile2.Format("%s","res\\xie1.bmp"); 
	m_foot.Init(sfile1,sfile2); 
	m_Model.InitModel(); 
	m_Model.ScaleFoot(m_foot.m_Heigth,m_foot.m_Width,1); 
	*/ 
   /* CString sfile1,sfile2; 
	sfile1.Format("%s","res\\xie2.bmp"); 
    sfile2.Format("%s","res\\xie1.bmp"); 
	m_foot.Init(sfile1,sfile2); 
	m_Model.InitModel(); 
	m_Model.ScaleFoot(m_foot.m_Heigth,m_foot.m_Width,1); 
	*/ 
	//initopengl(); 
	m_IsMoving =false; 
	isfirst =true; 
 
 
} 
 
CShowFirstRight::~CShowFirstRight() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CShowFirstRight, CWnd) 
	//{{AFX_MSG_MAP(CShowFirstRight) 
	ON_WM_PAINT() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CShowFirstRight message handlers 
 
BOOL CShowFirstRight::Create(DWORD dwStyle, CRect& rect, CWnd* pParent, UINT id) 
{ 
	BOOL result ; 
	result = CWnd::CreateEx(NULL ,  
		NULL, NULL, dwStyle,  
		rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, 
		pParent->GetSafeHwnd(), (HMENU)id) ; 
	 
    if( !result ) 
		AfxMessageBox("Error creating window"); 
	 
	m_rcImgWnd.top = m_rcImgWnd.left  = 0; 
	m_rcImgWnd.bottom = m_rcImgWnd.top + rect.Height(); 
	m_rcImgWnd.right = m_rcImgWnd.left + rect.Width(); 
	 
	//m_MemDC为CDC类的一个对象. 
	m_MemDC.CreateCompatibleDC(GetDC());// 创建什么东西? 
 
	return result; 
} 
 
void CShowFirstRight::SetImage(HBITMAP *hbp) 
{ 
	m_bpImageWnd.Attach(hbp); 
	m_bIsSetImage = TRUE	; 
	this->Invalidate(); 
} 
 
void CShowFirstRight::OnPaint()  
{    
	PaintFoot(m_zangle,-m_xangle); 
	 
	//CWnd::OnPaint(); 
	 
	//int i,j,k; 
 
	/*if(m_bIsSetImage) 
	{ 
		m_MemDC.SelectObject(m_bpImageWnd); 
		dc.BitBlt(0,0,m_rcImgWnd.Width(),m_rcImgWnd.Height(),&m_MemDC,0,0,SRCCOPY); 
	} 
	*/ 
 
 
	 
//	glutInitDisplayModel(GLUT_SINGLE|GLUT_RGB); 
	//glutInitWindowSize(500,500); 
//	glutInitWindowPosition(100,100); 
/*	glClearColor(0.2,0.2,0.2,0.8); 
	glShadeModel(GL_FLAT); 
	::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 
	 
	glLoadIdentity(); 
	//gluLookAt(0,0,5,0,0,0,0,1,0); 
	//gluLookAt(0,0,5/100,0.04,0,0,0,1/100*yaxi,0.03*xaxi); 
	glScalef(0.003,0.003,0.003); 
	glRotatef(0.5,1,0,0); 
    glRotatef(0,0,1,0); 
	glRotatef(0.4,0,0,1); 
	glColor3f (0.5,0.8,1.0); 
    //glBegin(GL_POINTS); 
   //glVertex3f( 0.4f, 0.5f, 0.0f); 
   //glColor3f(1.0f,0.0f,0.0f); 
   //glVertex3f(-0.4f,-0.5f, 0.0f); 
   //画出第一只脚 
	/*glBegin(GL_POINTS); 
   for(i=0;i=m_foot.m_maxY[i]) 
	    continue; 
		for( k=m_foot.m_minY[i];k<=m_foot.m_maxY[i];k++) 
		{  
			//j =i; 
			GLfloat x1,x2; 
			GLfloat y1,y2; 
			GLfloat z1,z2; 
			z1 =(GLfloat)(k)/1; 
			x1 =(GLfloat)(i-m_foot.m_origey2)/1; 
			y1 =(GLfloat)j/1; 
			glVertex3f(z1,x1,0); 
			 
			//glVertex3f(-0.4f,-0.5f,0.0f); 
			 
		} 
	} 
	glEnd(); 
	*/ 
   //glVertex3f( 1.0f,-1.0f, 1.0f); 
    
	   //glVertex3f(-100,-100,0); 
       //glVertex3f( 100,100,0); 
   //ReadData(); 
  /*glBegin(GL_POINTS); 
   for (i=0;i<10000;i++) 
	    
   { 
	   glVertex3f(m_Model.m_nTrueList[i][0],m_Model.m_nTrueList[i][1],m_Model.m_nTrueList[i][2]); 
	   //glVertex3f(0.4,0.5,0); 
       //glVertex3f(-0.4,-0.5,0); 
   } 
	 
   glEnd(); 
   //m_Model.DrawNurbs(0); 
    //m_Model.Draw3DModel(0); 
 
   //glViewport(100,100,500,500); 
    
   glFlush(); 
   glEnd(); 
 
   ::glFinish();*/ 
   //glRotatef(100,0.0f,1.0f,0.0f); 
   //glLoadIdentity(); 
   //glTranslatef(0,0.0f,0.5f); 
   //glRotatef(0.5,0.0f,1.0f,0.0f); 
   //glViewport(0,0,500,400); 
    
   //设置投影方式 
   /*glMatrixMode(GL_PROJECTION); 
   glLoadIdentity(); 
    
    
   //透视投影 
   gluPerspective(45.0f,1.0f,0.01f,1000.0f); 
    
    
    
   //设置观察方式 
   glMatrixMode(GL_MODELVIEW); 
   glLoadIdentity(); 
   // glColor3f(0,1,0); 
   glColor3f (0.5,0.8,1.0); 
   const GLfloat white[]={ 1.0,1.0,1.0,1.0}; 
   glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,white); 
   //gluLookAt(70.0,50.0,70.0,0.0,0.0,0.0,0.0,1.0,0.0); 
   */ 
   //gluLookAt(70.0,50.0,70.0,0.0,0.0,0.0,0.0,1.0,0.0); 
    
   //glLineWidth(1.0f); // ssj  
     
   //SwapBuffers( m_hDC ); 
    
} 
 
void CShowFirstRight::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	if(m_IsMoving) 
	{ 
		m_xangle =point.x-m_origePoint.x; 
	    m_zangle =point.y-m_origePoint.y; 
		this->Invalidate(true); 
	} 
 
} 
 
 
void CShowFirstRight::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
    m_IsMoving =TRUE; 
	if(isfirst) 
	{ 
		m_origePoint =point; 
		isfirst =false; 
	} 
 
	CWnd::OnLButtonDown(nFlags, point); 
} 
 
 
 
void CShowFirstRight::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	m_IsMoving =FALSE;  
 
	CWnd::OnLButtonUp(nFlags, point); 
} 
 
void CShowFirstRight::PaintFoot(int xaxi,int zaxi) 
{ 
   //int length =m_foot.m_footlength; 
   int i,j,k; 
 
	 
//	glutInitDisplayModel(GLUT_SINGLE|GLUT_RGB); 
	//glutInitWindowSize(500,500); 
//	glutInitWindowPosition(100,100); 
	glClearColor(0.2,0.2,0.2,0.8); 
	glShadeModel(GL_FLAT); 
	::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 
	 
	glLoadIdentity(); 
	//gluLookAt(0,0,5,0,0,0,0,1,0); 
	//gluLookAt(0,0,5/100,0.04,0,0,0,1/100*yaxi,0.03*xaxi); 
	glScalef(0.003,0.003,0.003); 
	glRotatef(xaxi,1,0,0); 
    glRotatef(zaxi,0,0,1); 
	glColor3f (0.5,0.8,1.0); 
    //glBegin(GL_POINTS); 
   //glVertex3f( 0.4f, 0.5f, 0.0f); 
   //glColor3f(1.0f,0.0f,0.0f); 
   //glVertex3f(-0.4f,-0.5f, 0.0f); 
   //画出第一只脚 
	/*glBegin(GL_POINTS); 
   for(i=0;i=m_foot.m_maxY[i]) 
	    continue; 
		for( k=m_foot.m_minY[i];k<=m_foot.m_maxY[i];k++) 
		{  
			//j =i; 
			GLfloat x1,x2; 
			GLfloat y1,y2; 
			GLfloat z1,z2; 
			z1 =(GLfloat)(k)/1; 
			x1 =(GLfloat)(i-m_foot.m_origey2)/1; 
			y1 =(GLfloat)j/1; 
			glVertex3f(z1,x1,0); 
			 
			//glVertex3f(-0.4f,-0.5f,0.0f); 
			 
		} 
	} 
	glEnd(); 
	*/ 
   //glVertex3f( 1.0f,-1.0f, 1.0f); 
    
	   //glVertex3f(-100,-100,0); 
       //glVertex3f( 100,100,0); 
   //ReadData(); 
   
   /*for (i=0;i<10000;i++) 
	    
   { 
	   glVertex3f(m_Model.m_nTrueList[i][0],m_Model.m_nTrueList[i][1],m_Model.m_nTrueList[i][2]); 
	   //glVertex3f(0.4,0.5,0); 
       //glVertex3f(-0.4,-0.5,0); 
   }*/ 
	//m_Model.DrawNurbs(0); 
    m_Model.Draw3DModel(0); 
 
   //glViewport(100,100,500,500); 
    
   glFlush(); 
   glEnd(); 
 
   ::glFinish(); 
   //glRotatef(100,0.0f,1.0f,0.0f); 
   //glLoadIdentity(); 
   //glTranslatef(0,0.0f,0.5f); 
   //glRotatef(0.5,0.0f,1.0f,0.0f); 
   //glViewport(0,0,500,400); 
    
   //设置投影方式 
   /*glMatrixMode(GL_PROJECTION); 
   glLoadIdentity(); 
    
    
   //透视投影 
   gluPerspective(45.0f,1.0f,0.01f,1000.0f); 
    
    
    
   //设置观察方式 
   glMatrixMode(GL_MODELVIEW); 
   glLoadIdentity(); 
   // glColor3f(0,1,0); 
   glColor3f (0.5,0.8,1.0); 
   const GLfloat white[]={ 1.0,1.0,1.0,1.0}; 
   glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,white); 
   //gluLookAt(70.0,50.0,70.0,0.0,0.0,0.0,0.0,1.0,0.0); 
   */ 
   //gluLookAt(70.0,50.0,70.0,0.0,0.0,0.0,0.0,1.0,0.0); 
    
   glLineWidth(1.0f); // ssj  
     
   SwapBuffers( m_hDC ); 
 
 
} 
 
void CShowFirstRight::initOpengl() 
{ 
 
	//CWnd *p = (CWnd*) GetDlgItem(IDC_IW_INRIGHT); 
    //m_pDC =p->GetDC(); 
	CString sfile1,sfile2; 
	sfile1.Format("%s","res\\xie2.bmp"); 
    sfile2.Format("%s","res\\xie1.bmp"); 
	m_foot.Init(sfile1,sfile2); 
	m_hDC=(this->GetDC())->GetSafeHdc(); 
	PIXELFORMATDESCRIPTOR pfd = {  
		sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小  
			1,                                // 版本号  
			PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图  
			PFD_SUPPORT_OPENGL |              // 支持 OpenGL  
			PFD_DOUBLEBUFFER,                 // 双缓存模式  
			PFD_TYPE_RGBA,                    // RGBA 颜色模式  
			24,                               // 24 位颜色深度  
			0, 0, 0, 0, 0, 0,                 // 忽略颜色位  
			0,                                // 没有非透明度缓存  
			0,                                // 忽略移位位  
			0,                                // 无累加缓存  
			0, 0, 0, 0,                       // 忽略累加位  
			32,                               // 32 位深度缓存      
			0,                                // 无模板缓存  
			0,                                // 无辅助缓存  
			PFD_MAIN_PLANE,                   // 主层  
			0,                                // 保留  
			0, 0, 0                           // 忽略层,可见性和损毁掩模  
	}; 	 
	int pixelformat; 
     
	 
	glEnable(GL_TEXTURE_2D);                   // 启用纹理映射(新增) 
	glShadeModel(GL_SMOOTH);                   // 启用阴影平滑 
	 
	// 设置深度缓存// 启用深度测试 
	glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
	// 所作深度测试的类型// 真正精细的透视修正 
	glDepthFunc(GL_LEQUAL);                                          
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);               
	 
	glEnable(GL_NORMALIZE); 
	glShadeModel(GL_SMOOTH); 
	 
	glEnable(GL_LIGHTING); 
	 
	glLineWidth(0.25f); 
	glPointSize(2.25f); 
	int   m_PixelFormat; 
	pixelformat = ::ChoosePixelFormat((this->GetDC())->GetSafeHdc(), &pfd);//选择像素格式 
	::SetPixelFormat((this->GetDC())->GetSafeHdc(), pixelformat, &pfd);	//设置像素格式 
	 
	m_hRC = ::wglCreateContext( m_hDC );  
	wglMakeCurrent( m_hDC, m_hRC );  
	GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; 
	 
	GLfloat mat_shininess[] = { 90.0 }; 
	 
	GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 }; 
	 
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
	 
	glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
	 
	glLightfv(GL_LIGHT0, GL_POSITION, light_position); 
	 
	//glEnable(GL_LIGHTING); 
	 
	//glEnable(GL_LIGHT0); 
	 
	glDepthFunc(GL_LEQUAL); 
	 
	glEnable(GL_DEPTH_TEST); 
}