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

📄 femmeview.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	// update check boxes in the main menu...
	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();
	
	MMnu->CheckMenuItem(ID_NODE_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_SEGMENT_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_BLOCK_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_ARCSEG_OP, MF_CHECKED);
	MMnu->CheckMenuItem(ID_GROUP_OP, MF_UNCHECKED);
	   
	CToolBar *pToolBar;
	pToolBar=&MFrm->m_toolBar;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
	tc->PressButton(ID_NODE_OP,FALSE);
	tc->PressButton(ID_SEGMENT_OP,FALSE);
	tc->PressButton(ID_BLOCK_OP,FALSE);
	tc->PressButton(ID_ARCSEG_OP,TRUE);
	tc->PressButton(ID_GROUP_OP,FALSE);

//	InvalidateRect(NULL);
	DrawPSLG();
}
void CFemmeView::OnBlockOp() 
{
	// TODO: Add your command handler code here
	CFemmeDoc *pDoc;
	pDoc=GetDocument();
	pDoc->UnselectAll();
	EditAction=2;

	// update check boxes in the main menu...
	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();
	
	MMnu->CheckMenuItem(ID_NODE_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_SEGMENT_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_BLOCK_OP, MF_CHECKED);
	MMnu->CheckMenuItem(ID_ARCSEG_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_ARCSEG_OP, MF_UNCHECKED);
	   
	CToolBar *pToolBar;
	pToolBar=&MFrm->m_toolBar;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
	tc->PressButton(ID_NODE_OP,FALSE);
	tc->PressButton(ID_SEGMENT_OP,FALSE);
	tc->PressButton(ID_BLOCK_OP,TRUE);
	tc->PressButton(ID_ARCSEG_OP,FALSE);
	tc->PressButton(ID_GROUP_OP,FALSE);

//	InvalidateRect(NULL);
	DrawPSLG();
}


void CFemmeView::OnGroupOp() 
{
	// TODO: Add your command handler code here
	CFemmeDoc *pDoc;
	pDoc=GetDocument();
	pDoc->UnselectAll();
	EditAction=4;

	// update check boxes in the main menu...
	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();
	
	MMnu->CheckMenuItem(ID_NODE_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_SEGMENT_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_BLOCK_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_ARCSEG_OP, MF_UNCHECKED);
	MMnu->CheckMenuItem(ID_GROUP_OP, MF_CHECKED);

	CToolBar *pToolBar;
	pToolBar=&MFrm->m_toolBar;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
	tc->PressButton(ID_NODE_OP,FALSE);
	tc->PressButton(ID_SEGMENT_OP,FALSE);
	tc->PressButton(ID_BLOCK_OP,FALSE);
	tc->PressButton(ID_ARCSEG_OP,FALSE);
	tc->PressButton(ID_GROUP_OP,TRUE);

//	InvalidateRect(NULL);
	DrawPSLG();
}

void CFemmeView::OnMouseMove(UINT nFlags, CPoint point) 
{
	if ((bLinehook==NormalLua) || (bLinehook==HiddenLua))
	{
		StatBar->SetPaneText(0,"EXECUTING LUASCRIPT -- HIT <BREAK> TO ABORT",TRUE);
		CView::OnMouseMove(nFlags, point);
		return;
	}

	if (bLinehook==ImportDXF)
	{
		StatBar->SetPaneText(0,"IMPORTING DXF -- HIT <BREAK> TO ABORT",TRUE);
		CView::OnMouseMove(nFlags, point);
		return;
	}

	if (bLinehook==BuildMask)
	{
		StatBar->SetPaneText(0,"BUILDING STRESS TENSOR MASK -- HIT <BREAK> TO ABORT",TRUE);
		CView::OnMouseMove(nFlags, point);
		return;
	}

	static char statmsg[256];
	double x,y,q;
	RECT r;
	CFemmeDoc *pDoc=GetDocument();

	// get size of current client area and convert mouse position into
	// position on the actual drawing.
	GetClientRect(&r);
	q=pow(10.,floor(log(mag)/log(10.)+0.5));
	x=(double) point.x; y=(double) (r.bottom-point.y-1);
	x=x/mag+ox; y=y/mag+oy;
	x=floor(x*q+0.5)/q; y=floor(y*q+0.5)/q;

	// process Snap to Grid command
	if ( (SnapFlag==TRUE) && ((EditAction==0) || (EditAction==2)) )
	{
		x=GridSize*floor(0.5+x/GridSize);
		y=GridSize*floor(0.5+y/GridSize);
	}

	if((ZoomWndFlag==2) || (SelectWndFlag==2)){
		
		CDC *pDC=GetDC();
		COLORREF ocol;
		CZPix p;

		int xso,yso,xsi,ysi,xsn,ysn,i,k,lo,hi;
		DwgToScreen(wzx,wzy,&xso,&yso,&r);
		DwgToScreen(mx,my,&xsi,&ysi,&r);
		DwgToScreen(x,y,&xsn,&ysn,&r);

		// Draw old rectangle off the screen;
		if(ZoomPix.GetSize()>0){
			for(k=ZoomPix.GetSize()-1;k>=0;k--)
				pDC->SetPixel(ZoomPix[k].x,ZoomPix[k].y,ZoomPix[k].c);
			ZoomPix.RemoveAll();
		}

		// XOR new rectangle onto screen
		if(xso<xsn){ lo=xso,hi=xsn; }
		else{ lo=xsn; hi=xso; }
		for(i=lo;i<=hi;i++){
			ocol=pDC->GetPixel(i,ysn);
			p.c=ocol; p.x=i; p.y=ysn;
			ZoomPix.Add(p);
			ocol=ocol ^ RGB(255,255,255);
			pDC->SetPixel(i,ysn,ocol);
			ocol=pDC->GetPixel(i,yso);
			p.c=ocol; p.x=i; p.y=yso;
			ZoomPix.Add(p);
			ocol=ocol ^ RGB(255,255,255);
			pDC->SetPixel(i,yso,ocol);
		}
		if(yso<ysn){ lo=yso,hi=ysn; }
		else{ lo=ysn; hi=yso; }
		for(i=lo;i<=hi;i++){
			ocol=pDC->GetPixel(xso,i);
			p.c=ocol; p.x=xso; p.y=i;
			ZoomPix.Add(p);
			ocol=ocol ^ RGB(255,255,255);
			pDC->SetPixel(xso,i,ocol);
			ocol=pDC->GetPixel(xsn,i);
			p.c=ocol; p.x=xsn; p.y=i;
			ZoomPix.Add(p);
			ocol=ocol ^ RGB(255,255,255);
			pDC->SetPixel(xsn,i,ocol);
		}

		ReleaseDC(pDC);

	}

	if(SelectCircFlag==2){
		CDC *pDC=GetDC();
		COLORREF ocol;
		CZPix p;
		double R;
		CComplex q;

		int xso,yso,xsi,ysi,xsn,ysn,i,k;
		DwgToScreen(wzx,wzy,&xso,&yso,&r);
		DwgToScreen(mx,my,&xsi,&ysi,&r);
		DwgToScreen(x,y,&xsn,&ysn,&r);

		// Draw old circle off the screen;
		if(ZoomPix.GetSize()>0){
			for(k=ZoomPix.GetSize()-1;k>=0;k--)
				pDC->SetPixel(ZoomPix[k].x,ZoomPix[k].y,ZoomPix[k].c);
			ZoomPix.RemoveAll();
		}

		// XOR new rectangle onto screen
		R=abs((xso-xsn)+I*(yso-ysn));
		for(i=1;i<=(int)(2.*PI*R);i++){
			q=R*exp(I*((double) i)/R)+(xso+I*yso);
			ocol=pDC->GetPixel((int) Re(q),(int) Im(q));
			p.c=ocol; p.x=(int) Re(q); p.y=(int) Im(q);
			ZoomPix.Add(p);
			ocol=ocol ^ RGB(255,255,255);
			pDC->SetPixel((int) Re(q),(int) Im(q),ocol);
		}

		ReleaseDC(pDC);

	}


	// update mouse location;
	mx=x; my=y;

	if ((pDoc->Coords==FALSE) && (pDoc->ProblemType==0))
		sprintf(statmsg,"(x=%.4f,y=%.4f)",x,y);
	else if ((pDoc->Coords==FALSE) && (pDoc->ProblemType==1))
		sprintf(statmsg,"(r=%.4f,z=%.4f)",x,y);
	else sprintf(statmsg,"(%.4f at %.4f deg)",sqrt(x*x+y*y),atan2(y,x)*180/PI);
	StatBar->SetPaneText(0,statmsg,TRUE);

	CView::OnMouseMove(nFlags, point);
}

void CFemmeView::OnZoomIn() 
{
	// TODO: Add your command handler code here
	RECT r;
	double x,y;

	GetClientRect(&r);
	x=r.right; y=r.bottom;
	ox=ox+0.25*x/mag;
	oy=oy+0.25*y/mag;
	mag*=2.;

	InvalidateRect(NULL);
}

void CFemmeView::OnZoomOut() 
{
	// TODO: Add your command handler code here
	RECT r;
	double x,y;

	GetClientRect(&r);
	x=r.right; y=r.bottom;
	ox=ox-0.5*x/mag;
	oy=oy-0.5*y/mag;
	mag/=2.;

	InvalidateRect(NULL);
}

void CFemmeView::OnZoomNatural() 
{
	// TODO: Add your command handler code here
	CFemmeDoc *pDoc=GetDocument();
	double x[2],y[2],m[2],w,R,dt;
	RECT r;
	int i,j,k;
	CComplex p,s,c;

	// look at points, block labels, and arcs to get bounding box.

	if (pDoc->nodelist.GetSize()<2) return;

	x[0]=pDoc->nodelist[0].x;	x[1]=pDoc->nodelist[0].x;
	y[0]=pDoc->nodelist[0].y;	y[1]=pDoc->nodelist[0].y;
	for(i=1;i<pDoc->nodelist.GetSize();i++)
	{
		if(pDoc->nodelist[i].x<x[0]) x[0]=pDoc->nodelist[i].x;
		if(pDoc->nodelist[i].x>x[1]) x[1]=pDoc->nodelist[i].x;
		if(pDoc->nodelist[i].y<y[0]) y[0]=pDoc->nodelist[i].y;
		if(pDoc->nodelist[i].y>y[1]) y[1]=pDoc->nodelist[i].y;
	}

	for(i=0;i<pDoc->blocklist.GetSize();i++)
	{
		if(pDoc->blocklist[i].x<x[0]) x[0]=pDoc->blocklist[i].x;
		if(pDoc->blocklist[i].x>x[1]) x[1]=pDoc->blocklist[i].x;
		if(pDoc->blocklist[i].y<y[0]) y[0]=pDoc->blocklist[i].y;
		if(pDoc->blocklist[i].y>y[1]) y[1]=pDoc->blocklist[i].y;
	}

	for(i=0;i<pDoc->arclist.GetSize();i++)
	{
		k=(int) ceil(pDoc->arclist[i].ArcLength/pDoc->arclist[i].MaxSideLength);
		dt=pDoc->arclist[i].ArcLength*PI/(((double) k)*180.);
		pDoc->GetCircle(pDoc->arclist[i],c,R);
		p.Set(pDoc->nodelist[pDoc->arclist[i].n0].x,
			  pDoc->nodelist[pDoc->arclist[i].n0].y);
		s=exp(I*dt);
		for(j=0;j<k;j++){
			p=(p-c)*s+c;
			if(p.re<x[0]) x[0]=p.re;
			if(p.re>x[1]) x[1]=p.re;
			if(p.im<y[0]) y[0]=p.im;
			if(p.im>y[1]) y[1]=p.im;
		}
	}

	if(pDoc->FirstDraw==TRUE){
		if((x[1]-x[0]) > (y[1]-y[0])) w=(x[1]-x[0]);
		else w=(y[1]-y[0]);
		if(w!=0)
			GridSize=pow(10.,floor(log(w)/log(10.)-0.5));
	}

	ox=x[0]; oy=y[0];
	GetClientRect(&r);
	m[0]=((double) (r.right-1))/(x[1]-x[0]);
	m[1]=((double) (r.bottom-1))/(y[1]-y[0]);

	if(m[0]<m[1]) mag=m[0];
	else mag=m[1];
	
	if(pDoc->FirstDraw==TRUE)
		pDoc->FirstDraw=FALSE;
	else InvalidateRect(NULL);
}

void CFemmeView::OnZoomWnd() 
{
	// TODO: Add your command handler code here
	ZoomWndFlag=TRUE;
	SelectWndFlag=FALSE;
	SelectCircFlag=FALSE;
	CreateRadiusFlag=FALSE;
}

void CFemmeView::OnSelectwnd() 
{
	SelectWndFlag=TRUE;
	ZoomWndFlag=FALSE;
	SelectCircFlag=FALSE;
	CreateRadiusFlag=FALSE;

	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();
	CToolBar *pToolBar=&MFrm->m_toolBar;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
	tc->PressButton(ID_SELECTWND,TRUE);
}

void CFemmeView::OnFDSelectCirc() 
{
	SelectCircFlag=TRUE;
	SelectWndFlag=FALSE;
	CreateRadiusFlag=FALSE;
	ZoomWndFlag=FALSE;

	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();
	CToolBar *pToolBar=&MFrm->m_toolBar;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();
	tc->PressButton(ID_FD_SELECTCIRC,TRUE);
}


void CFemmeView::OnShowGrid() 
{
	// TODO: Add your command handler code here
	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();
	CToolBar *pToolBar;
	pToolBar=&MFrm->m_toolBar2;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();

	if(GridFlag==TRUE){
		GridFlag=FALSE;
		MMnu->CheckMenuItem(ID_SHOW_GRID, MF_UNCHECKED);
		tc->PressButton(ID_SHOW_GRID,FALSE);
	}
	else{
		GridFlag=TRUE;
		MMnu->CheckMenuItem(ID_SHOW_GRID, MF_CHECKED);
		tc->PressButton(ID_SHOW_GRID,TRUE);
	}

	InvalidateRect(NULL);
}

void CFemmeView::OnSetGrid() 
{
	// TODO: Add your command handler code here
	GRIDDLG pDlg;
	CFemmeDoc *pDoc=GetDocument();
	// Send present parameter values to the dialog
	// pDlg.m_rji=TheDoc->vi[0];
	pDlg.m_gridsize       = GridSize;
	pDlg.coords			  = pDoc->Coords;
	
	// Display dialog and collect data
	if(pDlg.DoModal()==IDOK)
	{
		GridSize=pDlg.m_gridsize;
		pDoc->Coords=pDlg.coords;
		InvalidateRect(NULL);
	}
}

void CFemmeView::OnSnapGrid() 
{
	// TODO: Add your command handler code here
	CMainFrame *MFrm;
	MFrm=(CMainFrame *)GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();
	CToolBar *pToolBar;
	pToolBar=&MFrm->m_toolBar2;    
	CToolBarCtrl *tc=&pToolBar->GetToolBarCtrl();

	if(SnapFlag==TRUE){
		SnapFlag=FALSE;
		MMnu->CheckMenuItem(ID_SNAP_GRID, MF_UNCHECKED);
		tc->PressButton(ID_SNAP_GRID,FALSE);
	}
	else{
		SnapFlag=TRUE;
		MMnu->CheckMenuItem(ID_SNAP_GRID, MF_CHECKED);
		tc->PressButton(ID_SNAP_GRID,TRUE);
	}
}

void CFemmeView::OnShowMesh() 
{
	// TODO: Add your command handler code here
	CFrameWnd *MFrm;
	MFrm=GetTopLevelFrame();
	CMenu* MMnu=MFrm->GetMenu();

	if(MeshFlag==TRUE){
		MeshFlag=FALSE;
		MMnu->CheckMenuItem(ID_SHOW_MESH, MF_UNCHECKED);
	}
	else if(MeshUpToDate==TRUE){
		MeshFlag=TRUE;
		MMnu->CheckMenuItem(ID_SHOW_MESH, MF_CHECKED);
	}
	InvalidateRect(NULL);
}

void CFemmeView::OnEditCopyAsMetafile() 
{
    // puts a metafile drawing of the screen on the clipboard
    CMetaFileDC Meta;
    RECT r;
    CRgn R;

    Meta.CreateEnhanced(NULL,NULL,NULL,NULL);
    GetClientRect(&r);
    R.CreateRectRgnIndirect(&r);
    Meta.SelectClipRgn(&R);
    OnDraw(&Meta);
    HENHMETAFILE hMeta=Meta.CloseEnhanced();

    OpenClipboard();
    EmptyClipboard();
    SetClipboardData(CF_ENHMETAFILE,hMeta);
    CloseClipboard();
    
}

void CFemmeView::OnEditCopy() 
{
    // puts a bitmap of the screen on the clipboard
    RECT r;
    CDC tempDC;
    CBitmap bitmap;
    CDC *pDC=GetDC();

    GetClientRect(&r);
    tempDC.CreateCompatibleDC(pDC);
    bitmap.CreateCompatibleBitmap(pDC, r.right, r.bottom);
    tempDC.SelectObject(&bitmap);

    tempDC.BitBlt(0, 0, r.right, r.bottom, pDC, 0, 0, SRCCOPY);

    OpenClipboard();
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, HBITMAP(bitmap));
    CloseClipboard();
}

void CFemmeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	// VK_TAB, VK_DELETE -- ones that we want to catch
	CFemmeDoc *pDoc=GetDocument();

	if (nChar==VK_LEFT)  OnPanLeft();
	if (nChar==VK_RIGHT) OnPanRight();
	if (nChar==VK_UP)    OnPanUp();   
	if (nChar==VK_DOWN)  OnPanDown();
	if (nChar==VK_PRIOR) OnZoomIn();	// page up
	if (nChar==VK_NEXT)  OnZoomOut();	// page down
	if (nChar==VK_HOME)  OnZoomNatural();

⌨️ 快捷键说明

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