OpenGL学习笔记(三)

CBlueWindView:

CBlueWindView::CBlueWindView()
{
	// TODO: add construction code here
	X_Angle=0.0;
	Y_Angle=0.0;
	m_translate = 1.0f;
	m_pDC = NULL;
}

CBlueWindView::~CBlueWindView()
{
}

BOOL CBlueWindView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
    
	//ÉèÖô°¿ÚÀàÐÍ	
	cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
		
	return CView::PreCreateWindow(cs);
}

/
// CBlueWindView drawing

void CBlueWindView::OnDraw(CDC* pDC)
{
	CBlueWindDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC );
    SwapBuffers(m_pDC->GetSafeHdc() );
	RenderScene();      //äÖȾ³¡¾°
}

/
// CBlueWindView message handlers
//ÉèÖÃÏñËظñʽ
BOOL CBlueWindView::SetupPixelFormat()
{
	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;
	pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//Ñ¡ÔñÏñËظñʽ
	::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd);  //ÉèÖÃÏñËظñʽ
	return TRUE;
	
}

//³õʼ»¯openGL³¡¾°
BOOL CBlueWindView::InitializeOpenGL(CDC *pDC)
{
	m_pDC = pDC;	
	SetupPixelFormat();	
	//Éú³É»æÖÆÃèÊö±í	
	m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());	
	//Öõ±Ç°»æÖÆÃèÊö±í	
	::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);	
	return TRUE;	
}

//²¶»ñWM_CREATEÏûÏ¢
int CBlueWindView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	//³õʼ»¯OpenGLºÍÉèÖö¨Ê±Æ÷	
	m_pDC = new CClientDC(this);	
	SetTimer(1, 20, NULL);	
	InitializeOpenGL(m_pDC);	
	//	
	Init();//´Ëº¯ÊýÓйØÎÆÀíÓ³ÉäµÄ£¬ÔÚºóÃæ»áÉæ¼°µ½¡£	
	return 0;
}

//²¶»ñWM_DESTROYÏûÏ¢
void CBlueWindView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	//ɾ³ýäÖȾÉÏÏÂÎÄ¡¢¶¨Ê±Æ÷
	::wglMakeCurrent(0,0);	
	::wglDeleteContext( m_hRC);	
	if ( m_pDC )		
	{		
		delete m_pDC;		
	}	
	KillTimer(1);  
}

void CBlueWindView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	//Ìí¼Ó´°¿ÚËõ·ÅʱµÄͼÐα任º¯Êý	
	glViewport(0,0,cx,cy);	
	double  m_dAspectRatio=double(cx)/double(cy);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(40.0,m_dAspectRatio,0.001f, 10000000.0f);
	glMatrixMode(GL_MODELVIEW);
}

// ³¡¾°»æÖÆÓëäÖȾ
BOOL CBlueWindView::RenderScene()
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);	
	glPushMatrix();	
	// Ðýת¶ÔÏóÒ»¸ö¸ø¶¨µÄ½Ç¶È
	glTranslatef(0,0,-3);
	glRotated(X_Angle,1.0,0.0,0.0);
	glRotated(Y_Angle,0.0,1.0,0.0);
	glScalef(m_translate,m_translate,m_translate);	
	
	GLUquadricObj *pObj;	
	pObj = gluNewQuadric();	
	glPushAttrib(GL_ALL_ATTRIB_BITS);	
	glDisable(GL_BLEND);	
	glEnable(GL_CULL_FACE);	
	glEnable(GL_DEPTH_TEST);	
	glShadeModel(GL_SMOOTH);	
	gluQuadricDrawStyle(pObj,GLU_FILL);	
	gluQuadricNormals(pObj,GLU_SMOOTH);	
	gluQuadricOrientation(pObj,GLU_OUTSIDE);	
	gluQuadricTexture(pObj,GL_TRUE);	
	glColor3f(1.0,1.0,1.0);	
	gluSphere(pObj,1.0,100000,100000);	
	glPopAttrib();	
	glPopMatrix();	
	gluDeleteQuadric(pObj);
	glFinish();
	::SwapBuffers(m_pDC->GetSafeHdc());             //½»»¥»º³åÇø	
	return TRUE;
}

//äÖȾ³¡¾° ¼ÓÔØͼƬ
AUX_RGBImageRec* CBlueWindView::LoadBMP(CString filename)
{
	FILE *File=NULL;                          
    if (filename == _T(""))                            		
    {		
       return NULL;                           		
    }	
    File=fopen(filename,"r");                    	
    if (File)                                     		
    {		
        fclose(File);                         		
        return auxDIBImageLoad(filename);    		
    }	
	return NULL;   
}

//äÖȾ³¡¾° ¼ÓÔØÎÆÀí
GLuint CBlueWindView::LoadTexture(CString filename, int Filter, int *ImgX, int *ImgY)
{
	AUX_RGBImageRec *pImage = LoadBMP(filename);	
	if(pImage == NULL)		
	{		
		AfxMessageBox("¶ÁÈ¡ÎÆÀí´íÎó!");		
		return 0;		
	}
	
	GLuint textureID;	
	glEnable(GL_TEXTURE_2D);	
	glPixelStorei(GL_UNPACK_ALIGNMENT,1);	
	glGenTextures(1, &textureID);	
	glBindTexture(GL_TEXTURE_2D, textureID);	
	
	// Set texture parameters
	
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);	
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);	
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	
	//     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
		
	gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,pImage->sizeX,pImage->sizeY,GL_RGB,GL_UNSIGNED_BYTE,pImage->data);
		
	*ImgX = pImage->sizeX;	
	*ImgY = pImage->sizeY;
	
	delete pImage->data;//GL_COMPRESSED_RGB	
	delete pImage;	
	return textureID;
}

void CBlueWindView::Init()
{
	int texSizeX,texSizeY;
	m_EarthtexID=LoadTexture("Earth.bmp",0, &texSizeX, &texSizeY);     
}

void CBlueWindView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	// ¼Ç¼Êó±êµÄλÖÃ
	MouseDownPoint=point;
	// ²¶×½Êó±êµÄÔ˶¯
	SetCapture();

	CView::OnLButtonDown(nFlags, point);
}

void CBlueWindView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	// Êó±ê°´ÏÂλÖÃÖÃÓÚÔ­µã
	MouseDownPoint=CPoint(0,0);
	// ½â³ý²¶×½Êó±ê
	ReleaseCapture();
	
	CView::OnLButtonUp(nFlags, point);
}

void CBlueWindView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	// ¼ì²âÊÇ·ñ²¶×½Êó±ê
	if (GetCapture()==this)//µØÇòÐýת		
	{		
		// Ðýת¶ÔÏóÒ»¸ö²½³¤		
		X_Angle+=double(point.y-MouseDownPoint.y)/3.6;		
		Y_Angle+=double(point.x-MouseDownPoint.x)/3.6;		
		// ¸üг¡¾°		
		Invalidate(FALSE);		
		// ¼ÇÏÂÊó±êλÖÃ		
		MouseDownPoint=point;		
	};   
		
	if(nFlags == MK_RBUTTON)// Êó±êÓÒ¼ü±»°´Ï¡£µØÇòËõ·Å	
	{		
		m_translate *= 1+(point.y-MouseDownPoint.y)/100.0f;		
		if(m_translate <= 0.1f)			
			m_translate = 0.1f;		
		Invalidate(FALSE);		
	}
	MouseDownPoint=point;
		
	CView::OnMouseMove(nFlags, point);
}

BOOL CBlueWindView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	HCURSOR hCur  =  LoadCursor( NULL  , MAKEINTRESOURCE(32649) ) ; 
	::SetCursor(hCur);
	return TRUE;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值