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

📄 lsview.cpp

📁 数据结构链表的演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	while(pointx<x2)
	{
		if(fabs(y2-y1)>=fabs(x2-x1))
		{
			dc.MoveTo(pointx-2+0.5,y1+k*(pointx-x1)+0.5);
			dc.LineTo(pointx+2+0.5,y1+k*(pointx-x1)+0.5);
		}
		else
		{
			dc.MoveTo(pointx+0.5,y1+k*(pointx-x1)-2+0.5);
			dc.LineTo(pointx+0.5,y1+k*(pointx-x1)+2+0.5);
		}

		pointx+=segx;
	}
	
	delete pPen;
	return;
}

void CLSView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CLSDoc * pDoc=GetDocument();
	if(!(pDoc->m_bMouseLine||pDoc->m_bSampleMouse||pDoc->m_bLineSpace))
	{
		m_ptPrev=point;
		return;
	}

	if (GetCapture() != this)
	{
		m_ptPrev=point;
		return; 
	}

	CClientDC dc(this);

	OnPrepareDC(&dc);

	dc.SetROP2(R2_NOT);

	if(pDoc->m_bMouseLine||pDoc->m_bLineSpace)
	{
		dc.MoveTo(m_ptFirst);
		dc.LineTo(m_ptPrev);

		dc.MoveTo(m_ptFirst);
		dc.LineTo(point);

		m_ptPrev = point;
		return;
	}

	if(pDoc->m_bSampleMouse)
	{
		RECT rect;
		POINT points[5];

		rect.left=m_ptFirst.x<m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.right=m_ptFirst.x>m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.top=m_ptFirst.y<m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;
		rect.bottom=m_ptFirst.y>m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;

		points[0].x=rect.left;
		points[0].y=rect.top;
		points[1].x=rect.right;
		points[1].y=rect.top;
		points[2].x=rect.right;
		points[2].y=rect.bottom;
		points[3].x=rect.left;
		points[3].y=rect.bottom;
		points[4]=points[0];

		dc.Polyline(points,5);

		m_ptPrev=point;

		rect.left=m_ptFirst.x<m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.right=m_ptFirst.x>m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.top=m_ptFirst.y<m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;
		rect.bottom=m_ptFirst.y>m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;

		points[0].x=rect.left;
		points[0].y=rect.top;
		points[1].x=rect.right;
		points[1].y=rect.top;
		points[2].x=rect.right;
		points[2].y=rect.bottom;
		points[3].x=rect.left;
		points[3].y=rect.bottom;
		points[4]=points[0];

		dc.Polyline(points,5);
		
		return;
	}
}

void CLSView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CLSDoc * pDoc=GetDocument();

	if(!(pDoc->m_bMouseLine||pDoc->m_bSampleMouse||pDoc->m_bLineSpace))
		return;

	SetCapture();       
	m_ptPrev = point;   
	m_ptFirst=point;

	return;
}

void CLSView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CLSDoc* pDoc = GetDocument();

	if(!(pDoc->m_bMouseLine||pDoc->m_bSampleMouse||pDoc->m_bLineSpace))
		return;

	if (GetCapture() != this)
		return; // If this window (view) didn't capture the mouse,
				// then the user isn't drawing in this window.

	CClientDC dc(this);

	OnPrepareDC(&dc);  // set up mapping mode and viewport origin

	dc.SetROP2(R2_NOT);

	if(pDoc->m_bSampleMouse)
	{
		RECT rect;
		POINT points[5];

		rect.left=m_ptFirst.x<m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.right=m_ptFirst.x>m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.top=m_ptFirst.y<m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;
		rect.bottom=m_ptFirst.y>m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;
		
		points[0].x=rect.left;
		points[0].y=rect.top;
		points[1].x=rect.right;
		points[1].y=rect.top;
		points[2].x=rect.right;
		points[2].y=rect.bottom;
		points[3].x=rect.left;
		points[3].y=rect.bottom;
		points[4]=points[0];

		dc.Polyline(points,5);

		m_ptPrev=point;

		rect.left=m_ptFirst.x<m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.right=m_ptFirst.x>m_ptPrev.x?m_ptFirst.x:m_ptPrev.x;
		rect.top=m_ptFirst.y<m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;
		rect.bottom=m_ptFirst.y>m_ptPrev.y?m_ptFirst.y:m_ptPrev.y;

		points[0].x=rect.left;
		points[0].y=rect.top;
		points[1].x=rect.right;
		points[1].y=rect.top;
		points[2].x=rect.right;
		points[2].y=rect.bottom;
		points[3].x=rect.left;
		points[3].y=rect.bottom;
		points[4]=points[0];

		dc.Polyline(points,5);
		
		ReleaseCapture();

		CString tempstring;
		int x1=rect.left/pDoc->m_Compress+0.5;
		int x2=rect.right/pDoc->m_Compress+0.5;
		int y1=rect.top/pDoc->m_Compress+0.5;
		int y2=rect.bottom/pDoc->m_Compress+0.5;

		tempstring.Format("\r\n\r\n采样矩形为:( %d, %d ) --- ( %d, %d )。",x1,y1,x2,y2);

		CInfoOKdlg infookdlg(NULL,tempstring);

		int rtn=infookdlg.DoModal();
		
		RedrawWindow();

		switch(rtn)
		{
		case IDOK:
			pDoc->m_bSampleMouse=FALSE;
			break;
		case IDCANCEL:
			pDoc->m_bSampleMouse=FALSE;
			return;
		case IDRETRY:
			pDoc->m_bSampleMouse=TRUE;
			return;
		}

		char pzFileName[256];

		strcpy(pzFileName,pDoc->m_strPathName);
		strcat(pzFileName,"(");

		char tmpstr[10];
		itoa(x1,tmpstr,10);
		strcat(pzFileName,tmpstr);
		strcat(pzFileName,"_");
		
		itoa(y1,tmpstr,10);
		strcat(pzFileName,tmpstr);
		strcat(pzFileName,"--");

		itoa(x2,tmpstr,10);
		strcat(pzFileName,tmpstr);
		strcat(pzFileName,"_");

		itoa(y2,tmpstr,10);
		strcat(pzFileName,tmpstr);

		strcat(pzFileName,").bmp");

		if(pDoc->Write(pzFileName,x1,y1,x2,y2))
		{
			CString msg;
			msg.Format("所采样区域图像已经另存为 %s,\r\n\r\n打开该文件即可进行计算!",pzFileName);
			AfxMessageBox(msg,MB_OK,NULL);
		}
		
		else
		{
			AfxMessageBox("文件保存错误,请确认是否有足够空间!",MB_OK,NULL);
		}

		return;
	}	

	if(pDoc->m_bMouseLine)
	{
		dc.MoveTo(m_ptFirst);
		dc.LineTo(m_ptPrev);

		dc.MoveTo(m_ptFirst);
		dc.LineTo(point);

		pDoc->m_InfoLines[0].x1=m_ptFirst.x/pDoc->m_Compress;
		pDoc->m_InfoLines[0].y1=m_ptFirst.y/pDoc->m_Compress;

		pDoc->m_InfoLines[0].x2=point.x/pDoc->m_Compress;
		pDoc->m_InfoLines[0].y2=point.y/pDoc->m_Compress;

		ReleaseCapture();
						
		RedrawWindow();

		CString tmpstr;

		UINT x1=pDoc->m_InfoLines[0].x1+0.5;
		UINT y1=pDoc->m_InfoLines[0].y1+0.5;
		UINT x2=pDoc->m_InfoLines[0].x2+0.5;
		UINT y2=pDoc->m_InfoLines[0].y2+0.5;

		double leng=(x2-x1)*(x2-1)+(y2-y1)*(y2-y1);
		
		tmpstr.Format("\n起点坐标为:  ( %d, %d ) ,\n终点坐标为:  ( %d, %d ) ,\n样线长为: %10.3f ,  最小样段长为: %d 。",
			x1,y1,x2,y2,sqrt(leng),pDoc->m_nInfoLeng);

		CInfoOKdlg infookdlg(NULL,tmpstr);
		switch(infookdlg.DoModal())
		{
		case IDOK:
			pDoc->m_bMouseLine=FALSE;
			break;
		case IDCANCEL:
			pDoc->m_bMouseLine=FALSE;
			return;
		case IDRETRY:
			pDoc->m_bMouseLine=TRUE;
			return;
		}


		CString strResult="\r\n\t\t====== 信息熵指数 ======\r\n\r\n样段数";

		for(UINT jj=0;jj<pDoc->m_BlockTypes.GetSize();jj++)
		{
			strResult+="\t";
			strResult+=pDoc->m_BlockTypes[jj].Name;
		}
		strResult+="\r\n";
		CArray<float,float> nResult;
		pDoc->CalcInfoIndex(pDoc->m_InfoLines[0],nResult);
		for(UINT kk=0;kk<nResult.GetSize();kk++)
		{
			if(kk%(pDoc->m_BlockTypes.GetSize()+1)==0)
				strResult+="\r\n";
			tmpstr.Format("%7.4f\t",nResult[kk]);
			strResult+=tmpstr;
		}
		strResult+="\r\n\r\n";

		CResultDlg resultdlg(this,strResult);
		resultdlg.DoModal();
		
		return;
	}

	if(pDoc->m_bLineSpace)
	{
		dc.MoveTo(m_ptFirst);
		dc.LineTo(m_ptPrev);

		dc.MoveTo(m_ptFirst);
		dc.LineTo(point);

		double x1=m_ptFirst.x/pDoc->m_Compress;
		double y1=m_ptFirst.y/pDoc->m_Compress;
		double x2=point.x/pDoc->m_Compress;
		double y2=point.y/pDoc->m_Compress;

		ReleaseCapture();
						
		RedrawWindow();

		CString tmpstr;
		
		tmpstr.Format("\n起点坐标为:  ( %d, %d ) ,\n终点坐标为:  ( %d, %d ) ",
			int(x1+0.5),int(y1+0.5),int(x2+0.5),int(y2+0.5));

		CInfoOKdlg infookdlg(NULL,tmpstr);
		switch(infookdlg.DoModal())
		{
		case IDOK:
			pDoc->m_bLineSpace=FALSE;
			break;
		case IDCANCEL:
			pDoc->m_bLineSpace=FALSE;
			return;
		case IDRETRY:
			pDoc->m_bLineSpace=TRUE;
			return;
		}

		pDoc->m_aBoxCoords.RemoveAll();
		coord tmpcoord;
		if(x1!=x2)
		{
			double k=(y2-y1)/(x2-x1);
			for(double xx=0;xx<=x2-x1;)
			{
				tmpcoord.x=x1+xx-pDoc->m_nBoxlong/2;
				tmpcoord.y=y1+xx*k-pDoc->m_nBoxlong/2;
				pDoc->m_aBoxCoords.Add(tmpcoord);
				if(fabs(k)<=1)
				{
					xx+=pDoc->m_nBoxlong+pDoc->m_nHorizDist;
				}
				else
				{
					xx+=pDoc->m_nBoxlong+pDoc->m_nHorizDist/fabs(k);
				}
			}
		}
		else
		{
			for(UINT yy=0;yy<y2-y1;yy+=pDoc->m_nBoxlong+pDoc->m_nHorizDist)
			{
				tmpcoord.x=x1-pDoc->m_nBoxlong/2;
				tmpcoord.y=y1+yy-pDoc->m_nBoxlong/2;
				pDoc->m_aBoxCoords.Add(tmpcoord);
			}
		}
		
		pDoc->m_nRanBoxNum=pDoc->m_aBoxCoords.GetSize();
		pDoc->m_nAllBoxNum=pDoc->m_nRanBoxNum;
		pDoc->AllVarySpace();
		pDoc->CalcAllZValue();
		pDoc->m_bEverAllSpace=TRUE;
		pDoc->UpdateAllViews(NULL,NULL,NULL);

		return;
	}
}

void CLSView::OnUpdateXY(CCmdUI * pCmdUI)
{
	CLSDoc * pDoc=GetDocument();
	CString str;
	BYTE value;
	int x=m_ptPrev.x/pDoc->m_Compress+0.5;
	int y=m_ptPrev.y/pDoc->m_Compress+0.5;
	if(!pDoc->m_bCanExecute)
		return;
	value=pDoc->m_Values[x+y*pDoc->m_nWidth];
	str.Format("X: %d , Y: %d ;  Value: %d",x,y,value);
	pCmdUI->Enable(TRUE);
	pCmdUI->SetText(str);
}

⌨️ 快捷键说明

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