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

📄 mainfrm.cpp

📁 用VC++开发了一个数控加工的三维仿真程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		CBCGPDockManager::SetDockMode (DT_SMART);
		break;
	}

	CBCGPDockManager* pDockManager = GetDockManager ();
	if (pDockManager != NULL)
	{
		ASSERT_VALID (pDockManager);
		pDockManager->AdjustBarFrames ();
	}

	CBCGPTabbedControlBar::ResetTabs ();

	RecalcLayout ();
	RedrawWindow (NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

	theApp.WriteInt (_T("ApplicationLook"), m_nAppLook);
}

void CMainFrame::OnUpdateAppLook(CCmdUI* pCmdUI)
{
	pCmdUI->SetRadio (m_nAppLook == pCmdUI->m_nID);
}

CBCGPMDIChildWnd* CMainFrame::CreateDocumentWindow (LPCTSTR lpcszDocName, CObject* /*pObj*/)
{
	if (lpcszDocName != NULL && lpcszDocName [0] != '\0')
	{
		CDocument* pDoc = AfxGetApp()->OpenDocumentFile (lpcszDocName);

		if (pDoc != NULL)
		{
			POSITION pos = pDoc->GetFirstViewPosition();

			if (pos != NULL)
			{
				CView* pView = pDoc->GetNextView (pos);
				if (pView == NULL)
				{
					return NULL;
				}

				return DYNAMIC_DOWNCAST (CBCGPMDIChildWnd, pView->GetParent ());
			}   
		}
	}

	return NULL;
}

void CMainFrame::OnClose() 
{
	//	关闭程序的时候,主框架要求DialogBar隐藏.
	m_wndDialogBar.ShowControlBar(false,false,false);

	SaveMDIState (theApp.GetRegSectionPath ());
	CBCGPMDIFrameWnd::OnClose();
}

// 设置选项视图格式.
void CMainFrame::UpdateMDITabs (BOOL bResetMDIChild)
{
	CBCGPMDITabParams params;
	
	params.m_tabLocation = CBCGPTabWnd::LOCATION_TOP;		//标签位置.
	params.m_style = CBCGPTabWnd::STYLE_3D_VS2005;		//标签样式.
	params.m_bTabCloseButton = FALSE;				//标签上是否设置close按钮.
	params.m_bActiveTabCloseButton = TRUE;		//激活的标签上是否设置close按钮.
	params.m_bAutoColor = FALSE;			//标签是否自动用颜色进行区分.
	params.m_bDocumentMenu = TRUE;		//是否在顶栏上添加下拉按钮以显示所有打开文档,以便于选择激活.
	params.m_bEnableTabSwap = TRUE;		//是否可以拖动标签.
	params.m_nTabBorderSize = 1;		//设置边框宽度.
	params.m_bTabIcons = TRUE;				//是否允许在标签上添加图标.
	params.m_bFlatFrame = TRUE;				//是否平铺的框架.
	params.m_bTabCustomTooltips = FALSE;	//当鼠标位于标签时,是否弹出自定义的提示.

	EnableMDITabbedGroups (TRUE, params);

	// Some "Windows..." commands are non-relevant when all MDI child windows
	// are always maximized:
	// 当子窗口为最大化时,屏蔽某些windows消息.
	CList<UINT, UINT> lstCommands;

	if (TRUE)
	{
		lstCommands.AddTail (ID_WINDOW_CASCADE);
		lstCommands.AddTail (ID_WINDOW_TILE_HORZ);
		lstCommands.AddTail (ID_WINDOW_ARRANGE);
	}

	CBCGPToolBar::SetNonPermittedCommands (lstCommands);

	if (bResetMDIChild)
	{
		// Adjust MDI child windows:
		BOOL bMaximize = TRUE;

		for (int iTab = 0; iTab < GetMDITabs().GetTabsNum (); iTab++)
		{
			CWnd* pWnd = GetMDITabs().GetTabWnd (iTab);
			ASSERT_VALID (pWnd);

			if (bMaximize)
			{
				pWnd->ModifyStyle (WS_SYSMENU, 0);
			}
		}

		if (bMaximize)
		{
			m_wndMenuBar.SetMaximizeMode (FALSE);
		}
	}

	// 更改workspace的Z order,使其位于最上面.
	if (m_wndWorkSpace.IsAutoHideMode ())
	{
		m_wndWorkSpace.BringWindowToTop ();
		CBCGPSlider* pSlider = m_wndWorkSpace.GetDefaultSlider ();
		if (pSlider != NULL)
		{
			pSlider->BringWindowToTop ();
		}
	}

//	CBCGPMDIFrameWnd::m_bDisableSetRedraw = TRUE;

	RecalcLayout ();
	RedrawWindow (NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
}



//*****************************************************************************************
// 网络实现相关代码.

// 登录到同步仿真服务器按钮的消息处理函数.
void CMainFrame::OnLogonSynSimulaServer()
{
	CLogonSynSimulaServerDlg dlg(AfxGetMainWnd());
	dlg.DoModal();
}

void CMainFrame::OnUpdateLogonSynSimulaServer(CCmdUI* pCmdUI)
{
	if(theApp.m_Socket_SynSimula != NULL)
		pCmdUI->Enable(false);
	else
		pCmdUI->Enable(true);
}

void CMainFrame::OnLogoutSynSimulaServer()
{
	if(theApp.m_Socket_SynSimula != NULL)
	{
		// 主动向同步仿真服务器发出注销申请.
		// 不能用只在客户端删除套接字的方式完成注销,是因为还要在同步仿真服务器端维护
		// 必要的数据,比如同步仿真服务器端用于与该客户端进行通信的套接字还有其它的一
		// 些数据结构.
		CNCMessage msg;
		msg.m_strMessage = _T("QUIT");
		theApp.m_Socket_SynSimula->SendNetMessage(msg);
	}
}

void CMainFrame::OnUpdateLogoutSynSimulaServer(CCmdUI* pCmdUI)
{
	if(theApp.m_Socket_SynSimula == NULL)
		pCmdUI->Enable(false);
	else
		pCmdUI->Enable(true);
}

// 单击Taskpane上的"刷新"按钮时执行的函数.
void CMainFrame::OnRefleshSynSimulaClientList()
{
	CNCMessage msg;
	msg.m_strMessage = _T("LIST-CLIENT-ONLINE");
	theApp.m_Socket_SynSimula->SendNetMessage(msg);
}

void CMainFrame::OnStartSynSimula()
{
	// 首先保护GridList控件,使之在同步仿真的过程中不能被改动.
	m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.SetReadOnly(true);

	// 保证选择本客户端作为同步仿真的一个客户端,因为同步仿真是由本客户端发起的.
	for(int i=0;i<m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRowCount();i++)
	{
		if(theApp.m_strNCClientUserID == (CString)(m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRow(i)->GetItem(1)->GetValue()))
		{
			m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRow(i)->GetItem(0)->SetValue(true);		
		}
	}

	// 检查包括本客户端,是否存在两个以上的客户端,因为同步仿真需要两个以上的客户端.
	int iCount = 0;
	for(int j=0;j<m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRowCount();j++)
	{
		if(m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRow(j)->GetItem(0)->GetValue())
			iCount++ ;	
	}
	if(iCount >= 2)
	{
		// 验证成功,在此添加同步仿真相应的处理代码.

		// 判断有没有正在激活(也就是显示)的文档.
		CDocument *pDocument = this->GetActiveFrame()->GetActiveDocument();
		if(pDocument != NULL)
		{
			// 检测到有打开的NC代码,在此添加处理代码.
			CNCSimulaSysView *pActiveView = (CNCSimulaSysView*)this->GetActiveFrame()->GetActiveView();
			CBCGPEditCtrl *pEditCtrl = pActiveView->GetEditCtrl();
			
			// 读取编辑视图的内容.
			CString strContent;
			pEditCtrl->GetWindowTextA(strContent);

			// 读取该次仿真的客户端列表.
			CString strUserName,strMessage;
			for(int i=0;i<m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRowCount();i++)
			{
				if(i == m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRowCount()-1)
				{
					strUserName += m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRow(i)->GetItem(1)->GetValue();
				}
				else
				{
					strUserName += m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.GetRow(i)->GetItem(1)->GetValue();
					strUserName += _T("*");
				}
			
			}
			
			// 整合发送的消息,格式为:SYSI客户端名称*客户端名称||||||||||||@@@@@@@@@@@@||||||||||||@@@@@@@@@@@@||||||||||||编辑视图内容.
			strMessage = _T("SYSI") + strUserName + _T("||||||||||||@@@@@@@@@@@@||||||||||||@@@@@@@@@@@@||||||||||||") + strContent;

			// 向服务器发送消息.
			CNCMessage msg;
			msg.m_strMessage = strMessage;
			theApp.m_Socket_SynSimula->SendNetMessage(msg);
		}
		else
		{
			AfxMessageBox(_T("程序检测到没有打开的NC代码."));
		}
	}
	else
	{
		// 如果没有两个以上的客户端参加同步仿真,则置GridList控件为可编辑状态.
		m_wndTaskPane.m_wndGridCtrl_SynSimulaServer_ClientList.SetReadOnly(false);
		AfxMessageBox(_T("同步仿真需要选择两个以上(包括两个)的客户端."));
	}
}

void CMainFrame::OnUpdateStartSynSimula(CCmdUI* pCmdUI)
{
	if(theApp.m_Socket_SynSimula == NULL)
	{
		pCmdUI->Enable(false);
	}
	else
	{
		pCmdUI->Enable(true);
	}

}

// 点击TaskPane"文件服务器"面板上的登录到文件服务器按钮的消息处理函数.
void CMainFrame::OnLogonFileServer()
{
	CLogonFileServerDlg dlg(AfxGetMainWnd());
	dlg.DoModal();	
}

void CMainFrame::OnUpdateLogonFileServer(CCmdUI* pCmdUI)
{
	if(theApp.m_Socket_File != NULL)
		pCmdUI->Enable(false);
	else
		pCmdUI->Enable(true);	
}

// TaskPane上"文件服务器"面板上的工具栏.
void CMainFrame::OnTaskPaneServerFileToolBarItemSel(UINT nID)
{
	if(nID == ID_TOOLBAR_TASKPANE_SERVERFILE_UP)
	{
		CNCMessage msg;
		msg.m_strMessage = _T("LIST-UPDATE-FILESLIST-UP");
		if(theApp.m_Socket_File != NULL)
		{
			theApp.m_Socket_File->SendNetMessage(msg);
		}
	}
	if(nID == ID_TOOLBAR_TASKPANE_SERVERFILE_REFLESH)
	{
		CNCMessage msg;
		msg.m_strMessage = _T("LIST-REFLESH-FILESLIST");
		if(theApp.m_Socket_File != NULL)
		{
			theApp.m_Socket_File->SendNetMessage(msg);
		}
	}
	if(nID == ID_TOOLBAR_TASKPANE_SERVERFILE_UPLOAD)
	{}
	if(nID == ID_TOOLBAR_TASKPANE_SERVERFILE_DOWNLOAD)
	{
		// 检测是否有选中的文件.
		int iHaveSelectedFileNo = 0;

		for(int i=0;i<m_wndTaskPane.m_wndGridCtrl_ServerFile.GetRowCount();i++)
		{
			if(m_wndTaskPane.m_wndGridCtrl_ServerFile.GetRow(i)->IsSelected() && (CString)m_wndTaskPane.m_wndGridCtrl_ServerFile.GetRow(i)->GetItem(2)->GetValue() == _T("文  件"))
			{
				iHaveSelectedFileNo ++ ;

				// 通知服务器端要下载的文件.
				CNCMessage msg;
				msg.m_strMessage = _T("DWLD-REQUIRE-") + (CString)m_wndTaskPane.m_wndGridCtrl_ServerFile.GetRow(i)->GetItem(0)->GetValue();
				
				if(theApp.m_Socket_File != NULL)
					theApp.m_Socket_File->SendNetMessage(msg);
			}
		}

		if(iHaveSelectedFileNo == 0)
		{
			AfxMessageBox(_T("请确认已经选择要下载的文件,\n文件夹不可下载."));
		}
	}
}

//void OnUpdateTaskPaneServerFileToolBarItemSel(CCmdUI* pCmdUI)
//{}
void CMainFrame::OnLogoutFileServer()
{
	if(theApp.m_Socket_File != NULL)
	{
		// 主动向文件服务器发出注销申请.
		// 不能用只在客户端删除套接字的方式完成注销,是因为还要在文件服务器端维护
		// 必要的数据,比如文件服务器端用户与该客户端进行通信的套接字还有其它的一
		// 些数据结构.
		CNCMessage msg;
		msg.m_strMessage = _T("QUIT");
		theApp.m_Socket_File->SendNetMessage(msg);
	}
}

void CMainFrame::OnUpdateLogoutFileServer(CCmdUI* pCmdUI)
{
	if(theApp.m_Socket_File != NULL)
		pCmdUI->Enable(true);
	else
		pCmdUI->Enable(false);	
}

void CMainFrame::OnSimulaToolbarItemSel(UINT nID)
{
	// 动态显示功能模块的初始化.
	if(nID == ID_SIMULA_PLAY)
	{
		m_uID_simulatoolbar = ID_SIMULA_PLAY;
			
		if(!m_bSimulaHaveStart)
		{
			// 弹出Open Inventor的DialogBar.
			m_wndDialogBar.ShowControlBar(true,false,false);

			// 使坐标记录数组复位.
			for(int i=0;i<3;i++)
			{
				m_fCoordinate_relative[i] = 0.0f;
				m_fCoordinate_absolute[i] = 0.0f;
			}

			// 初始化根节点及其它.
			m_root->removeAllChildren();
	//		m_root->ref();

			// 添加第一个相机节点.
			SoOrthographicCamera *camera_ortho_simula = new SoOrthographicCamera();
			camera_ortho_simula->position.setValue(0, 0, 90);
			camera_ortho_simula->height=500;
			camera_ortho_simula->aspectRatio=1.0;
			m_root->addChild(camera_ortho_simula);

			// 仿真节点.
			simula_sep=new SoSeparator();
			m_root->addChild(simula_sep);	
			
			// 添加坐标轴节点.
			SoSeparator *axis_sep = new SoSeparator();
			SoInput *axis_in = new SoInput(); 
			axis_in->openFile("axis.iv");
			axis_sep = SoDB::readAll(axis_in);
			simula_sep->addChild(axis_sep);	
			
			// 添加刀具分割符节点.
			SoSeparator *tools_sep = new SoSeparator();
			m_tools_trans=new SoTranslation();
			tools_sep->addChild(m_tools_trans);
			SoCube *cube = new SoCube();
			tools_sep->addChild(cube);
			cube->height=7;
			m_tools_trans->translation.setValue(0,0,0);
			simula_sep->addChild(tools_sep);		
			
			// 添加第二个相机节点.
			SoOrthographicCamera *camera_ortho_coords = new SoOrthographicCamera();
	//		camera_ortho_coords->position.setValue(0, 0, 90);
	//		camera_ortho_coords->height=500;
	//		camera_ortho_coords->aspectRatio=1.0;
			m_root->addChild(camera_ortho_coords);

			//  添加坐标显示节点的内容.

⌨️ 快捷键说明

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