📄 gl2view.cpp
字号:
)
{
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 + -