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

📄 gl2view.cpp

📁 该文件是教你如何来保存窗口的图形,以及如何截取图形.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
           )
        {
			for (i = 1 ; i <= 12 ; i++)
                pPal->palPalEntry[defaultOverride[i]] = defaultPalEntry[i];
        }

        m_cPalette.CreatePalette(pPal);
        delete pPal;

		// set the palette
        m_pOldPalette=m_pDC->SelectPalette(&m_cPalette, FALSE);
        m_pDC->RealizePalette();
    }
}

unsigned char CGl2View::ComponentFromIndex(int i, UINT nbits, UINT shift)
{
    unsigned char val;

    val = (unsigned char) (i >> shift);
    switch (nbits) 
	{

    case 1:
        val &= 0x1;
        return _oneto8[val];
    case 2:
        val &= 0x3;
        return _twoto8[val];
    case 3:
        val &= 0x7;
        return _threeto8[val];

    default:
        return 0;
    }
}

void CGl2View::OnTimer(UINT nIDEvent) 
{
	m_fAngleY+=10.f;
	m_fAngleX+=1.0f;
	m_fAngleZ+=5.0f;
	Invalidate(FALSE);
	// TODO: Add your message handler code here and/or call default
	
	CView::OnTimer(nIDEvent);
}

void CGl2View::OnPlayPause() 
{
	m_play=m_play?FALSE:TRUE;
	if(m_play)
		SetTimer(1,45,NULL);
	else
		KillTimer(1);
	// TODO: Add your command handler code here
	
}
void CGl2View::DrawCube()
{
	



	glPushMatrix();
	     glRotatef(30.0f,1.0f,0.0f,0.0f);

         glRotatef(20.0f,0.0f,1.0f,0.0f);

	     glScalef(1.2f,1.2f,1.2f);
	     
		 double dNormal[3];
 /////////////////////////////在前面
		 
		 double dPoint1[3]={-0.5,0.5,0.5};
	     double dPoint2[3]={-0.5,-0.5,0.5};
	     double dPoint3[3]={0.5,-0.5,0.5};
		 double dPoint4[3]={0.5,0.5,0.5};
		 CalculateNormal(dPoint1,dPoint2,dPoint3,dNormal);
		 
         glBegin(GL_POLYGON);
		      glNormal3dv(dNormal);

	          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();
          
//////////////////////////////在右面

//	      dPoint1[3]={0.5,0.5,0.5};
//	      dPoint2[3]={0.5,-0.5,0.5};
//	      dPoint3[3]={0.5,-0.5,-0.5};
//		  dPoint4[3]={0.5,0.5,-0.5};

	   dPoint1[0]=0.5;dPoint1[1]=0.5;dPoint1[2]=0.5;
	   dPoint2[0]=0.5;dPoint2[1]=-0.5;dPoint2[2]=0.5;
	   dPoint3[0]=0.5;dPoint3[1]=-0.5;dPoint3[2]=-0.5;
	   dPoint4[0]=0.5;dPoint4[1]=0.5;dPoint4[2]=-0.5;


		 CalculateNormal(dPoint1,dPoint2,dPoint3,dNormal);
         glBegin(GL_POLYGON); 
              glNormal3dv(dNormal);

	          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();

///////////////////////在后面
//          dPoint1[3]={0.5,0.5,-0.5};
//	      dPoint2[3]={0.5,-0.5,-0.5};
//	      dPoint3[3]={-0.5,-0.5,-0.5};
//		  dPoint4[3]={-0.5,0.5,-0.5};


       dPoint1[0]=0.5;dPoint1[1]=0.5;dPoint1[2]=-0.5;
	   dPoint2[0]=0.5;dPoint2[1]=-0.5;dPoint2[2]=-0.5;
	   dPoint3[0]=-0.5;dPoint3[1]=-0.5;dPoint3[2]=-0.5;
	   dPoint4[0]=-0.5;dPoint4[1]=0.5;dPoint4[2]=-0.5;
		 CalculateNormal(dPoint1,dPoint2,dPoint3,dNormal);
         glBegin(GL_POLYGON);
	          glNormal3dv(dNormal);

	          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();
////////////////////////在左面
//	     dPoint1[3]={-0.5,0.5,-0.5};
//	     dPoint2[3]={-0.5,-0.5,-0.5};
//	      dPoint3[3]={-0.5,-0.5,0.5};
//		  dPoint4[3]={-0.5,0.5,0.5};
	    dPoint1[0]=-0.5;dPoint1[1]=0.5;dPoint1[2]=-0.5;
	   dPoint2[0]=-0.5;dPoint2[1]=-0.5;dPoint2[2]=-0.5;
	   dPoint3[0]=-0.5;dPoint3[1]=-0.5;dPoint3[2]=0.5;
	   dPoint4[0]=-0.5;dPoint4[1]=0.5;dPoint4[2]=0.5;
		 CalculateNormal(dPoint1,dPoint2,dPoint3,dNormal);

       glBegin(GL_POLYGON);
	          glNormal3dv(dNormal);

	          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();

///////////////////////在下面

//	     dPoint1[3]={-0.5,-0.5,0.5};
//	     dPoint2[3]={-0.5,-0.5,-0.5};
//	     dPoint3[3]={0.5,-0.5,-0.5};
//		 dPoint4[3]={0.5,-0.5,-0.5};
	    dPoint1[0]=-0.5;dPoint1[1]=-0.5;dPoint1[2]=0.5;
	   dPoint2[0]=-0.5;dPoint2[1]=-0.5;dPoint2[2]=-0.5;
	   dPoint3[0]=0.5;dPoint3[1]=-0.5;dPoint3[2]=-0.5;
	   dPoint4[0]=0.5;dPoint4[1]=-0.5;dPoint4[2]=-0.5;
		 CalculateNormal(dPoint1,dPoint2,dPoint3,dNormal);
	   glBegin(GL_POLYGON);
	          glNormal3dv(dNormal);

	          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();
			    
///////////////////在上面
//	     dPoint1[3]={-0.5,0.5,-0.5};
//	     dPoint2[3]={-0.5,0.5,0.5};
//	      dPoint3[3]={0.5,0.5,0.5};
//		  dPoint4[3]={0.5,0.5,-0.5};
	    dPoint1[0]=-0.5;dPoint1[1]=0.5;dPoint1[2]=-0.5;
	   dPoint2[0]=-0.5;dPoint2[1]=0.5;dPoint2[2]=0.5;
	   dPoint3[0]=0.5;dPoint3[1]=0.5;dPoint3[2]=0.5;
	   dPoint4[0]=0.5;dPoint4[1]=0.5;dPoint4[2]=-0.5;
		 CalculateNormal(dPoint1,dPoint2,dPoint3,dNormal);
	   glBegin(GL_POLYGON);
	          glNormal3dv(dNormal);
			  
	          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();

	 glPopMatrix();
	

	

	

}
void CGl2View::CalculateNormal(GLdouble* dVertex1,GLdouble* dVertex2,GLdouble* dVertex3,GLdouble* dNormal)
{

    GLdouble dVector1[3],dVector2[3];
	dVector1[0]=dVertex2[0]-dVertex1[0];
	dVector1[1]=dVertex2[1]-dVertex1[1];
	dVector1[2]=dVertex2[2]-dVertex1[2];

	dVector2[0]=dVertex3[0]-dVertex1[0];
	dVector2[1]=dVertex3[1]-dVertex1[1];
	dVector2[2]=dVertex3[2]-dVertex1[2];

	dNormal[0]=dVector1[1]*dVector2[2]-dVector1[2]*dVector2[1];
	dNormal[1]=dVector1[2]*dVector2[0]-dVector1[0]*dVector2[2];
	dNormal[2]=dVector1[0]*dVector2[1]-dVector1[1]*dVector2[0];

	double dNormalLength=sqrt(dNormal[0]*dNormal[0]+dNormal[1]*dNormal[1]+dNormal[2]*dNormal[2]);
    
	if(dNormalLength!=0.0)
	{
		dNormal[0]=dNormal[0]/dNormalLength;
		dNormal[1]=dNormal[1]/dNormalLength;
		dNormal[2]=dNormal[2]/dNormalLength;

	}
	else
	{
		dNormal[0]=0.0;
		dNormal[1]=0.0;
		dNormal[2]=0.0;

	}


}
void CGl2View::CreatLights()
{
	glLightfv(GL_LIGHT0,GL_AMBIENT,m_lightAmb);
	glLightfv(GL_LIGHT0,GL_DIFFUSE,m_lightDif);
	glLightfv(GL_LIGHT0,GL_SPECULAR,m_lightSpe);

	glLightfv(GL_LIGHT0,GL_POSITION,m_lightPos);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
}

void CGl2View::OnLButtonDown(UINT nFlags, CPoint point) 
{

	if (!m_bSaveRectBMP)
	{
		MouseDownPoint=point;
		// capture mouse movements even outside window borders
		SetCapture();
	}
	else
	{
		c_down = point;
		c_last = point;
		Zoom_in_First = point;        //保存矩形区域的左上角坐标
		SetCapture();                 //设置输入焦点
		::SetCursor ( AfxGetApp()->LoadStandardCursor( IDC_SIZENWSE ) ); //改变鼠标光标状态
	}
	// TODO: Add your message handler code here and/or call default
	
	CView::OnLButtonDown(nFlags, point);
}

void CGl2View::OnFileSavetobmpClientbmp() 
{
	m_nSaveBMPFlag = BMPCLIENT;
	SaveToBMP();	
	// TODO: Add your command handler code here
	
}

void CGl2View::OnFileSavetobmpRectanglebmp() 
{
	m_nSaveBMPFlag = BMPRECT;
	m_bSaveRectBMP = TRUE;
	// TODO: Add your command handler code here
	
}

void CGl2View::OnFileSavetobmpWindowsbmp() 
{
	m_nSaveBMPFlag = BMPWINDOW;
	SaveToBMP();
	// TODO: Add your command handler code here
	
}
void CGl2View::SaveToBMP()
{
	GetDIB();
	if( hDIB == NULL )
	{
		MessageBox("HDIB handle is NULL, save abort !!!");
		return;
	}
	CFileDialog  dilg(FALSE, NULL, "*.bmp", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
					  "Bitmap Files (*.bmp)|*.bmp|All Files (*.*)|*.*||");
												   
	dilg.m_ofn.lpstrTitle="保存位图对话框";
	if( dilg.DoModal() != IDOK )
	{
		FreeDIB();
		return;
	}
	CString pszPathName = dilg.GetPathName();

	CFile file;
	CFileException fe;

	if (!file.Open(pszPathName, CFile::modeCreate |
	  CFile::modeReadWrite | CFile::shareExclusive, &fe))
	{
		FreeDIB();
		MessageBox("不能保存为此位图 <" + pszPathName + "> !!!");
		return;
	}

	BOOL bSuccess = FALSE;
	TRY
	{
		BeginWaitCursor();
	  //bSuccess = ::SaveDIB(hDIB, (HANDLE)file.m_hFile);
	    bSuccess=::SaveDIB(hDIB,(HANDLE)file.m_hFile);
		file.Close();
	}
	CATCH (CException, eSave)
	{
		file.Abort(); // will not throw an exception
		EndWaitCursor();
		FreeDIB();
		MessageBox("不能保存此位图文件 <" + pszPathName + "> !!!");
		return;
	}
	END_CATCH
	EndWaitCursor();
	if (!bSuccess)  
	{
		FreeDIB();
		MessageBox("不能保存为此位图 <" + pszPathName + "> !!!");
	}

	FreeDIB();
}
void CGl2View::GetDIB()
{
	if(hDIB != NULL)
	{
		::GlobalUnlock(hDIB);
		::GlobalFree(hDIB);
		hDIB = NULL;
	}
	switch(m_nSaveBMPFlag)
	{
	case BMPWINDOW:
		hDIB = ::CopyWindowToDIB(AfxGetApp()->m_pMainWnd->GetSafeHwnd(), m_nSaveBMPFlag);
		break;
	case BMPCLIENT:
		hDIB = ::CopyWindowToDIB(GetSafeHwnd(), m_nSaveBMPFlag);
		break;
	case BMPRECT:
		hDIB = ::CopyRectToDIB(GetSafeHwnd(), &m_Rect);
		break;
	}
}

void CGl2View::FreeDIB()
{
	::GlobalUnlock(hDIB);
	::GlobalFree(hDIB);
	hDIB = NULL;
}

void CGl2View::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if (!m_bSaveRectBMP)
	{
		// forget where we clicked
		MouseDownPoint=CPoint(0,0);
		// release mouse capture
		ReleaseCapture();
	}
	else
	{
		Zoom_in_Last = point;           //保存矩形区域的右下角坐标
        ::SetCursor ( AfxGetApp()->LoadStandardCursor( IDC_ARROW ) ); //改变鼠标光标状态
        ReleaseCapture();               //释放鼠标输入焦点
		m_bSaveRectBMP = FALSE;
		m_Rect.left	  = Zoom_in_First.x + 1;
		m_Rect.top    = Zoom_in_First.y + 1;
		m_Rect.right  = Zoom_in_Last.x  - 1;
		m_Rect.bottom = Zoom_in_Last.y  - 1;
		c_down.x = c_down.y = 0;
		c_last.x = c_last.y = 0;
		SaveToBMP();
	}
	// TODO: Add your message handler code here and/or call default
	
	CView::OnLButtonUp(nFlags, point);
}

void CGl2View::OnMouseMove(UINT nFlags, CPoint point) 
{

	CGl2Doc* pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	if (!m_bSaveRectBMP)
	{
	
//			// check if we have captured the mouse
			if (GetCapture()==this)
			{
				// increment the object rotation angles
				X_Angle-=double(point.y-MouseDownPoint.y)/3.6;
			    Y_Angle+=double(point.x-MouseDownPoint.x)/3.6;
				Z_Angle+=double(point.x-MouseDownPoint.x)/3.6;//double(point.x+point.y-MouseDownPoint.x-MouseDownPoint.y)/3.6;
				// remember the mouse point
				MouseDownPoint=point;
				
			};Invalidate(FALSE);
//		case 2:
//			if(GetCapture()==this)
//			{
//				X_Trans+=double(point.x-MouseDownPoint.x)/64;
//				Y_Trans-=double(point.y-MouseDownPoint.y)/64;
//				MouseDownPoint=point;
//			};

	}//endif
	else 
	{
		if (GetCapture() == this)
		{
    		CClientDC dc(this);
    		OnPrepareDC(&dc);
    		dc.DPtoLP(&point);
    		//下面是象皮条拉出一个矩形框
    	    CRect rect(c_down.x, c_down.y, c_last.x, c_last.y);
    	    rect.NormalizeRect();
    	    dc.DrawFocusRect(rect);
    	    rect.SetRect(c_down.x, c_down.y, point.x, point.y);
    	    rect.NormalizeRect();
			dc.DrawFocusRect(rect);
    		c_last = point;
		}//endif
	}//endelse
	// TODO: Add your message handler code here and/or call default
	
	CView::OnMouseMove(nFlags, point);
}

⌨️ 快捷键说明

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