www.pudn.com > 3DTree.rar > Formcommandview.cpp


// FormCommandView.cpp 
// Created : 08/11/2001 
// Modified: 08/11/2001 
#include "stdafx.h" 
#include "3DTree.h" 
#include "MainFrm.h" 
#include "FormCommandView.h" 
#include "3DTreeDoc.h" 
#include "RenderView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) 
COLORREF CFormCommandView::m_BackColor=RGB(255,255,255); 
CFormCommandView::CFormCommandView() 
: CFormView(CFormCommandView::IDD) 
{ 
	 
	//{{AFX_DATA_INIT(CFormCommandView) 
		 
	AmbientColor = RGB(128,128,128); 
 
	m_Lighting = TRUE; 
	m_Smooth = FALSE; 
	m_Antialias = FALSE; 
	m_VRotate = FALSE; 
	m_LinkScale = FALSE; 
	//}}AFX_DATA_INIT 
} 
 
CFormCommandView::~CFormCommandView() 
{ 
} 
 
void CFormCommandView::DoDataExchange(CDataExchange* pDX) 
{ 
	CFormView::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CFormCommandView) 
	DDX_Control(pDX, IDC_FRAME_COLOR_LIGHT_AMBIENT3, m_ControlColorLightSpecular); 
	DDX_Control(pDX, IDC_FRAME_COLOR_LIGHT_AMBIENT2, m_ControlColorLightDiffuse); 
	DDX_Control(pDX, IDC_FRAME_COLOR_LIGHT_AMBIENT, m_ControlColorLightAmbient); 
	DDX_Control(pDX, IDC_SLIDER_Z, m_SliderScaleZ); 
	DDX_Control(pDX, IDC_SLIDER_Y, m_SliderScaleY); 
	DDX_Control(pDX, IDC_SLIDER_X, m_SliderScaleX); 
	DDX_Control(pDX, IDC_FRAME_COLOR_BACK, m_ControlBackColor); 
	DDX_Control(pDX,IDC_RADIO_MODEL0,m_ControlModel0); 
	DDX_Control(pDX,IDC_RADIO_MODEL1,m_ControlModel1); 
	DDX_Control(pDX,IDC_RADIO_MODEL2,m_ControlModel2); 
	DDX_Check(pDX, IDC_CHECK_LIGHTING, m_Lighting); 
	DDX_Check(pDX, IDC_CHECK_SMOOTH, m_Smooth); 
	DDX_Check(pDX, IDC_CHECK_ANTIALIAS, m_Antialias); 
	DDX_Check(pDX, IDC_CHECK_VROTATION, m_VRotate); 
	DDX_Check(pDX, IDC_CHECK_LINK_SCALE, m_LinkScale); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CFormCommandView, CFormView) 
	//{{AFX_MSG_MAP(CFormCommandView) 
	ON_WM_PAINT() 
	ON_WM_LBUTTONUP() 
	ON_BN_CLICKED(IDC_RADIO_MODEL0, OnRadioModel0) 
	ON_BN_CLICKED(IDC_RADIO_MODEL1, OnRadioModel1) 
	ON_BN_CLICKED(IDC_RADIO_MODEL2, OnRadioModel2) 
	ON_BN_CLICKED(IDC_CHECK_LIGHTING, OnCheckLighting) 
	ON_BN_CLICKED(IDC_CHECK_SMOOTH, OnCheckSmooth) 
	ON_BN_CLICKED(IDC_CHECK_VROTATION, OnCheckVrotation) 
	ON_WM_HSCROLL() 
	ON_BN_CLICKED(IDC_CHECK_LINK_SCALE, OnCheckLinkScale) 
	ON_BN_CLICKED(IDC_CHECK_ANTIALIAS, OnCheckAntialias) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
// CFormCommandView diagnostics 
#ifdef _DEBUG 
void CFormCommandView::AssertValid() const 
{ 
	CFormView::AssertValid(); 
} 
 
void CFormCommandView::Dump(CDumpContext& dc) const 
{ 
	CFormView::Dump(dc); 
} 
 
C3DTreeDoc* CFormCommandView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(C3DTreeDoc))); 
	return (C3DTreeDoc*)m_pDocument; 
} 
 
#endif //_DEBUG 
 
// OnPaint 
void CFormCommandView::OnPaint()  
{ 
	// Device context for painting 
	CPaintDC dc(this);  
	int bkmode=dc.SetBkMode(OPAQUE); 
//	dc.SetTextColor(RGB(0,0,255)); 
	CBrush brushbk(RGB(121,142,145)); 
	CRect cr; 
	GetClientRect(&cr); 
	dc.FillRect(&cr,&brushbk); 
 
	// Options are stored in Application 
	C3DTreeApp *pApp = (C3DTreeApp *)AfxGetApp(); 
	CRect rect; 
	 
	// 按所选择地颜色重新绘制背景色设置框 
	m_ControlBackColor.GetWindowRect(&rect); 
	ScreenToClient(&rect); 
	CBrush BrushBack(m_BackColor); 
	dc.FillRect(&rect,&BrushBack); 
	 
	//按所选择地颜色重新绘制环境光设置框 
	m_ControlColorLightAmbient.GetWindowRect(&rect);	 
	ScreenToClient(&rect); 
	CBrush BrushLightAmbient(AmbientColor); 
	dc.FillRect(&rect,&BrushLightAmbient); 
 
	//按所选择地颜色重新绘制漫反射光设置框 
	m_ControlColorLightDiffuse.GetWindowRect(&rect);	 
	ScreenToClient(&rect); 
	CBrush BrushLightDiffuse(DiffuseColor); 
	dc.FillRect(&rect,&BrushLightDiffuse); 
 
	// 按所选择地颜色重新绘制镜面光设置框 
	m_ControlColorLightSpecular.GetWindowRect(&rect);	 
	ScreenToClient(&rect); 
	CBrush BrushLightSpecular(SpecularColor); 
	dc.FillRect(&rect,&BrushLightSpecular); 
} 
 
// 鼠标左键抬起 
void CFormCommandView::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	CRect rect; 
	C3DTreeApp *pApp = (C3DTreeApp *)AfxGetApp(); 
	float r,g,b; 
 
	// back color 
	m_ControlBackColor.GetWindowRect(&rect);	 
	ScreenToClient(&rect); 
	if(rect.PtInRect(point)) 
	{ 
		CColorDialog dlg(m_BackColor); 
		if(dlg.DoModal()==IDOK) 
		{ 
			m_BackColor = dlg.GetColor();	 
			CRenderView *pView = (CRenderView *)GetRenderView(); 
			r = (float)GetRValue(m_BackColor) / 255.0f; 
			g = (float)GetGValue(m_BackColor) / 255.0f; 
			b = (float)GetBValue(m_BackColor) / 255.0f; 
			pView->m_ClearColorRed   = r; 
			pView->m_ClearColorGreen = g; 
			pView->m_ClearColorBlue  = b; 
			glClearColor(r,g,b,1.0f); 
			this->InvalidateRect(&rect,FALSE); 
			pView->InvalidateRect(NULL,FALSE); 
		} 
	} 
 
	// ambient light color 
	m_ControlColorLightAmbient.GetWindowRect(&rect);	 
	ScreenToClient(&rect); 
	if(rect.PtInRect(point)) 
	{ 
		CColorDialog dlg(AmbientColor); 
		if(dlg.DoModal()==IDOK) 
		{ 
			AmbientColor = dlg.GetColor();	 
			CRenderView *pView = (CRenderView *)GetRenderView(); 
			// Refresh Light0 
			r = (float)GetRValue(AmbientColor) / 255.0f; 
			g = (float)GetGValue(AmbientColor) / 255.0f; 
			b = (float)GetBValue(AmbientColor) / 255.0f; 
			float	ambientProperties[]  = {r,g,b,1.0f}; 
			glLightfv( GL_LIGHT0, GL_AMBIENT, ambientProperties); 
			// Refresh views 
			this->InvalidateRect(&rect,FALSE); 
			pView->InvalidateRect(NULL,FALSE);  
		} 
	}		 
	 
	// specular light color 
	m_ControlColorLightSpecular.GetWindowRect(&rect);	 
	ScreenToClient(&rect); 
	if(rect.PtInRect(point)) 
	{ 
		CColorDialog dlg(SpecularColor); 
		if(dlg.DoModal()==IDOK) 
		{ 
			SpecularColor = dlg.GetColor();	 
			CRenderView *pView = (CRenderView *)GetRenderView(); 
			// Refresh Light0 
			float r = (float)GetRValue(SpecularColor) / 255.0f; 
			float g = (float)GetGValue(SpecularColor) / 255.0f; 
			float b = (float)GetBValue(SpecularColor) / 255.0f; 
			float	specularProperties[]  = {r,g,b,1.0f}; 
			glLightfv( GL_LIGHT0, GL_DIFFUSE, specularProperties); 
			// Refresh views 
			this->InvalidateRect(&rect,FALSE); 
			pView->InvalidateRect(NULL,FALSE);  
		} 
	}		 
 
	// diffuse light color 
	m_ControlColorLightDiffuse.GetWindowRect(&rect);	 
	ScreenToClient(&rect); 
	if(rect.PtInRect(point)) 
	{ 
		CColorDialog dlg(DiffuseColor); 
		if(dlg.DoModal()==IDOK) 
		{ 
			DiffuseColor = dlg.GetColor();	 
			CRenderView *pView = (CRenderView *)GetRenderView(); 
			// Refresh Light0 
			float r = (float)GetRValue(DiffuseColor) / 255.0f; 
			float g = (float)GetGValue(DiffuseColor) / 255.0f; 
			float b = (float)GetBValue(DiffuseColor) / 255.0f; 
			float	diffuseProperties[]  = {r,g,b,1.0f}; 
			glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseProperties); 
			// Refresh views 
			this->InvalidateRect(&rect,FALSE); 
			pView->InvalidateRect(NULL,FALSE);  
		} 
	}		 
	CFormView::OnLButtonUp(nFlags, point); 
} 
 
// 得到绘制视图 
CView *CFormCommandView::GetRenderView()  
{ 
	C3DTreeApp *pApp = (C3DTreeApp *)AfxGetApp(); 
	CMainFrame *pFrame = (CMainFrame *)pApp->m_pMainWnd; 
	CView *pView = (CView *)pFrame->m_wndSplitter.GetPane(0,1); 
	return pView; 
} 
 
// 多边形仅绘制顶点 
void CFormCommandView::OnRadioModel0()  
{ 
	glPolygonMode(GL_FRONT_AND_BACK,GL_POINT); 
	this->GetRenderView()->InvalidateRect(NULL,FALSE);  
} 
 
// 线框式绘制多边形 
void CFormCommandView::OnRadioModel1()  
{ 
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
	this->GetRenderView()->InvalidateRect(NULL,FALSE);  
} 
 
// 填充型绘制多边形 
void CFormCommandView::OnRadioModel2()  
{ 
	glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
	this->GetRenderView()->InvalidateRect(NULL,FALSE);  
} 
 
// 是否加光照 
void CFormCommandView::OnCheckLighting()  
{ 
	m_Lighting = !m_Lighting; 
	if(m_Lighting) 
		glEnable(GL_LIGHTING); 
	else 
		glDisable(GL_LIGHTING); 
	 
	this->GetRenderView()->InvalidateRect(NULL,FALSE);  
} 
 
// 是否对多边形进行光滑处理 
void CFormCommandView::OnCheckSmooth()  
{ 
	m_Smooth = !m_Smooth; 
	if(m_Smooth) 
		glShadeModel(GL_SMOOTH); 
	else 
		glShadeModel(GL_FLAT); 
	this->GetRenderView()->InvalidateRect(NULL,FALSE);  
	 
} 
 
// 产生旋转动画 
void CFormCommandView::OnCheckVrotation()  
{ 
	m_VRotate = !m_VRotate; 
	CRenderView *pView = (CRenderView *)GetRenderView(); 
	if(m_VRotate) 
		pView->SetTimer(1,10,NULL); 
	else 
		pView->KillTimer(1); 
} 
 
// 进行一些初始设置 
void CFormCommandView::OnInitialUpdate()  
{ 
	CFormView::OnInitialUpdate(); 
	 
	// Slider 
	TRACE("Sliders : updating...\n"); 
	m_SliderScaleX.SetRange(1,100,TRUE); 
	m_SliderScaleY.SetRange(1,100,TRUE); 
	m_SliderScaleZ.SetRange(1,100,TRUE); 
 
	m_SliderScaleX.SetPos(50); 
	m_SliderScaleY.SetPos(50); 
	m_SliderScaleZ.SetPos(50); 
 
	m_ControlModel2.SetCheck(1); 
	 
} 
 
//******************************************** 
// OnHScroll 
//******************************************** 
void CFormCommandView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
	UpdateScale(); 
	GetRenderView()->InvalidateRect(NULL,FALSE);  
	CFormView::OnHScroll(nSBCode, nPos, pScrollBar); 
} 
 
 
BOOL CFormCommandView::UpdateScale()  
{ 
	CRenderView *pView = (CRenderView *)GetRenderView(); 
	//重新计算缩放比例 
	pView->m_xScaling = (float)m_SliderScaleX.GetPos()/50.0f; 
	pView->m_yScaling = (float)m_SliderScaleY.GetPos()/50.0f; 
	pView->m_zScaling = (float)m_SliderScaleZ.GetPos()/50.0f; 
	//如果三坐标连动 
	if(m_LinkScale) 
	{	//将y,z坐标按x坐标进行设置 
		m_SliderScaleY.SetPos(m_SliderScaleX.GetPos()); 
		m_SliderScaleZ.SetPos(m_SliderScaleX.GetPos()); 
		pView->m_yScaling = pView->m_zScaling = pView->m_xScaling; 
	} 
 
	return TRUE; 
} 
 
void CFormCommandView::OnCheckLinkScale()  
{ 
	m_LinkScale = !m_LinkScale;	 
 
	if(m_LinkScale) 
	{ 
		CRenderView *pView = (CRenderView *)GetRenderView(); 
		m_SliderScaleY.SetPos(m_SliderScaleX.GetPos()); 
		m_SliderScaleZ.SetPos(m_SliderScaleX.GetPos()); 
		pView->m_yScaling = pView->m_zScaling = pView->m_xScaling; 
	} 
 
	m_SliderScaleY.EnableWindow(!m_LinkScale); 
	m_SliderScaleZ.EnableWindow(!m_LinkScale); 
	GetRenderView()->InvalidateRect(NULL,FALSE); 
	 
} 
 
// 切换是否反走样 
void CFormCommandView::OnCheckAntialias()  
{ 
	m_Antialias = !m_Antialias; 
 
	if(m_Antialias) 
	{ 
		glEnable(GL_LINE_SMOOTH); 
		glEnable(GL_BLEND); 
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
		glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); 
		glLineWidth(1.5f); 
	} 
	else 
	{ 
		glDisable(GL_LINE_SMOOTH); 
		glDisable(GL_BLEND); 
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
		glHint(GL_LINE_SMOOTH_HINT,GL_NICEST); 
		glLineWidth(1.0f); 
	} 
	GetRenderView()->InvalidateRect(NULL,FALSE);  
}