📄 lsview.cpp
字号:
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 + -