📄 3d-treedlg.cpp
字号:
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 + -