ArcGIS Engine基础(23)之布局视图工具类(地图打印设置)

工具OnClick事件

   public override void OnClick()
        {
            AxPageLayoutControl pageLayoutControl =
                  AxPageLayoutControl.FromChildHandle((IntPtr)m_HookHelper.ActiveView.ScreenDisplay.hWnd) as AxPageLayoutControl;
            if (pageLayoutControl == null) return;
            IPageLayoutControlDefault m_pageLayoutControl = pageLayoutControl.Object as IPageLayoutControlDefault;
            if (m_pageLayoutControl == null) return;
            PrintToolHelperClass m_printHelper = new PrintToolHelperClass(m_pageLayoutControl);
            m_printHelper.PrintSetup();
        }

打印管理类 PrintToolHelperClass 

        public static System.Drawing.Printing.PrintDocument PrintDocument = new System.Drawing.Printing.PrintDocument();
        public static PrinterSettings m_PrinterSettings = null;
        public static PageSettings m_PageSettings = null;
        public IPageLayoutControlDefault m_pageLayoutControl = null;
        short m_CurrentPrintPage;
        private ITrackCancel m_TrackCancel = new CancelTrackerClass();
        private frmPrintSetup m_frmPrintSetup;
        private int m_Copies;

        System.Timers.Timer timer;
        string mydocumentFolder = string.Empty;
        string filePath = string.Empty;
        DateTime dtnow; DateTime dtend;
        bool isHasAddPdfSeal = false;
        public PrintToolHelperClass(IPageLayoutControlDefault pagelayoutcontrol)
        {
            m_pageLayoutControl = pagelayoutcontrol;
            m_Copies = 1;
            //初始化打印事件,注册完事件后,点击打印会自动调用。
            PrintDocument.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(document_PrintPage);

            timer = new System.Timers.Timer(1000);
            timer.Elapsed += Timer_Elapsed;
            isHasAddPdfSeal = false;
        }

    //打印方法
     public void Print()
        {
            PrintDialog printDialog = new PrintDialog();
            printDialog.AllowSomePages = true;

            mydocumentFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            if(string.IsNullOrEmpty(GlobalEx.Global.CaseID))
            filePath = mydocumentFolder + @"\document.pdf";
            else filePath = mydocumentFolder + @"\"+ GlobalEx.Global.CaseID+".pdf";
            if (File.Exists(filePath)) File.Delete(filePath);

            SetPrinterDefaultPaperA3(printDialog);
            //开启打印对话框
            if (printDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    //应用了打印模板时
                    if (ChangePrintTemplateOrPageSetupDialog.IsUserSettingForm || GlobalEx.Global.CurrentUsePageTemplate)
                    {

                        IPrinter printer = m_pageLayoutControl.Printer;
                        if (printer == null)
                        {
                            MessageBox.Show("初始化打印机错误!");
                            return;
                        }


                        IPaper paper = new PaperClass();
                        paper.Attach(printDialog.PrinterSettings.GetHdevmode(printDialog.PrinterSettings.DefaultPageSettings).ToInt32(), printDialog.PrinterSettings.GetHdevnames().ToInt32());
                        printer.Paper = paper;

                        m_pageLayoutControl.PageLayout.Page.Units = paper.Units;
                        
                        m_pageLayoutControl.PageLayout.Page.FormID = esriPageFormID.esriPageFormSameAsPrinter;

                        m_pageLayoutControl.PageLayout.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;
                        m_pageLayoutControl.PageLayout.Page.StretchGraphicsWithPage = false;

                        m_pageLayoutControl.Printer = printer;
                        m_pageLayoutControl.Printer.Paper = paper;
                        //修改打印机
                        m_pageLayoutControl.ActiveView.PrinterChanged(printer);

                        int printCount = printDialog.PrinterSettings.Copies;


                        if (!string.IsNullOrEmpty(GlobalEx.Global.CaseID))
                            PrintDocument.DocumentName = GlobalEx.Global.CaseID;
                        //设置打印页面
                        PrintToolHelperClass.PrintDocument.DefaultPageSettings = printDialog.PrinterSettings.DefaultPageSettings;
                        PrintToolHelperClass.PrintDocument.PrinterSettings = printDialog.PrinterSettings;
                        
                        PrintToolHelperClass.PrintDocument.Print();
                        //如果使用了自己安装的doPDF打印(可进行签章)
                        if (PrintToolHelperClass.PrintDocument.PrinterSettings.PrinterName.Contains("doPDF"))
                        {
                            if (Directory.Exists(mydocumentFolder))
                            {
                                timer.Enabled = true;
                                timer.Start();
                                dtnow = dtend = DateTime.Now;
                            }
                        }
                        //printDialog.Document = PrintDocument;

                    }
                    else

                    {
                        IPrinter printer = m_pageLayoutControl.Printer;
                        //新纸张
                        IPaper paper = new PaperClass();
                        //获取纸张信息
                        paper.Attach(printDialog.PrinterSettings.GetHdevmode(printDialog.PrinterSettings.DefaultPageSettings).ToInt32(), printDialog.PrinterSettings.GetHdevnames().ToInt32());
                        //赋值
                        short aaaa = paper.FormID;
                        printer.Paper = paper;
                        m_pageLayoutControl.Printer = printer;

                        if (!GlobalEx.Global.IsOldBusinessFinished) m_pageLayoutControl.ZoomToWholePage();
                        //m_HookHelper.ActiveView.Refresh();
                        m_pageLayoutControl.ActiveView.Refresh();
                        m_pageLayoutControl.PrintPageLayout(1, 1, 0);
                        
                    }

                }
                catch (Exception ex)
                {
                    throw ex;
                    //MessageBox.Show("打印失败!" + Environment.NewLine + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {

                }
            }
        }
    //打印预览
     public void PrintPreView()
        {
            PrintPreviewDialog _ppd = new PrintPreviewDialog();
            //当未设置打印机时,默认按地图控件布局页面预览
            if (m_PageSettings == null)
            {
                IPage page = m_pageLayoutControl.PageLayout.Page;
                if (page == null)
                {
                    return;
                }
                esriPageFormID f = page.FormID;
                string pageType = f.ToString();
                page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;
                //如果page为esriPageFormSameAsPrinter设置默认为A3
                if (pageType == "esriPageFormSameAsPrinter") pageType = "esriPageFormA3";
                //按照当前打印视图模板设置好默认的页面大小和方向
                PageSettings pagesettings = PrintDocument.DefaultPageSettings;
                foreach (PaperSize ps in PrintDocument.PrinterSettings.PaperSizes)
                {
                    if (pageType.Contains(ps.Kind.ToString()))
                    {
                        pagesettings.PaperSize = ps;
                        break;
                    }
                }
                if ((short)page.Orientation == 1)
                {
                    pagesettings.Landscape = false;
                }
                else pagesettings.Landscape = true;

                m_PageSettings = pagesettings;

                //PrintDocument.DefaultPageSettings = pagesettings;
                for (int i = 0; i <= PrinterSettings.InstalledPrinters.Count - 1; i++)
                {
                    if (PrinterSettings.InstalledPrinters[i].Trim() == "Microsoft XPS Document Writer")
                        PrintDocument.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[i].Trim();
                }

                PrinterSettings printerSettings = PrintDocument.PrinterSettings;
                printerSettings.DefaultPageSettings.PaperSize = pagesettings.PaperSize;
                printerSettings.DefaultPageSettings.Landscape = pagesettings.Landscape;
                m_PrinterSettings = printerSettings;

                IPaper pPaper;
                pPaper = new Paper();

                //printer = new EmfPrinterClass();
                int d = m_PrinterSettings.GetHdevmode().ToInt32();
                int d2 = m_PrinterSettings.GetHdevnames().ToInt32();
                pPaper.Attach(m_PrinterSettings.GetHdevmode().ToInt32(), m_PrinterSettings.GetHdevnames().ToInt32());

                m_pageLayoutControl.PageLayout.Page.Units = pPaper.Units;
                m_pageLayoutControl.PageLayout.Page.FormID = esriPageFormID.esriPageFormSameAsPrinter;
                m_pageLayoutControl.PageLayout.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;
                m_pageLayoutControl.PageLayout.Page.StretchGraphicsWithPage = false;

                IPrinter printer = m_pageLayoutControl.Printer;
                printer.Paper = pPaper;
                m_pageLayoutControl.ActiveView.PrinterChanged(printer);

                PrintDocument.DefaultPageSettings = m_PageSettings;
                PrintDocument.PrinterSettings = m_PrinterSettings;

                m_Copies = m_PrinterSettings.Copies;
                //m_PrintMap.ZoomToWholePage();
                m_pageLayoutControl.Refresh((esriViewDrawPhase)65535, null, null);
            }
            _ppd.UseAntiAlias = true;
            _ppd.Document = PrintDocument;
            _ppd.ShowDialog();
        }
        //打印设置
        public void PrintSetup()
        {
            try
            {
                if (m_frmPrintSetup == null)
                {
                    //"请稍候,正在初始化打印机...";			
                    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
                    m_frmPrintSetup = new frmPrintSetup(m_pageLayoutControl);
                    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
                    //"初始化完毕!"
                }

                if (m_frmPrintSetup.ShowDialog() == DialogResult.OK)
                {
                    System.Drawing.Printing.PageSettings ps = m_PageSettings;
                    IPaper pPaper;
                    pPaper = new Paper();

                    //printer = new EmfPrinterClass();
                    int d = m_PrinterSettings.GetHdevmode().ToInt32();
                    int d2 = m_PrinterSettings.GetHdevnames().ToInt32();
                    pPaper.Attach(m_PrinterSettings.GetHdevmode().ToInt32(), m_PrinterSettings.GetHdevnames().ToInt32());

                    m_pageLayoutControl.PageLayout.Page.Units = pPaper.Units;
                    m_pageLayoutControl.PageLayout.Page.FormID = esriPageFormID.esriPageFormSameAsPrinter;
                    m_pageLayoutControl.PageLayout.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;
                    m_pageLayoutControl.PageLayout.Page.StretchGraphicsWithPage = false;
                    IPrinter printer = m_pageLayoutControl.Printer;
                    printer.Paper = pPaper;
                    m_pageLayoutControl.ActiveView.PrinterChanged(printer);

                    m_Copies = m_PrinterSettings.Copies;
                    //m_PrintMap.ZoomToWholePage();
                    m_pageLayoutControl.Refresh((esriViewDrawPhase)65535, null, null);
                    PrintDocument.PrinterSettings = m_PrinterSettings;
                    PrintDocument.DefaultPageSettings = m_PageSettings;
                    m_pageLayoutControl.Refresh((esriViewDrawPhase)65535, null, null);

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("位于函数:PrintSetup", "打印", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
     //打印时会自动调用
        private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            if (m_pageLayoutControl == null) return;
            m_pageLayoutControl.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;

            short dpi = (short)e.Graphics.DpiX;
            //envelope for the device boundaries
            IEnvelope devBounds = new EnvelopeClass();
            //get page
            IPage page = m_pageLayoutControl.Page;

            //the number of printer pages the page will be printed on
            short printPageCount;
            printPageCount = m_pageLayoutControl.get_PrinterPageCount(0);
            m_CurrentPrintPage++;

            //the currently selected printer
            IPrinter printer = m_pageLayoutControl.Printer;
            //get the device bounds of the currently selected printer
            page.GetDeviceBounds(printer, m_CurrentPrintPage, 0, dpi, devBounds);

            //structure for the device boundaries
            tagRECT deviceRect;
            //Returns the coordinates of lower, left and upper, right corners
            double xmin, ymin, xmax, ymax;
            devBounds.QueryCoords(out xmin, out ymin, out xmax, out ymax);
            //initialize the structure for the device boundaries
            deviceRect.bottom = (int)(ymax - ymin);
            deviceRect.left = (int)0;
            deviceRect.top = (int)0;
            deviceRect.right = (int)(xmax - xmin);


            //determine the visible bounds of the currently printed page
            IEnvelope visBounds = new EnvelopeClass();
            page.GetPageBounds(printer, m_CurrentPrintPage, 0, visBounds);

            //get a handle to the graphics device that the print preview will be drawn to
            IntPtr hdc = e.Graphics.GetHdc();

            //print the page to the graphics device using the specified boundaries 
            m_pageLayoutControl.ActiveView.Output(hdc.ToInt32(), dpi, ref deviceRect, visBounds, m_TrackCancel);

            //release the graphics device handle
            e.Graphics.ReleaseHdc(hdc);

            //check if further pages have to be printed
            if (m_CurrentPrintPage < printPageCount)
                e.HasMorePages = true; //document_PrintPage event will be called again
            else
                e.HasMorePages = false;
        }
        /// <summary>
        /// 设置打印机默认纸张A3
        /// </summary>
        /// <param name="printDialog"></param>
        private void SetPrinterDefaultPaperA3(PrintDialog printDialog)
        {
            if (m_PrinterSettings == null)
            {
                IPage page = m_pageLayoutControl.PageLayout.Page;
                if (page == null)
                {
                    MessageBox.Show("获取页面错误,无法打印!");
                    return;
                }
                esriPageFormID f = page.FormID;
                string pageType = f.ToString();
                page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;
                //如果page为esriPageFormSameAsPrinter设置默认为A3
                if (pageType == "esriPageFormSameAsPrinter") pageType = "esriPageFormA3";
                //按照当前打印视图模板设置好默认的页面大小和方向
                PageSettings pagesettings = printDialog.PrinterSettings.DefaultPageSettings;
                printDialog.PrinterSettings = new PrinterSettings();
                for (int i = 0; i <= PrinterSettings.InstalledPrinters.Count - 1; i++)
                {
                    if (PrinterSettings.InstalledPrinters[i].Trim() == "Microsoft XPS Document Writer")
                        printDialog.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[i].Trim();
                }

                foreach (PaperSize ps in printDialog.PrinterSettings.PaperSizes)
                {
                    if (pageType.Contains(ps.Kind.ToString()))
                    {
                        pagesettings.PaperSize = ps;
                        break;
                    }
                }
                if ((short)page.Orientation == 1)
                {
                    pagesettings.Landscape = false;
                }
                else pagesettings.Landscape = true;


                PrintToolHelperClass.m_PageSettings = pagesettings;
                printDialog.PrinterSettings.DefaultPageSettings.PaperSize = pagesettings.PaperSize;
                printDialog.PrinterSettings.DefaultPageSettings.Landscape = pagesettings.Landscape;

                PrinterSettings printerSettings = printDialog.PrinterSettings;
                PrintToolHelperClass.m_PrinterSettings = printerSettings;
            }
            else
            {
                printDialog.PrinterSettings = m_PrinterSettings;
            }
        }
        //给PDF进行签章,因业务需要时加入的,没有该需求的可以不管
        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            GlobalEx.LayoutAddSeal.AddPdfSeal(filePath, timer, dtnow, dtend,ref isHasAddPdfSeal);
        }

打印设置界面

实现类frmPrintSetup代码

        private IPageLayoutControlDefault m_pageLayoutControl;
		private System.IntPtr m_CurrentDevMode, m_CurrentDevNames;
        public frmPrintSetup(IPageLayoutControlDefault inMap)
            : base()
        {
            //该调用是 Windows 窗体设计器所必需的。
            InitializeComponent();
            //在 InitializeComponent() 调用之后添加任何初始化
            m_pageLayoutControl = inMap;
      
        }
        
        private void frmPrintSetup_Load(object sender, System.EventArgs e)
        {
            //窗口起来先检测PageLayout打印机,如果为空使用默认
            if (PrintToolHelperClass.m_PrinterSettings == null)
            {
                IPage page = m_pageLayoutControl.PageLayout.Page;
                if (page == null)
                {
                    return;
                }
                esriPageFormID f = page.FormID;
                string pageType = f.ToString();
                page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;
                //如果page为esriPageFormSameAsPrinter设置默认为A3
                if (pageType == "esriPageFormSameAsPrinter") pageType = "esriPageFormA3";
                //按照当前打印视图模板设置好默认的页面大小和方向
                PageSettings pagesettings = PrintDialog1.PrinterSettings.DefaultPageSettings;
                PrintDialog1.PrinterSettings = new PrinterSettings();
                for (int i = 0; i <= PrinterSettings.InstalledPrinters.Count - 1; i++)
                {
                    if (PrinterSettings.InstalledPrinters[i].Trim() == "Microsoft XPS Document Writer")
                        PrintDialog1.PrinterSettings.PrinterName = PrinterSettings.InstalledPrinters[i].Trim();
                }
                foreach (PaperSize ps in PrintDialog1.PrinterSettings.PaperSizes)
                {
                    if (pageType.Contains(ps.Kind.ToString()))
                    {
                        pagesettings.PaperSize = ps;
                        break;
                    }
                }
                if ((short)page.Orientation == 1)
                {
                    pagesettings.Landscape = false;
                }
                else pagesettings.Landscape = true;

               
                PrintToolHelperClass.m_PageSettings = pagesettings;
                PrintDialog1.PrinterSettings.DefaultPageSettings.PaperSize = pagesettings.PaperSize;
                PrintDialog1.PrinterSettings.DefaultPageSettings.Landscape = pagesettings.Landscape;

                PrinterSettings printerSettings = PrintDialog1.PrinterSettings;
                PrintToolHelperClass.m_PrinterSettings = printerSettings;


                PrintToolHelperClass.PrintDocument.PrinterSettings = printerSettings;
                PrintToolHelperClass.PrintDocument.DefaultPageSettings = pagesettings;

                m_CurrentDevMode = PrintToolHelperClass.m_PrinterSettings.GetHdevmode();
                m_CurrentDevNames = PrintToolHelperClass.m_PrinterSettings.GetHdevnames();
            }
            else
            {
                PrintDialog1.PrinterSettings = PrintToolHelperClass.m_PrinterSettings;
            }
            //初始化列表
            cboPrinterName.Items.Clear();
            for (int i = 0; i <= PrinterSettings.InstalledPrinters.Count - 1; i++)
            {
                cboPrinterName.Items.Add(PrinterSettings.InstalledPrinters[i]);
            }
            for (int i = 0; i <= cboPrinterName.Items.Count - 1; i++)
            {
                if (cboPrinterName.Items[i].ToString() == PrintToolHelperClass.m_PrinterSettings.PrinterName)
                {
                    cboPrinterName.SelectedIndex = i;
                    break;
                }
            }

            RefreshPaperSizeAndSourceFromPrinter();

        }
		private void btnPrinterProp_Click(object sender, System.EventArgs e)
		{

			try 
			{
				if (PrintDialog1.ShowDialog() == DialogResult.OK)
				{
                    PrintToolHelperClass.m_PrinterSettings = PrintDialog1.PrinterSettings;
                    PrintToolHelperClass.m_PageSettings = PrintDialog1.PrinterSettings.DefaultPageSettings;
					RefreshPrinterSettings();
                    
				}
			}
			catch (Exception ex) 
			{
				MessageBox.Show("位于函数:btnPrinterProp_click-1", "打印", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
		}
        private void RefreshPrinterSettings()
        {
            try
            {
                if (cboPrinterName.Text != PrintToolHelperClass.m_PrinterSettings.PrinterName)
                {
                    for (int i = 0; i <= cboPrinterName.Items.Count - 1; i++)
                    {
                        if (cboPrinterName.Items[i].ToString() == PrintToolHelperClass.m_PrinterSettings.PrinterName)
                        {
                            cboPrinterName.SelectedIndex = i;
                            break;// might not be correct. Was : Exit For
                        }
                    }
                }
                RefreshPaperSizeAndSourceFromPrinter();
            }
            catch (Exception ex)
            {
                MessageBox.Show("位于函数:RefreshPrinterSettings", "打印", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

      private void btnOK_Click(object sender, System.EventArgs e)
		{
			ApplySettings();
		}
      private void RefreshPaperSizeAndSourceFromPrinter()
		{
			Paper pPaper = new Paper();
			try 
			{
                txtPaperSource.Text = PrintToolHelperClass.m_PageSettings.PaperSource.SourceName;

                int d = PrintToolHelperClass.m_PrinterSettings.GetHdevmode().ToInt32();
                int d2 = PrintToolHelperClass.m_PrinterSettings.GetHdevnames().ToInt32();
                pPaper.Attach(PrintToolHelperClass.m_PrinterSettings.GetHdevmode().ToInt32(), PrintToolHelperClass.m_PrinterSettings.GetHdevnames().ToInt32());

                if (PrintToolHelperClass.m_PageSettings.Landscape)
				{
					txtDirection.Text = "横向";
		 
				}
				else
				{
					txtDirection.Text = "纵向";
		 
				}
                numCopies.Value = PrintToolHelperClass.m_PrinterSettings.Copies;

                txtPaperSize.Text = pPaper.FormName;
			}
			catch (Exception ex) 
			{
				MessageBox.Show("位于函数:RefreshPaperSizeandSourceFromPrinter", "打印", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
		}
	 private void ApplySettings()
		{
			try 
			{
                m_CurrentDevMode = PrintToolHelperClass.m_PrinterSettings.GetHdevmode();
                m_CurrentDevNames = PrintToolHelperClass.m_PrinterSettings.GetHdevnames();
			}
			catch (Exception ex) 
			{
				MessageBox.Show("位于函数:ApplySettings", "打印", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
		}

		private void numCopies_ValueChanged(object sender, System.EventArgs e)
		{
			try 
			{
                PrintToolHelperClass.m_PrinterSettings.Copies = (short)numCopies.Value;
			}
			catch (Exception ex) 
			{
			}
		}

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xizhjxust_GIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值