radioview.cpp

来自「VC&Matlab混合编程实现无线电导航指示器」· C++ 代码 · 共 1,001 行 · 第 1/2 页

CPP
1,001
字号
{
	 static CHOOSECOLOR cc ;
     static COLORREF    crCustColors[16] ;

     cc.lStructSize    = sizeof (CHOOSECOLOR) ;
     cc.hwndOwner      = this->GetSafeHwnd();
     cc.hInstance      = (HWND)AfxGetInstanceHandle();
     cc.rgbResult      = APPStatic::colorDlg ;//缺省颜色并返回颜色
     cc.lpCustColors   = crCustColors ;
     cc.Flags          = CC_RGBINIT;
     cc.lCustData      = 0 ;
     cc.lpfnHook       = NULL ;
     cc.lpTemplateName = NULL ;

     if(::ChooseColor (&cc))
	 {	 
		 APPStatic::colorDlg = cc.rgbResult;
		 InvalidateRect(NULL,TRUE);
	 }
	
}

LRESULT CRADIOView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	return CScrollView::DefWindowProc(message, wParam, lParam);
}


void CRADIOView::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
		// TODO: Add your specialized code here and/or call the base class
		//DRAWITEMSTRUCT *pDs=lpDrawItemStruct; 
		CDC *pDC=m_tabSheet.GetDC();
		int iIndex=m_tabSheet.GetCurSel();
		int iConunt=m_tabSheet.GetRowCount();
		CRect rectItem;
		m_tabSheet.GetItemRect(iIndex,&rectItem);
		POINT pt;
		for(int i=0;i<=iConunt;i++){
			pt.x=i*rectItem.Width();
			pt.y=rectItem.top;
			pt.x+=5;pt.y+=4;
			if(i==iIndex){
			pt.x=pt.x+2;
			pt.y=pt.y-3;
			}			
	       m_imageListTabSheets.Draw(pDC,i,pt,ILD_MASK);
		}
	    ReleaseDC(pDC);
//CRADIOView::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CRADIOView::GenAxis()
{   
	double BKColor[]={0,0,0};
	mwArray mwBkColor(1,3,BKColor);
	m_mwhFigure = figure(
		mwArray("DoubleBuffer"), mwArray("On"),
		mwArray("NumberTitle"),  mwArray("Off"),
		mwArray("Name"),         mwArray("__figure"),
		mwArray("Color"),        mwBkColor,
		mwArray("Visible"),      mwArray("off"),
		mwArray("MenuBar"),      mwArray("none")
		);
	
    m_mwhAxis= axes(mwArray("Parent"),      m_mwhFigure,
		mwArray("Box"),         mwArray("On"),
		mwArray("XGrid"),       mwArray("On"),
		mwArray("YGrid"),       mwArray("On"),
		mwArray("zGrid"),       mwArray("On"),
		mwArray("xcolor"),      horzcat(0.7,.7,.7),
        mwArray("ycolor"),      horzcat(0.7,.7,.7),
		mwArray("zcolor"),      horzcat(0.7,.7,.7),
		mwArray("color"),       horzcat(0,0,.502));
	mwArray xLabel=get(m_mwhAxis,"xlabel");
	mwArray yLabel=get(m_mwhAxis,"ylabel");
	mwArray zLabel=get(m_mwhAxis,"zlabel");
	set(xLabel,"string","东向位置(E)/米","fontsize",8);
	set(yLabel,"string","北向位置(N)/米","fontsize",8);
	set(zLabel,"string","天向位置(U)/米","fontsize",8);
	double dColor[3]={.3,1,.2};
	m_mwhLineTraj=line(mwArray(0),mwArray(0),"parent",m_mwhAxis,"color",mwArray(1,3,dColor),"linewidth",2);
	m_mwhBeacon=line("xdata",0,"ydata",0,"zdata",0,"visible","off","parent",m_mwhAxis);
    Vset(m_mwhAxis,"NextPlot","add");//hold on

}

void CRADIOView::DockMatlabFigure(mwArray mwhFigure,CWnd *pParentWnd)
{
	
	mwArray mwFigName=get(mwhFigure,mwArray("name"));
	char *pCharFigureName=strdup((char*)(mwFigName.ToString()));
	HWND hFig = ::FindWindow(NULL,pCharFigureName);
	if(hFig == NULL)
	{
		AfxMessageBox("未能产生Figure窗口,图形绘制失败!");
		return;
	}

		// 去掉Figure窗口的标题栏和边框
		long lStyle = ::GetWindowLong(hFig,GWL_STYLE);
		::SetWindowLong(hFig,GWL_STYLE,lStyle & (~WS_CAPTION) & (~WS_THICKFRAME));
	    ::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);

		// 获取绘图区域的位置和大小
		CRect rectDock;
		pParentWnd->GetClientRect(&rectDock);

		// 设置Figure窗口为绘图区域窗口的子窗口并调整其位置
		::SetParent(hFig,pParentWnd->GetSafeHwnd());
		::SetWindowPos(hFig,NULL,1,1,rectDock.Width()-3,rectDock.Height()-3,SWP_NOZORDER | SWP_NOACTIVATE);
}

void CRADIOView::OnDestroy() 
{
	CScrollView::OnDestroy();

	// TODO: Add your message handler code here

}

void CRADIOView::MakeMatlabFiguresVisible()
{
	Vset(m_mwhFigure,"visible","on");
}

void CRADIOView::OnRotate3d() 
{
	if(m_bIsMatlabFigureShowing){		
		
		if(m_bIsRotating3D){
			rotate3d(m_mwhFigure,"off");
			setptr(m_mwhFigure,"arrow");
			m_bIsRotating3D=FALSE;
		}
		else{
			setptr(m_mwhFigure,"hand");
			rotate3d(m_mwhFigure,"on");
			m_bIsRotating3D=TRUE;
		}		
	}
}

void CRADIOView::OnUpdateRotate3d(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bIsRotating3D);
	pCmdUI->Enable(m_bIsMatlabFigureShowing && !m_bIsZooming);
	
}


void CRADIOView::OnZoom() 
{
		if(m_bIsMatlabFigureShowing ){		
		
		if(m_bIsZooming){
			setptr(m_mwhFigure,"arrow");
			Vzoom(m_mwhFigure,"off");			
			m_bIsZooming=FALSE;
		}
		else if(!m_bIsZooming && !m_bSimuStarted){
			setptr(m_mwhFigure,"glass");
			Vzoom(m_mwhFigure,"on");
			m_bIsZooming=TRUE;
		}		
	}

}

void CRADIOView::OnUpdateZoom(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bIsZooming);
	pCmdUI->Enable(m_bIsMatlabFigureShowing && !m_bIsRotating3D && !m_bSimuStarted);
	
}

void CRADIOView::OnRotate2d() 
{
//	Vaxis(m_mwhAxis,"normal");
    Vview(m_mwhAxis,2);
	
}

void CRADIOView::OnUpdateRotate2d(CCmdUI* pCmdUI) 
{
pCmdUI->Enable(m_bIsMatlabFigureShowing);
	
}

void CRADIOView::OnAxiscolor() 
{
	NMTOOLBAR nmtb;
	nmtb.iItem=ID_AXISCOLOR;
	((CMainFrame*)AfxGetApp()->GetMainWnd())->OnToolbarDropDown(&nmtb,NULL);	
}

void CRADIOView::OnUpdateAxiscolor(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bIsMatlabFigureShowing);
	
}

void CRADIOView::OnUpdateAxistype(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bIsMatlabFigureShowing);
	
}




void CRADIOView::OnAxisauto() 
{
	Vaxis(m_mwhAxis,"auto");
	
}

void CRADIOView::OnAxisequal() 
{
	Vaxis(m_mwhAxis,"equal");
	
}

void CRADIOView::OnAxismanual() 
{
	Vaxis(m_mwhAxis,"manual");
	
}

void CRADIOView::OnAxisnormal() 
{
	Vaxis(m_mwhAxis,"normal");
	
}

void CRADIOView::OnAxison() 
{
	static BOOL bOn=TRUE;
	if(bOn)	
		Vaxis("off");
	else
		Vaxis("on");
	bOn=!bOn;
	
}

void CRADIOView::OnAxissquare() 
{
	Vaxis(m_mwhAxis,"square");
	
}

void CRADIOView::OnAxistight() 
{
	Vaxis(m_mwhAxis,"tight");
	
}

void CRADIOView::OnBoxon() 
{
	static BOOL bBox=TRUE;
	if(bBox)	
		Vset(m_mwhAxis,"box","off");
	else
		Vset(m_mwhAxis,"box","on");
	bBox=!bBox;
	
}

void CRADIOView::OnFigurecolor() 
{
	 static CHOOSECOLOR cc ;
     static COLORREF    crCustColors[16] ;

     cc.lStructSize    = sizeof (CHOOSECOLOR) ;
     cc.hwndOwner      = this->GetSafeHwnd();
     cc.hInstance      = (HWND)AfxGetInstanceHandle();
     cc.rgbResult      = NULL;//缺省颜色并返回颜色
     cc.lpCustColors   = crCustColors ;
     cc.Flags          = CC_SHOWHELP ;
     cc.lCustData      = 0 ;
     cc.lpfnHook       = NULL ;
     cc.lpTemplateName = NULL ;
    
	 if(::ChooseColor (&cc))
	 {	 double BKColor[3];
		 APPStatic::GetDoubleColor(cc.rgbResult,BKColor);
		 mwArray mwColor(1,3,BKColor);
		 Vset(m_mwhFigure,"color",mwColor);
	 }
	
}

void CRADIOView::OnXyzcolor() 
{
	 static CHOOSECOLOR cc ;
     static COLORREF    crCustColors[16] ;

     cc.lStructSize    = sizeof (CHOOSECOLOR) ;
     cc.hwndOwner      = this->GetSafeHwnd();
     cc.hInstance      = (HWND)AfxGetInstanceHandle();
     cc.rgbResult      = NULL;//缺省颜色并返回颜色
     cc.lpCustColors   = crCustColors ;
     cc.Flags          = CC_SHOWHELP ;
     cc.lCustData      = 0 ;
     cc.lpfnHook       = NULL ;
     cc.lpTemplateName = NULL ;
    
	 if(::ChooseColor (&cc))
	 {	 double BKColor[3];
		 APPStatic::GetDoubleColor(cc.rgbResult,BKColor);
		 mwArray mwColor(1,3,BKColor);
		 Vset(m_mwhAxis,"xcolor",mwColor,"ycolor",mwColor,"zcolor",mwColor);
	 }
	
}

void CRADIOView::OnAxisbackcolor() 
{
     static CHOOSECOLOR cc ;
     static COLORREF    crCustColors[16] ;

     cc.lStructSize    = sizeof (CHOOSECOLOR) ;
     cc.hwndOwner      = this->GetSafeHwnd();
     cc.hInstance      = (HWND)AfxGetInstanceHandle();
     cc.rgbResult      = m_colorAxisColor;//缺省颜色并返回颜色
     cc.lpCustColors   = crCustColors ;
     cc.Flags          = CC_RGBINIT|CC_SHOWHELP  ;
     cc.lCustData      = 0 ;
     cc.lpfnHook       = NULL ;
     cc.lpTemplateName = NULL ;
    
	 if(::ChooseColor (&cc))
	 {	 m_colorAxisColor=cc.rgbResult;
		 double BKColor[3];
		 APPStatic::GetDoubleColor(m_colorAxisColor,BKColor);
		 mwArray mwColor(1,3,BKColor);
		 Vset(m_mwhAxis,"color",mwColor);
	 }
}

void CRADIOView::OnTrajlinecolor() 
{
     static CHOOSECOLOR cc ;
     static COLORREF    crCustColors[16] ;

     cc.lStructSize    = sizeof (CHOOSECOLOR) ;
     cc.hwndOwner      = this->GetSafeHwnd();
     cc.hInstance      = (HWND)AfxGetInstanceHandle();
     cc.rgbResult      = m_colorAxisColor;//缺省颜色并返回颜色
     cc.lpCustColors   = crCustColors ;
     cc.Flags          = CC_RGBINIT|CC_SHOWHELP  ;
     cc.lCustData      = 0 ;
     cc.lpfnHook       = NULL ;
     cc.lpTemplateName = NULL ;
    
	 if(::ChooseColor (&cc))
	 {	  m_colorLineTrajColor=cc.rgbResult;
		 double dColor[3];
		 APPStatic::GetDoubleColor(m_colorLineTrajColor,dColor);		 
		 Vset(m_mwhLineTraj,"color",mwArray(1,3,dColor));
	 }
	
}

void CRADIOView::OnGrid() 
{
	static BOOL bGrid=TRUE;
	if(bGrid)	
		Vset(m_mwhAxis,"xgrid","off","ygrid","off","zgrid","off");
	else
		Vset(m_mwhAxis,"xgrid","on","ygrid","on","zgrid","on");
	bGrid=!bGrid;
	
}

void CRADIOView::OnAxislimit() 
{
	CDialogAxisLimit dialogAl;
	BOOL bAssertFailed;
    do{
		
		if(dialogAl.DoModal()==IDOK){
			//	dialogAl.UpdateData(TRUE);
			bAssertFailed=dialogAl.m_dX1>=dialogAl.m_dX2 || dialogAl.m_dY1>=dialogAl.m_dY2
				|| dialogAl.m_dZ1>=dialogAl.m_dZ2;
			if(bAssertFailed)
			{MessageBox("轴范围错误");}}
		else {
			bAssertFailed=FALSE;
			return;
		}
	}while(bAssertFailed);
	Vset(m_mwhAxis,"xlim",horzcat(dialogAl.m_dX1,dialogAl.m_dX2),
		"ylim",horzcat(dialogAl.m_dY1,dialogAl.m_dY2),
					   "zlim",horzcat(dialogAl.m_dZ1,dialogAl.m_dZ2));
}


void CRADIOView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	
	//从文件初始化
	
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}

void CRADIOView::OnView3d() 
{
	view(m_mwhAxis,-36,16);	
}

void CRADIOView::OnUpdateView3d(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bIsMatlabFigureShowing);	
}

void CRADIOView::OnTraceplane() 
{
	m_bTracePlane=!m_bTracePlane;
	//if(m_bInitState){
		Vaxis(m_mwhAxis,"auto");
//	}	
}

void CRADIOView::OnUpdateTraceplane(CCmdUI* pCmdUI) 
{
pCmdUI->Enable(m_bIsMatlabFigureShowing);
pCmdUI->SetCheck(m_bTracePlane);

	
}


void CRADIOView::OnSetbeacon() 
{     
	m_pDlgBeacon=new CDlgBeacon();
	m_pDlgBeacon->Create(IDD_BEACON,this);
	m_pDlgBeacon->ShowWindow(SW_SHOW);	
}

CBeaconManage* CRADIOView::GetBeaconManage()
{
return &m_beaconManage;
}

void CRADIOView::OnInitstate() 
{
    //从文件初始化
	m_bInitState=TRUE;
	if(!m_fileAccess.InitializeFileAccess(GetDocument()->m_strTrajFileName.GetBuffer(0))) return;   
	m_traj3dShow.Init3DShow(m_fileAccess.GetCurrentPackageData().lon,m_fileAccess.GetCurrentPackageData().lat,m_fileAccess.GetCurrentPackageData().heg);
	RefreshMeters();
	//画beacon
	m_beaconManage.DrawBeacon(m_mwhAxis);
    //
	m_dlgSheet1.m_strBeaconLa.Format("%6.3lf",0);
	m_dlgSheet1.m_strBeaconPhi.Format("%6.3lf",0);
    m_dlgSheet1.UpdateData(FALSE);
 	m_fileAccess.EndFileAccess();
}

void CRADIOView::OnUpdateInitstate(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(!m_bSimuStarted);
	
}

void CRADIOView::OnUpdateFilesetting(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(!m_bSimuStarted);
}

void CRADIOView::OnUpdateSetbeacon(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(!m_bSimuStarted);
	
}

void CRADIOView::Stop()
{

    KillTimer(ID_TIMER_SIMU);	
	KillTimer(ID_TIMER_DIS);
	KillTimer(ID_TIMER_AZ);
	KillTimer(ID_TIMER_RADIOFILE); 

    //Close,ar向File flush
	if(m_pBeaconSimu->m_pArRadio){
		m_pBeaconSimu->m_pArRadio->Close();
		delete(m_pBeaconSimu->m_pArRadio);
	}
	if(m_pBeaconSimu->m_pFileRadio){
		m_pBeaconSimu->m_pFileRadio->Close();	
		delete(m_pBeaconSimu->m_pFileRadio);
	}
}

⌨️ 快捷键说明

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