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

📄 3d-treedlg.cpp

📁 此文档是用vistual studio 2005 开发的用来描述3D-tree 的生长过程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				for ( int i = 0; i < 100; i++ ) {
					randomTree[ i ] = new MyTree();
					rand_locate[ i ] = rand() % 8;
				}
				firstGenForest = false;
			} else {
				for ( int i = 0; i < 100; i++ ) {
					randomTree[ i ]->randomGenerate();
					rand_locate[ i ] = rand() % 8;
				}
			}
			reGenerateRandomTree = false;
		}
		glPushMatrix();
		for ( int i = -5, k = 0; i < 5; i++ ) {
			glPushMatrix();
			glTranslatef( 0, 0, i * 8 );
			for ( int j = -5; j < 5; j++ ) {
				glPushMatrix();
				glTranslatef( j * 8 + rand_locate[ k++ ], rand_locate[ k++ ], 0 );
				randomTree[ ( i + 5 ) * 10 + j + 5 ]->draw();
				glPopMatrix();
			}
			glPopMatrix();
		}
		glPopMatrix();
	} else {
		if ( showGrowProcess == true ) {
			tree->showGrowProcess();
		} else {
			tree->draw();
		}
	}

	SwapBuffers(hrenderDC);
}

void CMy3DtreeDlg::OnTimer(UINT_PTR nIDEvent)
{
	if ( nIDEvent == 1 )
	{
		if ( isAutoRotate == true ) {
			rotateX--;
			rotateX = (int)rotateX % 360;
		}
		if ( tree->isGrowUp() == true) {
			showGrowProcess = false;
		}
		RenderScene();
		CDialog::OnTimer(nIDEvent);
	} else if ( nIDEvent == 2 )
	{
		KillTimer(1);
		KillTimer(2);
		infoDlg->DoModal();
		SetTimer(1,10,0);

	}
}

void CMy3DtreeDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	if ( isDrag == true ) {
		rotateX = point.x - startX;
		rotateY = point.y - startY;
		rotateX = (int)rotateX % 360;
		rotateY = (int)rotateY % 360;
	}
	CDialog::OnMouseMove(nFlags, point);
}

void CMy3DtreeDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	CRect rect;
	GetDlgItem(IDC_RENDER)->GetClientRect(&rect);
	if ( point.x > rect.left && point.x < rect.right ) {
		isDrag = true;
		startX = point.x - rotateX;
		startY = point.y - rotateY;
	}
	CDialog::OnLButtonDown(nFlags, point);
}

void CMy3DtreeDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	isDrag = false;
	CDialog::OnLButtonUp(nFlags, point);
}

//在InitDlg中重载WinHelp  
void CMy3DtreeDlg::WinHelp(DWORD dwData, UINT nCmd)    
{  
	//CDialog::WinHelp((DWORD)ID_MUNUITEM_HELP);  
}  

BOOL CMy3DtreeDlg::PreTranslateMessage(MSG* pMsg)
{
	if( pMsg->message == WM_KEYDOWN ) {
		switch(pMsg->wParam) {
			case VK_UP :
				translateY -= changeStep;
				break;
			case VK_DOWN :
				translateY += changeStep;
				break;
			case VK_LEFT :
				translateX += changeStep;
				break;
			case VK_RIGHT :
				translateX -= changeStep;
				break;
			case VK_SPACE :
				if ( tree->isGrowing() == true ) {
					tree->pauseGrow();
				} else {
					tree->playGrow();
				}
				break;
			case VK_ESCAPE :
				if (GetMenu() == NULL) {
					SetMenu( pMenu );
					pMenu->CheckMenuItem(ID_FULLSCREEN, MF_UNCHECKED);
					controlPanel->ShowWindow( 1 );
					GetDlgItem(IDC_RENDER)->SetWindowPos(NULL,0,0,mainRect.Width() - controlRect.Width(),mainRect.Height(),SWP_SHOWWINDOW);
					resetRender();
				}
				else {
					int x = MessageBox(_T("确定退出吗?"),_T("提示"),MB_YESNO|MB_ICONQUESTION);
					if(x == 6) {
						OnCancel();
					}
				}
				break;
			case VK_F1 :
				ShellExecute( NULL, _T( "open" ), _T( ".\\Help.chm" ), NULL, NULL,SW_SHOWMAXIMIZED );
				break;
			case VK_F11 :
				OnFullscreen();
				break;
			case '1' :
				OnPerspectiveViewer();
				break;
			case '2' :
				OnOrthoViewer();
				break;
			case '3' :
				OnOverlookViewer();
				break;
			case '4' :
				OnSideViewer();
				break;
			case 'm' :
			case 'M' :
				isAutoRotate = !isAutoRotate;
				break;
			case 'w' :
			case 'W' :
				translateZ += 0.1;
				break;
			case 's' :
			case 'S' :
				translateZ -= 0.1;
				break;
			case 'a' :
			case 'A' :
				rotateX += 3;
				break;
			case 'd' :
			case 'D' :
				rotateX -= 3;
				break;
			case 'l' :
			case 'L' :
				if ( glIsEnabled( GL_LIGHTING ) == GL_FALSE ) {
					glEnable( GL_LIGHTING );
				} else {
					glDisable( GL_LIGHTING );
				}
				break;
			case 't' :
			case 'T' :
				if ( glIsEnabled( GL_TEXTURE_2D ) == GL_FALSE ) {
					glEnable( GL_TEXTURE_2D );
				} else {
					glDisable( GL_TEXTURE_2D );
				}
				break;
			default:
				break;
		}
		return true;
	}
	return CDialog::PreTranslateMessage(pMsg);
}

void CMy3DtreeDlg::OnWindowPosChanged(WINDOWPOS* lpwndpos)
{
	CDialog::OnWindowPosChanged( lpwndpos );

	this->GetClientRect( &mainRect );//获得主窗口大小
	GetDlgItem(IDC_RENDER)->SetWindowPos(NULL,0,0,mainRect.Width() - controlRect.Width(),mainRect.Height(),SWP_SHOWWINDOW);
	resetRender();
}

void CMy3DtreeDlg::resetRender() {
	CRect rect;
	GetDlgItem( IDC_RENDER )->GetClientRect( &rect );
	glViewport( 0, 0 , rect.Width(), rect.Height() );
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	gluPerspective( 45.0f, ( float )rect.Width() / ( float )rect.Height(), 0.1f, 100.0f );
	glMatrixMode( GL_MODELVIEW );
}

void CMy3DtreeDlg::OnMenuitemAbout()
{
	CAboutDlg aboutDlg;
	KillTimer( 1 );
	aboutDlg.DoModal();
	SetTimer( 1, 10, 0 );
}

void CMy3DtreeDlg::OnMenuitemExit()
{
	int x = MessageBox( _T( "确定退出吗?" ), _T( "提示" ), MB_YESNO|MB_ICONWARNING );
	if(x == 6)
	{
		AfxGetMainWnd()->ShowWindow(SW_HIDE);
		OnCancel();
	}
}

void CMy3DtreeDlg::OnMunuitemHelp()
{
	ShellExecute( NULL, _T("open"), _T(".\\Help.chm"), NULL, NULL,SW_SHOWMAXIMIZED );
}

void CMy3DtreeDlg::OnBnClickedCancel()
{
	OnCancel();
}

void CMy3DtreeDlg::OnMenuitemControl()
{
	bool isControlPanelVisible = controlPanel->IsWindowVisible();
	if ( isControlPanelVisible == true ) {
		pMenu->CheckMenuItem(ID_MENUITEM_CONTROL, MF_UNCHECKED);
		controlPanel->ShowWindow( 0 );
		GetDlgItem(IDC_RENDER)->SetWindowPos(NULL,0,0,mainRect.Width(),mainRect.Height(),SWP_SHOWWINDOW);
		resetRender();
	} else {
		pMenu->CheckMenuItem(ID_MENUITEM_CONTROL, MF_CHECKED);
		controlPanel->ShowWindow( 1 );
		GetDlgItem(IDC_RENDER)->SetWindowPos(NULL,0,0,mainRect.Width() - controlRect.Width(),mainRect.Height(),SWP_SHOWWINDOW);
		resetRender();
	}
}

void CMy3DtreeDlg::OnFullscreen()
{
	bool isControlPanelVisible = controlPanel->IsWindowVisible();
	CMenu* menu = GetMenu();
	if ( menu == NULL ) {
		SetMenu( pMenu );
		pMenu->CheckMenuItem(ID_FULLSCREEN, MF_UNCHECKED);
		controlPanel->ShowWindow( 1 );
		GetDlgItem(IDC_RENDER)->SetWindowPos(NULL,0,0,mainRect.Width() - controlRect.Width(),mainRect.Height(),SWP_SHOWWINDOW);
		resetRender();
	}
	else {
		SetMenu(NULL);
		pMenu->CheckMenuItem(ID_FULLSCREEN, MF_CHECKED);
		controlPanel->ShowWindow( 0 );
		GetDlgItem(IDC_RENDER)->SetWindowPos(NULL,0,0,mainRect.Width(),mainRect.Height(),SWP_SHOWWINDOW);
		resetRender();
	}
}

void CMy3DtreeDlg::OnClose()
{
	int x = MessageBox(_T("确定退出吗?"),_T("提示"),MB_YESNO|MB_ICONQUESTION);
	if(x == 6)
	{
		CDialog::OnClose();
	}
}

void CMy3DtreeDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
	CPoint pt;
	GetCursorPos(&pt);//取得鼠标位置 
	CMenu menuPopup;
	if(menuPopup.CreatePopupMenu())
	{
		menuPopup.AppendMenu(MF_STRING,ID_FULLSCREEN,_T("全屏\tF11"));
		menuPopup.AppendMenu(MF_STRING,ID_PERSPECTIVE_VIEWER,_T("透视"));
		menuPopup.AppendMenu(MF_STRING,ID_ORTHO_VIEWER,_T("正视"));
		menuPopup.AppendMenu(MF_STRING,ID_OVERLOOK_VIEWER,_T("俯视"));
		menuPopup.AppendMenu(MF_STRING,ID_SIDE_VIEWER,_T("侧视"));
		menuPopup.AppendMenu(MF_STRING,ID_MENUITEM_AUTOMOVE,_T("自动旋转"));
		menuPopup.AppendMenu(MF_STRING,ID_MENUITEM_ABOUT,_T("关于..."));
		menuPopup.AppendMenu(MF_STRING,ID_MENUITEM_EXIT,_T("结束程序"));
		menuPopup.TrackPopupMenu (0,pt.x,pt.y, this); 
	}

	CDialog::OnRButtonUp(nFlags, point);
}

void CMy3DtreeDlg::OnOrthoViewer()
{
	rotateX = 70, rotateY = 0;
	translateX = 0.0f, translateY = -4.0f;
	translateZ = -12.0f;
}

void CMy3DtreeDlg::OnOverlookViewer()
{
	rotateX = 70, rotateY = 90;
	translateX = 0.0f, translateY = 0.0f;
	translateZ = -12.0f;
}

void CMy3DtreeDlg::OnSideViewer()
{
	rotateX = 0, rotateY = 0;
	translateX = 0.0f, translateY = -4.0f;
	translateZ = -12.0f;
}

void CMy3DtreeDlg::OnPerspectiveViewer()
{
	rotateX = 70, rotateY = 20;
	translateX = 0.0f, translateY = -4.0f;
	translateZ = -12.0f;
}

void CAboutDlg::OnBnClickedOk()
{
	OnOK();
}

void CAboutDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	m_message.SetWindowTextW(_T("    该设计为本人毕业设计,也是免费和自由软件,只要用于非商业目的,你可以合法的修改和发布改程序。\r\n    Copyleft(C)2008-2009MyHeaven, this is a freedom software, You are encouraged and legally entitled to copy, reinstall, modify, and redistribute it for yourself and your friends.Share the spirit!\r\n\t\t作者:苏州大学 文正学院:不会游泳的鱼\r\n\t\t\Email:larrytone@gmail.com"));
}

void CMy3DtreeDlg::OnMenuitemInfo()
{
	KillTimer(1);
	infoDlg->DoModal();
	SetTimer(1,10,0);
}

void CMy3DtreeDlg::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//CDialog::OnNcLButtonDblClk(nHitTest, point);
}

void CMy3DtreeDlg::OnDestroy()
{
	CDialog::OnDestroy();
	ini->writeValue( "Config", "rotateX", rotateX );
	ini->writeValue( "Config", "rotateY", rotateY );
	ini->writeValue( "Config", "translateX", translateX );
	ini->writeValue( "Config", "translateY", translateY );
	ini->writeValue( "Config", "translateZ", translateZ );
}

void CMy3DtreeDlg::OnMenuitemAutomove()
{
	isAutoRotate = !isAutoRotate;
}

⌨️ 快捷键说明

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