📄 mainfrm.cpp
字号:
void CMainFrame::OnQueryClear()
{
theApp.GetMapPane()->m_rsQuery.ReleaseDispatch();
theApp.GetMapPane()->m_sQuery="";
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::MsgOutBar(CString sMsg, int nPane)
{
m_wndStatusBar.SetPaneText(nPane, sMsg);
m_wndStatusBar.UpdateWindow();
}
void CMainFrame::OnQueryDistance()
{
m_uID=ID_QUERY_DISTANCE;
}
void CMainFrame::OnUpdateQueryDistance(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_QUERY_DISTANCE);
}
void CMainFrame::OnQueryArea()
{
m_uID=ID_QUERY_AREA;
}
void CMainFrame::OnUpdateQueryArea(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_QUERY_AREA);
}
void CMainFrame::OnRenderDefault()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
layer.SetRenderer(0);
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnRenderLabel()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
CRenderTipDlg rtd;
Eng_GetLayerField(theApp.GetMapPane()->m_map,nLayer,rtd.m_taLayerField);
CMoRectangle r=theApp.GetMapPane()->m_map.GetExtent();
rtd.m_dSize=r.GetWidth()/theApp.m_tMapSetup.dFontSize;
if(rtd.DoModal()!=IDOK)
return;
//标注名称,用于poly,point,标注内容可能会互相覆盖
CMoFont font;
font.SetName(rtd.m_sName);
CMoLabelRenderer lr;
lr.CreateDispatch(TEXT("MapObjects2.LabelRenderer"));
CMoTextSymbol sym(lr.GetSymbol(0));
sym.SetFont(font);
sym.SetHeight(rtd.m_dSize);
sym.SetColor(rtd.m_oColor.GetColor());
lr.SetField(TEXT(rtd.m_sField));
lr.SetAllowDuplicates(FALSE);
layer.SetRenderer(lr);
lr.ReleaseDispatch();
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnRenderPlacer()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
//layer.SetRenderer(0);
CRenderTipDlg rtd;
Eng_GetLayerField(theApp.GetMapPane()->m_map,nLayer,rtd.m_taLayerField);
CMoRectangle r=theApp.GetMapPane()->m_map.GetExtent();
rtd.m_dSize=r.GetWidth()/theApp.m_tMapSetup.dFontSize;
if(rtd.DoModal()!=IDOK)
return;
{
//自动标注,用于poly,line,point,不覆盖字符,需要指定标识字段
CMoFont fnt;
fnt.SetName(rtd.m_sName);
fnt.SetWeight(FW_BOLD);
CMoLabelPlacer lp;
lp.CreateDispatch("MapObjects2.LabelPlacer");
lp.SetField(TEXT(rtd.m_sField));
lp.SetDrawBackground(true);
lp.SetAllowDuplicates(false);
lp.SetMaskColor(theApp.GetMapPane()->m_map.GetBackColor());
lp.SetPlaceAbove(false);
lp.SetPlaceBelow(false);
lp.SetPlaceOn(true);
CMoTextSymbol textSym(lp.GetDefaultSymbol());
textSym.SetFont(fnt);
textSym.SetHeight(rtd.m_dSize);
textSym.SetColor(rtd.m_oColor.GetColor());
layer.SetRenderer(lp);
lp.ReleaseDispatch();
}
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnRenderDot()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
CRenderDotDlg rdd;
Eng_GetLayerField(theApp.GetMapPane()->m_map,nLayer,rdd.m_taLayerField);
if(rdd.DoModal()!=IDOK)
return;
{
//点,用于poly,用到了统计功能,可以显示疏密程度
CMoDotDensityRenderer ddr;
VERIFY(ddr.CreateDispatch(TEXT("MapObjects2.DotDensityRenderer")));
LPCTSTR fieldName = TEXT(rdd.m_sField);
ddr.SetField(fieldName);
CMoRecordset recs(layer.GetRecords());
CMoStatistics stats(recs.CalculateStatistics(fieldName));
double range = stats.GetMax() - stats.GetMin();
ddr.SetDotValue((stats.GetMin() + range/2.0) / 40.0);
ddr.SetDotColor(rdd.m_oColor.GetColor());
ddr.SetDotSize(rdd.m_iSize);
layer.SetRenderer(ddr);
ddr.ReleaseDispatch();
}
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnRenderValue()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
CRenderValueDlg rvd;
Eng_GetLayerField(theApp.GetMapPane()->m_map,nLayer,rvd.m_taLayerField);
if(rvd.DoModal()!=IDOK)
return;
{
//用数据的序列,可以是字符数据,用于poly,显示不同的颜色
CMoStrings strings;
VERIFY(strings.CreateDispatch(TEXT("MapObjects2.Strings")));
CMoRecordset recs(layer.GetRecords());
CMoFields fields(recs.GetFields());
while (!recs.GetEof())
{
CMoField field(fields.Item(COleVariant(rvd.m_sField)));
strings.Add(field.GetValueAsString());
recs.MoveNext();
}
CMoValueMapRenderer vmr;
VERIFY(vmr.CreateDispatch(TEXT("MapObjects2.ValueMapRenderer")));
vmr.SetField(TEXT(rvd.m_sField));
vmr.SetValueCount(strings.GetCount());
for (short i = 0; i < strings.GetCount(); i++)
vmr.SetValue(i, strings.Item(COleVariant(i)));
layer.SetRenderer(vmr);
vmr.ReleaseDispatch();
}
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnRenderBar()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
CRenderChartDlg rcd;
Eng_GetLayerField(theApp.GetMapPane()->m_map,nLayer,rcd.m_taLayerField);
if(rcd.DoModal()!=IDOK)
return;
{
//显示数值状态,可以有多个同时处理
CMoRecordset rs(layer.GetRecords());
CMoChartRenderer cb;
cb.CreateDispatch(TEXT("MapObjects2.ChartRenderer"));
cb.SetChartType(moBar);
LPCTSTR fieldName = TEXT(rcd.m_sField);
cb.SetFieldCount(1);
cb.SetField(0,fieldName); //只处理一个
cb.SetBarHeight(rcd.m_iHeight);
cb.SetBarWidth(rcd.m_iWidth);
cb.SetColor(0,rcd.m_oColor.GetColor());
layer.SetRenderer(cb);
cb.ReleaseDispatch();
}
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnRenderPie()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
CRenderPieDlg rpd;
Eng_GetLayerField(theApp.GetMapPane()->m_map,nLayer,rpd.m_taLayerField);
if(rpd.DoModal()!=IDOK)
return;
short i,count=rpd.m_taPie.GetSize();
{
//显示数值状态,可以有多个同时处理
CMoRecordset rs(layer.GetRecords());
CMoChartRenderer cb;
cb.CreateDispatch(TEXT("MapObjects2.ChartRenderer"));
cb.SetChartType(moPie);
LPCTSTR fieldName = TEXT(rpd.m_sField);
cb.SetFieldCount(count);
for(i=0;i<count;i++)
{
cb.SetField(i,rpd.m_taPie[i].field);
cb.SetColor(i,rpd.m_taPie[i].color);
}
// cb.SetNormalizationField("AREA");
cb.SetSizeField(rpd.m_sSizeField);
cb.SetMinPieSize(rpd.m_iMin);
cb.SetMaxPieSize(rpd.m_iMax);
layer.SetRenderer(cb);
cb.ReleaseDispatch();
}
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnRenderBreak()
{
short nLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
if(nLayer<0)
{
AfxMessageBox("必须先选择一个图层!");
return;
}
CMoMapLayer layer(theApp.GetMapPane()->m_map.GetLayers().Item(COleVariant(nLayer)));
CRenderBreakDlg rbd;
Eng_GetLayerField(theApp.GetMapPane()->m_map,nLayer,rbd.m_taLayerField);
if(rbd.DoModal()!=IDOK)
return;
{
//数据的分段,用于poly,显示不同颜色
CMoClassBreaksRenderer cbr;
VERIFY(cbr.CreateDispatch(TEXT("MapObjects2.ClassBreaksRenderer")));
CMoRecordset recs(layer.GetRecords());
LPCTSTR fieldName = TEXT(rbd.m_sField);
cbr.SetField(fieldName);
CMoStatistics stats(recs.CalculateStatistics(fieldName));
//使用平均分隔
int numClasses = rbd.m_iBreaks;
cbr.SetBreakCount(numClasses);
double val;
double min=stats.GetMin();
double max=stats.GetMax();
double range=max-min;
double step=range/(double)numClasses;
for (int i = 0; i < numClasses; i++)
{
val=min+step*i;
cbr.SetBreak(i, val);
}
cbr.RampColors(rbd.m_oColor0.GetColor(),rbd.m_oColor1.GetColor());
layer.SetRenderer(cbr);
cbr.ReleaseDispatch();
}
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnShapeCircle()
{
m_uID=ID_SHAPE_CIRCLE;
}
void CMainFrame::OnUpdateShapeCircle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_SHAPE_CIRCLE);
}
void CMainFrame::OnShapeEllipse()
{
m_uID=ID_SHAPE_ELLIPSE;
}
void CMainFrame::OnUpdateShapeEllipse(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_SHAPE_ELLIPSE);
}
void CMainFrame::OnShapeLine()
{
m_uID=ID_SHAPE_LINE;
}
void CMainFrame::OnUpdateShapeLine(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_SHAPE_LINE);
}
void CMainFrame::OnShapePoint()
{
m_uID=ID_SHAPE_POINT;
}
void CMainFrame::OnUpdateShapePoint(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_SHAPE_POINT);
}
void CMainFrame::OnShapePoly()
{
m_uID=ID_SHAPE_POLY;
}
void CMainFrame::OnUpdateShapePoly(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_SHAPE_POLY);
}
void CMainFrame::OnShapeRect()
{
m_uID=ID_SHAPE_RECT;
}
void CMainFrame::OnUpdateShapeRect(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_uID==ID_SHAPE_RECT);
}
void CMainFrame::OnShapeSetup()
{
if(theApp.GetMapPane()->m_oShape.Setup())
theApp.GetMapPane()->m_map.Refresh();
}
void CMainFrame::OnShapeExportShp()
{
// Get file name
CFileDialog fd(TRUE,"shp",NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,
"SHP文件(*.shp)|*.shp||",this);
if(fd.DoModal()!=IDOK)
return;
CString sPathFile=fd.GetPathName();
BOOL bSaved=FALSE;
switch (m_uID)
{
case ID_SHAPE_POINT:
bSaved=theApp.GetMapPane()->m_oShape.mo_ExportPoints(sPathFile);
break;
case ID_SHAPE_LINE:
bSaved=theApp.GetMapPane()->m_oShape.mo_ExportLines(sPathFile);
break;
case ID_SHAPE_RECT:
bSaved=theApp.GetMapPane()->m_oShape.mo_ExportRects(sPathFile);
break;
case ID_SHAPE_CIRCLE:
bSaved=theApp.GetMapPane()->m_oShape.mo_ExportCircles(sPathFile);
break;
case ID_SHAPE_ELLIPSE:
bSaved=theApp.GetMapPane()->m_oShape.mo_ExportEllipses(sPathFile);
break;
case ID_SHAPE_POLY:
bSaved=theApp.GetMapPane()->m_oShape.mo_ExportPolys(sPathFile);
break;
case ID_SHAPE_TEXT:
bSaved=theApp.GetMapPane()->m_oShape.mo_ExportTexts(sPathFile);
break;
}
if(bSaved)
{
int nRes=AfxMessageBox("是否将保存的shp文件添加到当前工程",MB_YESNO);
if(nRes==IDYES)
{
Eng_AddLayerMap(theApp.GetMapPane()->m_map,sPathFile,RGB(128,128,0));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -