任务:集成导入地图和打印布局视图
由于之前没有问清楚 导入栅格还是SHP 就只做了导入SHP的 后来说要两个都可以导入 于是想到了工具栏中的十字型导入数据的工具,打开后是这样的:
就想着能不能自己实现一个所有数据类型都能使用的,查了百度找到一个思路贴:
https://blog.youkuaiyun.com/Mello_/article/details/41820885 上面的第三方控件ExplorerControls 没用过 但是思路可以借鉴
但觉得太麻烦 于是改变思路用选择语句判断文件扩展名 来导入 很顺利完成
然后是今天的标题 纸张大小的问题
之前就一直有这个毛病 PS: 我用的是牟乃夏老师书里的打印输出的部分代码
多次改变纸张大小以后 预览窗口就不变化了 一直保持一个样式的纸张 前几次还可以根据选择的大小变化 后面就默认纸张大小永远不变了 十分奇怪 不知道如何解决
我又想到地图框能否根据纸张的大小变化大小,再探索一下吧。
————————————分割线————————————
20:48
思路:(1)使得数据框和纸张大小一致 可以使用page.QuerySize(out width, out height);//纸张大小,比如A4就是210,297
(2)使得数据框中的地图边界固定(即无论纸有多大 地图跟着放大) pMapFrame.MapBounds = env;
以下是代码:
借鉴了https://blog.youkuaiyun.com/hellolib/article/details/22278857 感谢
private void btnPageSize_Click(object sender, EventArgs e)
{
try
{
//实例化打印设置窗口
DialogResult result = pageSetupDialog1.ShowDialog();
//设置打印文档对象的打印机
document.PrinterSettings = pageSetupDialog1.PrinterSettings;
//设置打印文档对象的页面设置为用户在打印设置对话框中的设置
document.DefaultPageSettings = pageSetupDialog1.PageSettings;
//初始化纸张和打印机
IPaper paper = new PaperClass();
IPrinter printer = new EmfPrinterClass();
//关联打印机对象和纸张对象
paper.Attach(pageSetupDialog1.PrinterSettings.GetHdevmode(pageSetupDialog1.PageSettings).ToInt32(), pageSetupDialog1.PrinterSettings.GetHdevnames().ToInt32());
printer.Paper = paper;
PrintPagelayoutControl.Printer = printer;
//得到一系列参数给limitmapfreamrangeandposition
IGraphicsContainer pGraphicsContainer = PrintPagelayoutControl.GraphicsContainer;
IMapFrame pMapFrame = pGraphicsContainer.FindFrame(PrintPagelayoutControl.ActiveView.FocusMap) as IMapFrame;
IElement ele = pMapFrame as IElement;
IPage page = PrintPagelayoutControl.PageLayout.Page;
IEnvelope en1 = new EnvelopeClass();
ele.QueryBounds(PrintPagelayoutControl.ActiveView.ScreenDisplay, en1);
//限制范围
limitMapFreamRangeAndPosition(pGraphicsContainer, ele, page, en1, PrintPagelayoutControl);
//控制map在数据框中的范围
pMapFrame.ExtentType = esriExtentTypeEnum.esriExtentBounds;
IEnvelope env = new EnvelopeClass();
env.PutCoords(119939.3058, 27729.6982, 131821.6658, 41643.6886); //地理坐标系下的坐标,即范围
pMapFrame.MapBounds = env;
PrintPagelayoutControl.Refresh();
}
catch { }
}
public void limitMapFreamRangeAndPosition(IGraphicsContainer gc, IElement ele, IPage page, IEnvelope en1, AxPageLayoutControl PrintPageLayoutControl)
{
double width, height;
page.QuerySize(out width, out height);//纸张大小,比如A4就是210,297
IEnvelope en2 = new EnvelopeClass();
ele.QueryBounds(PrintPageLayoutControl.ActiveView.ScreenDisplay, en2);
//使对应于页面的大小
en2.XMax = width;
en2.XMin = 0;
en2.YMax = height;
en2.YMin = 0;
//调整Mapframe的范围和位置,使之始终保持在打印页面范围内
ele.Geometry = en2;
//更新
gc.UpdateElement(ele);
return;
}
对于问题不知道有无大神遇到过,烦请指点。