VC下用MapX实现任何比例尺打印功能源码

VC下用MapX实现任何比例尺打印功能源码

视图调整部分

if(m_Map==NULL) return;
try{
m_Map->SetCurrentTool(miSelectTool);
CString strMap,strPaper,strLayer;
m_txtMap.GetWindowText(strMap); //地图比例
m_txtPaper.GetWindowText(strPaper); //纸张比例
CMapXCoordSys oldcs=m_Map->GetNumericCoordSys().Clone(); //save old sys
switch (m_SelectType)
{
case 0://视图窗口
m_Map->P_MapX1=m_Map->GetBounds().GetXMin();
m_Map->P_MapY1=m_Map->GetBounds().GetYMin();
m_Map->P_MapX2=m_Map->GetBounds().GetXMax();
m_Map->P_MapY2=m_Map->GetBounds().GetYMax();
break;
case 1://纸张大小
m_Map->P_MapX1=m_Map->GetBounds().GetXMin();
m_Map->P_MapY1=m_Map->GetBounds().GetYMin();
m_Map->P_MapX2=m_Map->GetBounds().GetXMax();
m_Map->P_MapY2=m_Map->GetBounds().GetYMax();
break;
case 2://自定义
break;
case 3://图幅号
//+20或-20是将选择范围扩大,因为还有图框边
m_Map->P_MapX1=m_Map->T_X1-20;
m_Map->P_MapY1=m_Map->T_Y1-40;
m_Map->P_MapX2=m_Map->T_X2+20;
m_Map->P_MapY2=m_Map->T_Y2+40;
//改变坐标画图框
CString strScale=strPaper+" : "+strMap;
m_Map->GetLayers().CreateLayer("newTK",NULL,1); //建立临时图层newTK
m_Map->SetNumericCoordSys((LPDISPATCH)m_Map->CoordBJ(3,123.5));//修改投影
m_Map->SetDisplayCoordSys((LPDISPATCH)m_Map->CoordBJ(3,123.5));
strLayer=m_Map->MapTempSet();//移除装饰图层,保存状态信息
m_Map->MapDrawTK(strScale);
break;
}
double MapBL,MapWidth,MapHeight,PaperWidth,PaperHeight;
//保留当前MapX的位置参数,便于打印后恢复
m_Map->P_MapZoom=m_Map->GetZoom();
m_Map->P_MapCenterX=m_Map->GetCenterX();
m_Map->P_MapCenterY=m_Map->GetCenterY();
//求出各种打印参数
CMapXLayer lyr=m_Map->GetLayers().Item("装饰图层");
double MapZoomMax=lyr.GetZoomMax();
double MapZoomMin=lyr.GetZoomMin();
//求出设置的比例系数
MapWidth=m_Map->Distance(m_Map->P_MapX1,m_Map->P_MapY1,m_Map->P_MapX2,m_Map->P_MapY1);//求出选择区域的宽度
MapHeight=m_Map->Distance(m_Map->P_MapX1,m_Map->P_MapY1,m_Map->P_MapX1,m_Map->P_MapY2);//求出选择区域的高度
MapBL=atof(strMap)/atof(strPaper)*atof(convert_G[m_Map->GetMapUnit()]); //求出设置的比例系数
PaperWidth=MapWidth/MapBL*atof(convert_Y[m_Map->GetPaperUnit()])*56.7; //求出纸张宽度
PaperHeight=MapHeight/MapBL*atof(convert_Y[m_Map->GetPaperUnit()])*56.7; //求出纸张高度
//改变当前MapX的视野、位置等参数,以便打印
// if((PaperWidth/1440.0*25.4)<2500 && (PaperHeight/1440.0*25.4)<2500) {
lyr.SetZoomMax((MapZoomMax*MapWidth)/(m_Map->GetMapPaperWidth()*MapBL));
lyr.SetZoomMin((MapZoomMin*MapWidth)/(m_Map->GetMapPaperWidth()*MapBL));
//移动当前的MapX 在VC中使用的单位为象素,在VB中用缇,之间换算为1象素=12缇
m_Map->MoveWindow(20000,20000,(int)(PaperWidth/12.0),(int)(PaperHeight/12.0),FALSE);
//对视图进行缩放
if(m_Map->P_MapX1!=0) m_Map->ZoomTo(MapWidth,(m_Map->P_MapX1+m_Map->P_MapX2)/2.0,(m_Map->P_MapY1+m_Map->P_MapY2)/2.0);
/* }else{
AfxMessageBox("选择打印区域超越打印限制!");
if(m_SelectType==3){
m_Map->GetLayers().Remove(1);//移除"newTK"图框层
m_Map->SetNumericCoordSys((LPDISPATCH)oldcs);//恢复坐标
m_Map->SetDisplayCoordSys((LPDISPATCH)oldcs);//恢复坐标
}
return;
}
*/ //调用打印视图窗体
CDlgPrintView DlgPrintView;
DlgPrintView.m_Map=m_Map;
DlgPrintView.m_Print=m_Print;
DlgPrintView.DoModal();
m_Map->SetAutoRedraw(FALSE);
RefreshLabel();//更新打印机和页面设置显示信息
if(m_SelectType==3){
m_Map->GetLayers().Remove(2);//移除装饰图层
m_Map->GetLayers().Remove(1);//移除"newTK"图框层
m_Map->MapTempGet(strLayer);//恢复装饰图层
m_Map->SetNumericCoordSys((LPDISPATCH)oldcs);//恢复坐标
m_Map->SetDisplayCoordSys((LPDISPATCH)oldcs);//恢复坐标
}
} catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
} catch (COleException *e) {
e->ReportError();
e->Delete();
}