📄 mainfrm.cpp
字号:
UINT maxlong=width;
if(maxlong>height)
maxlong=height;
CBoxLeng boxleng(this,maxlong);
if(boxleng.DoModal()!=IDOK)
return;
int boxnum=boxleng.m_Lengs.GetSize();
if (boxnum<=0)
return;
UINT leng;
CString AllResult="\r\n\t\t***** 景观空隙度指数 *****\r\n\r\n边长";
CString StandResult="\r\n\t\t***** 景观标准空隙度指数 *****\r\n\r\n边长";
for(BYTE tttt=0;tttt<typenum;tttt++)
{
CString name;
name.Format("\t%s",pDoc->m_BlockTypes[tttt].Name);
AllResult+=name;
StandResult+=name;
}
AllResult+="\r\n";
StandResult+="\r\n";
double * resultarray=pDoc->CalcSpace(boxnum,boxleng.m_Lengs);
double * stand_resultarray=(double *)malloc(sizeof(double)*boxnum*typenum);
for(int iii=0;iii<boxnum;iii++)
{
for(int type=0;type<typenum;type++)
{
stand_resultarray[iii*typenum+type]=
log(resultarray[iii*typenum+type])/log(pDoc->m_BaseSpace[type]);
}
}
for(int i=0;i<boxnum;i++)
{
leng=boxleng.m_Lengs[i];
CString tmpstr;
tmpstr.Format("\r\n%ld",leng);
AllResult+=tmpstr;
StandResult+=tmpstr;
for(BYTE tt=0;tt<typenum;tt++)
{
tmpstr.Format("\t%.4f",resultarray[i*typenum+tt]);
AllResult+=tmpstr;
tmpstr.Format("\t%.4f",stand_resultarray[i*typenum+tt]);
StandResult+=tmpstr;
}
}
AfxMessageBox("注意, 将先后显示两个结果对话框, 第一个为空隙度指数,\r\n 第二个为标准空隙度指数!",MB_OK,NULL);
if(boxnum<3)
{
CResultDlg resultdlgall(this,AllResult);
resultdlgall.DoModal();
CResultDlg standresultdlg(this,StandResult);
standresultdlg.DoModal();
return;
}
long * picarray=(long *)malloc(sizeof(long)*boxnum*(typenum+1));
ZeroMemory(picarray,sizeof(long)*boxnum*(typenum+1));
long * standpicarray=(long *)malloc(sizeof(long)*boxnum*(typenum+1));
ZeroMemory(standpicarray,sizeof(long)*boxnum*(typenum+1));
UINT xzoom=400/log(leng);
for(int bb=0;bb<boxnum;bb++)
{
leng=boxleng.m_Lengs[bb];
standpicarray[bb]=picarray[bb]=xzoom*log(leng);
}
for(int kk=0;kk<boxnum*typenum;kk++)
{
picarray[boxnum+kk]=log(resultarray[kk])*10000;
standpicarray[boxnum+kk]=stand_resultarray[kk]*10000;
}
CResultDlg resultdlgall(this,AllResult,FALSE,0,typenum,picarray,boxnum,TRUE,xzoom,FALSE);
resultdlgall.DoModal();
CResultDlg standresultdlg(this,StandResult,FALSE,0,typenum,standpicarray,boxnum,TRUE,xzoom,TRUE);
standresultdlg.DoModal();
}
void CMainFrame::OnSample()
{
CLSDoc * pDoc=GetDocument();
if(!pDoc->m_bCanExecute)
{
AfxMessageBox("该图像不能用于景观分析!",MB_OK,0);
return;
}
CSampleDlg sampledlg(this,pDoc->m_nWidth,pDoc->m_nHeight);
sampledlg.DoModal();
if(sampledlg.m_bMouseget)
{
pDoc->m_bSampleMouse=TRUE;
return;
}
char pzFileName[256];
int x1=sampledlg.m_nX1;
int x2=sampledlg.m_nX2;
int y1=sampledlg.m_nY1;
int y2=sampledlg.m_nY2;
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);
}
}
void CMainFrame::OnShowline()
{
CLSDoc *pDoc=GetDocument();
pDoc->m_bShowLine=!(pDoc->m_bShowLine);
CMenu * Menu=GetMenu();
Menu->CheckMenuItem(IDC_SHOWLINE,
(pDoc->m_bShowLine)?(MF_BYCOMMAND|MF_CHECKED):(MF_BYCOMMAND|MF_UNCHECKED));
if(pDoc->m_bShowLine)
{
pDoc->m_bShowBox=FALSE;
pDoc->m_bShowPoint=FALSE;
Menu->CheckMenuItem(IDC_SHOWBOX,MF_BYCOMMAND|MF_UNCHECKED);
Menu->CheckMenuItem(IDM_SHOWPOINT,MF_BYCOMMAND|MF_UNCHECKED);
}
pDoc->UpdateAllViews(NULL,PICVIEW,NULL);
}
void CMainFrame::OnInitMenu(CMenu* pMenu)
{
CMDIFrameWnd::OnInitMenu(pMenu);
// CG: This block added by 'Tip of the Day' component.
{
// TODO: This code adds the "Tip of the Day" menu item
// on the fly. It may be removed after adding the menu
// item to all applicable menu items using the resource
// editor.
// Add Tip of the Day menu item on the fly!
static CMenu* pSubMenu = NULL;
CString strHelp; strHelp.LoadString(CG_IDS_TIPOFTHEDAYHELP);
CString strMenu;
int nMenuCount = pMenu->GetMenuItemCount();
BOOL bFound = FALSE;
for (int i=0; i < nMenuCount; i++)
{
pMenu->GetMenuString(i, strMenu, MF_BYPOSITION);
if (strMenu == strHelp)
{
pSubMenu = pMenu->GetSubMenu(i);
bFound = TRUE;
ASSERT(pSubMenu != NULL);
}
}
CString strTipMenu;
strTipMenu.LoadString(CG_IDS_TIPOFTHEDAYMENU);
if (!bFound)
{
// Help menu is not available. Please add it!
if (pSubMenu == NULL)
{
// The same pop-up menu is shared between mainfrm and frame
// with the doc.
static CMenu popUpMenu;
pSubMenu = &popUpMenu;
pSubMenu->CreatePopupMenu();
pSubMenu->InsertMenu(0, MF_STRING|MF_BYPOSITION,
CG_IDS_TIPOFTHEDAY, strTipMenu);
}
pMenu->AppendMenu(MF_STRING|MF_BYPOSITION|MF_ENABLED|MF_POPUP,
(UINT)pSubMenu->m_hMenu, strHelp);
DrawMenuBar();
}
else
{
// Check to see if the Tip of the Day menu has already been added.
pSubMenu->GetMenuString(0, strMenu, MF_BYPOSITION);
if (strMenu != strTipMenu)
{
// Tip of the Day submenu has not been added to the
// first position, so add it.
pSubMenu->InsertMenu(0, MF_BYPOSITION); // Separator
pSubMenu->InsertMenu(0, MF_STRING|MF_BYPOSITION,
CG_IDS_TIPOFTHEDAY, strTipMenu);
}
}
}
}
void CMainFrame::OnSpaceAverarea()
{
CLSDoc * pDoc=GetDocument();
if(!pDoc->m_bEverAllSpace)
{
if(!OnBoxdefine())
return;
}
CString ResultString;
CString tmpstring;
ResultString="\r\nBox序号\t\t平均斑块面积\r\n";
UINT boxnum=pDoc->m_nAllBoxNum;
for(UINT index=0;index<boxnum;index++)
{
tmpstring.Format("\r\n%ld\t\t%.2f",index+1,
pDoc->m_AllVarySpace[index].AverArea);
ResultString+=tmpstring;
}
CResultDlg resultdlg(NULL,ResultString);
resultdlg.DoModal();
if(pDoc->m_nShow!=SHOWALLSPACE)
{
pDoc->m_nShow=SHOWALLSPACE;
pDoc->UpdateAllViews(NULL,TXTVIEW,NULL);
}
SwitchToView(theApp.m_pTextTemplate,RUNTIME_CLASS(CTXTView));
}
BOOL CMainFrame::OnBoxdefine()
{
CLSDoc * pDoc=GetDocument();
BOOL bChange=FALSE;
BOOL bOnlyPowerChange=FALSE;
if(!pDoc->m_bDone)
{
if(!OnAnalyzeName())
return FALSE;
}
CSpachMethodDlg methoddlg(NULL,pDoc->m_nWidth,pDoc->m_nHeight,
pDoc->m_nXBox,pDoc->m_nYBox,pDoc->m_nHorizDist,pDoc->m_nVertiDist,
pDoc->m_nRanBoxNum,pDoc->m_nRanBoxWidth,pDoc->m_nRanBoxHeight,pDoc->m_dPower);
if(methoddlg.DoModal()!=IDOK)
{
return FALSE;
}
if((methoddlg.m_bRandom!=pDoc->m_bRandom)||pDoc->m_bPointFromFile)
{
pDoc->m_bPointFromFile=FALSE;
bChange=TRUE;
pDoc->m_bRandom=methoddlg.m_bRandom;
if(methoddlg.m_bRandom)
{
pDoc->m_nRanBoxNum=methoddlg.m_nRanBoxNum;
pDoc->m_nAllBoxNum=methoddlg.m_nRanBoxNum;
pDoc->m_nRanBoxWidth=methoddlg.m_nRanBoxWidth;
pDoc->m_nRanBoxHeight=methoddlg.m_nRanBoxHeight;
pDoc->m_nBoxlong=methoddlg.m_nRanBoxHeight;
}
else
{
pDoc->m_nXBox=methoddlg.m_nXNum;
pDoc->m_nYBox=methoddlg.m_nYNum;
pDoc->m_nAllBoxNum=methoddlg.m_nXNum*methoddlg.m_nYNum;
pDoc->m_nHorizDist=methoddlg.m_nHoriz;
pDoc->m_nVertiDist=methoddlg.m_nVerti;
pDoc->m_nBoxlong=pDoc->m_nHeight/methoddlg.m_nYNum;
}
}
else
{
if(methoddlg.m_bRandom==TRUE)
{
bChange=TRUE;
pDoc->m_nRanBoxNum=methoddlg.m_nRanBoxNum;
pDoc->m_nAllBoxNum=methoddlg.m_nRanBoxNum;
pDoc->m_nRanBoxWidth=methoddlg.m_nRanBoxWidth;
pDoc->m_nRanBoxHeight=methoddlg.m_nRanBoxHeight;
pDoc->m_nBoxlong=methoddlg.m_nRanBoxHeight;
}
else if((methoddlg.m_bRandom==FALSE)&&
((methoddlg.m_nXNum!=pDoc->m_nXBox)||
(methoddlg.m_nYNum!=pDoc->m_nYBox)||
(methoddlg.m_nHoriz!=pDoc->m_nHorizDist)||
(methoddlg.m_nVerti!=pDoc->m_nVertiDist)) )
{
bChange=TRUE;
pDoc->m_nXBox=methoddlg.m_nXNum;
pDoc->m_nYBox=methoddlg.m_nYNum;
pDoc->m_nAllBoxNum=methoddlg.m_nXNum*methoddlg.m_nYNum;
pDoc->m_nHorizDist=methoddlg.m_nHoriz;
pDoc->m_nVertiDist=methoddlg.m_nVerti;
pDoc->m_nBoxlong=pDoc->m_nHeight/methoddlg.m_nYNum;
}
else
{
bChange=FALSE;
}
}
if((methoddlg.m_dPower!=pDoc->m_dPower)&&(!bChange))
{
bOnlyPowerChange=TRUE;
pDoc->m_dPower=methoddlg.m_dPower;
}
if(bChange)
{
if(!pDoc->m_bEverDefine)
{
OnCoefDefine();
}
pDoc->m_dPower=methoddlg.m_dPower;
pDoc->AllVarySpace();
pDoc->CalcAllZValue();
pDoc->m_bEverAllSpace=TRUE;
// pDoc->m_bEverAutoCorre=TRUE;
pDoc->UpdateAllViews(NULL,NULL,NULL);
return TRUE;
}
if(bOnlyPowerChange)
{
pDoc->CalcAllZValue();
// pDoc->m_bEverAutoCorre=TRUE;
pDoc->UpdateAllViews(NULL,TXTVIEW,NULL);
}
return TRUE;
}
void CMainFrame::OnSpaceBlance()
{
CLSDoc * pDoc=GetDocument();
if(!pDoc->m_bEverAllSpace)
{
if(!OnBoxdefine())
return;
}
CString ResultString;
CString tmpstring;
ResultString="\r\nBox序号\t\t均匀度指数\r\n";
UINT boxnum=pDoc->m_nAllBoxNum;
for(UINT index=0;index<boxnum;index++)
{
tmpstring.Format("\r\n%ld\t\t%.2f",index+1,
pDoc->m_AllVarySpace[index].Blance);
ResultString+=tmpstring;
}
CResultDlg resultdlg(NULL,ResultString);
resultdlg.DoModal();
if(pDoc->m_nShow!=SHOWALLSPACE)
{
pDoc->m_nShow=SHOWALLSPACE;
pDoc->UpdateAllViews(NULL,TXTVIEW,NULL);
}
SwitchToView(theApp.m_pTextTemplate,RUNTIME_CLASS(CTXTView));
}
void CMainFrame::OnSpaceBlocknum()
{
CLSDoc * pDoc=GetDocument();
if(!pDoc->m_bEverAllSpace)
{
if(!OnBoxdefine())
return;
}
CString ResultString;
CString tmpstring;
ResultString="\r\nBox序号\t\t斑块数量\r\n";
UINT boxnum=pDoc->m_nAllBoxNum;
for(UINT index=0;index<boxnum;index++)
{
tmpstring.Format("\r\n%ld\t\t%ld",index+1,
(ULONG)pDoc->m_AllVarySpace[index].BlockNum);
ResultString+=tmpstring;
}
CResultDlg resultdlg(NULL,ResultString);
resultdlg.DoModal();
if(pDoc->m_nShow!=SHOWALLSPACE)
{
pDoc->m_nShow=SHOWALLSPACE;
pDoc->UpdateAllViews(NULL,TXTVIEW,NULL);
}
SwitchToView(theApp.m_pTextTemplate,RUNTIME_CLASS(CTXTView));
}
void CMainFrame::OnSpaceChip()
{
CLSDoc * pDoc=GetDocument();
if(!pDoc->m_bEverAllSpace)
{
if(!OnBoxdefine())
return;
}
CString ResultString;
CString tmpstring;
ResultString="\r\nBox序号\t\t碎裂化指数\r\n";
UINT boxnum=pDoc->m_nAllBoxNum;
for(UINT index=0;index<boxnum;index++)
{
tmpstring.Format("\r\n%ld\t\t%.2f",index+1,
pDoc->m_AllVarySpace[index].Chip);
ResultString+=tmpstring;
}
CResultDlg resultdlg(NULL,ResultString);
resultdlg.DoModal();
if(pDoc->m_nShow!=SHOWALLSPACE)
{
pDoc->m_nShow=SHOWALLSPACE;
pDoc->UpdateAllViews(NULL,TXTVIEW,NULL);
}
SwitchToView(theApp.m_pTextTemplate,RUNTIME_CLASS(CTXTView));
}
void CMainFrame::OnSpaceCity()
{
CLSDoc * pDoc=GetDocument();
if(!pDoc->m_bEverAllSpace)
{
if(!OnBoxdefine())
return;
}
CString ResultString;
CString tmpstring;
ResultString="\r\nBox序号\t\t城市化指数\r\n";
UINT boxnum=pDoc->m_nAllBoxNum;
for(UINT index=0;index<boxnum;index++)
{
tmpstring.Format("\r\n%ld\t\t%.2f",index+1,
pDoc->m_AllVarySpace[index].City);
ResultString+=tmpstring;
}
CResultDlg resultdlg(NULL,ResultString);
resultdlg.DoModal();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -