ArcObjects Library Reference  

PrintPreview

About the Print preview using the PageLayoutControl Sample

[C#]

PrintPreview.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Drawing.Printing;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS;


namespace PrintPreview
{

	public class Form1 : System.Windows.Forms.Form
	{
		private System.ComponentModel.Container components = null;
		//buttons for open file, print preview, print dialog, page setup
		private System.Windows.Forms.Button button1;
		private System.Windows.Forms.Button button2;
		private System.Windows.Forms.Button button3;
		private System.Windows.Forms.Button button4;
		private System.Windows.Forms.ComboBox comboBox1;
        
		//declare the dialogs for print preview, print dialog, page setup
		internal PrintPreviewDialog printPreviewDialog1;
		internal PrintDialog printDialog1;
		internal PageSetupDialog pageSetupDialog1;
		//declare a PrintDocument object named document, to be displayed in the print preview
		private System.Drawing.Printing.PrintDocument document = new System.Drawing.Printing.PrintDocument();
		//cancel tracker which is passed to the output function when printing to the print preview
		private ITrackCancel m_TrackCancel = new CancelTrackerClass();
        private ESRI.ArcGIS.Controls.AxPageLayoutControl axPageLayoutControl1;
        private ESRI.ArcGIS.Controls.AxLicenseControl axLicenseControl1;
		//the page that is currently printed to the print preview
		private short m_CurrentPrintPage;

		public Form1()
		{
			InitializeComponent();
		}


		protected override void Dispose( bool disposing )
		{
			//Release COM objects
			ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown();

			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
      this.button1 = new System.Windows.Forms.Button();
      this.button2 = new System.Windows.Forms.Button();
      this.button3 = new System.Windows.Forms.Button();
      this.button4 = new System.Windows.Forms.Button();
      this.comboBox1 = new System.Windows.Forms.ComboBox();
      this.axPageLayoutControl1 = new ESRI.ArcGIS.Controls.AxPageLayoutControl();
      this.axLicenseControl1 = new ESRI.ArcGIS.Controls.AxLicenseControl();
      ((System.ComponentModel.ISupportInitialize)(this.axPageLayoutControl1)).BeginInit();
      ((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).BeginInit();
      this.SuspendLayout();
      // 
      // button1
      // 
      this.button1.Location = new System.Drawing.Point(8, 8);
      this.button1.Name = "button1";
      this.button1.Size = new System.Drawing.Size(88, 24);
      this.button1.TabIndex = 1;
      this.button1.Text = "Open File";
      this.button1.Click += new System.EventHandler(this.button1_Click);
      // 
      // button2
      // 
      this.button2.Location = new System.Drawing.Point(112, 8);
      this.button2.Name = "button2";
      this.button2.Size = new System.Drawing.Size(88, 24);
      this.button2.TabIndex = 4;
      this.button2.Text = "Page Setup";
      this.button2.Click += new System.EventHandler(this.button2_Click);
      // 
      // button3
      // 
      this.button3.Location = new System.Drawing.Point(216, 8);
      this.button3.Name = "button3";
      this.button3.Size = new System.Drawing.Size(88, 24);
      this.button3.TabIndex = 5;
      this.button3.Text = "Print Preview";
      this.button3.Click += new System.EventHandler(this.button3_Click);
      // 
      // button4
      // 
      this.button4.Location = new System.Drawing.Point(320, 8);
      this.button4.Name = "button4";
      this.button4.Size = new System.Drawing.Size(88, 24);
      this.button4.TabIndex = 6;
      this.button4.Text = "Print";
      this.button4.Click += new System.EventHandler(this.button4_Click);
      // 
      // comboBox1
      // 
      this.comboBox1.Location = new System.Drawing.Point(424, 8);
      this.comboBox1.Name = "comboBox1";
      this.comboBox1.Size = new System.Drawing.Size(144, 21);
      this.comboBox1.TabIndex = 8;
      // 
      // axPageLayoutControl1
      // 
      this.axPageLayoutControl1.Location = new System.Drawing.Point(0, 48);
      this.axPageLayoutControl1.Name = "axPageLayoutControl1";
      this.axPageLayoutControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axPageLayoutControl1.OcxState")));
      this.axPageLayoutControl1.Size = new System.Drawing.Size(680, 520);
      this.axPageLayoutControl1.TabIndex = 9;
      // 
      // axLicenseControl1
      // 
      this.axLicenseControl1.Enabled = true;
      this.axLicenseControl1.Location = new System.Drawing.Point(512, 88);
      this.axLicenseControl1.Name = "axLicenseControl1";
      this.axLicenseControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axLicenseControl1.OcxState")));
      this.axLicenseControl1.Size = new System.Drawing.Size(32, 32);
      this.axLicenseControl1.TabIndex = 10;
      // 
      // Form1
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(680, 566);
      this.Controls.Add(this.axLicenseControl1);
      this.Controls.Add(this.axPageLayoutControl1);
      this.Controls.Add(this.comboBox1);
      this.Controls.Add(this.button4);
      this.Controls.Add(this.button3);
      this.Controls.Add(this.button2);
      this.Controls.Add(this.button1);
      this.Name = "Form1";
      this.Text = "Print Preview / Print dialog Sample";
      this.Load += new System.EventHandler(this.Form1_Load);
      ((System.ComponentModel.ISupportInitialize)(this.axPageLayoutControl1)).EndInit();
      ((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).EndInit();
      this.ResumeLayout(false);

    }
    #endregion

		[STAThread]
		static void Main() 
		{
            
            if (!RuntimeManager.Bind(ProductCode.Engine))
            {
                if (!RuntimeManager.Bind(ProductCode.Desktop))
                {
                    MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.");
                    return;
                }
            }

            Application.Run(new Form1());
		}

		private void Form1_Load(object sender, System.EventArgs e)
		{ 
			InitializePrintPreviewDialog(); //initialize the print preview dialog
			printDialog1 = new PrintDialog(); //create a print dialog object
			InitializePageSetupDialog(); //initialize the page setup dialog   
			
			comboBox1.Items.Add("esriPageMappingTile");
			comboBox1.Items.Add("esriPageMappingCrop");
			comboBox1.Items.Add("esriPageMappingScale");
			comboBox1.SelectedIndex= 0;
		}

		private void InitializePrintPreviewDialog()
		{
			// create a new PrintPreviewDialog using constructor
			printPreviewDialog1 = new PrintPreviewDialog();
			//set the size, location, name and the minimum size the dialog can be resized to
			printPreviewDialog1.ClientSize = new System.Drawing.Size(800, 600);
			printPreviewDialog1.Location = new System.Drawing.Point(29, 29);
			printPreviewDialog1.Name = "PrintPreviewDialog1";
            printPreviewDialog1.MinimumSize = new System.Drawing.Size(375, 250);
            //set UseAntiAlias to true to allow the operating system to smooth fonts
			printPreviewDialog1.UseAntiAlias = true;

			//associate the event-handling method with the document's PrintPage event
			this.document.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(document_PrintPage);
		}

		private void InitializePageSetupDialog()
		{
			//create a new PageSetupDialog using constructor
			pageSetupDialog1 = new PageSetupDialog();
			//initialize the dialog's PrinterSettings property to hold user defined printer settings
			pageSetupDialog1.PageSettings = new System.Drawing.Printing.PageSettings();
			//initialize dialog's PrinterSettings property to hold user set printer settings
			pageSetupDialog1.PrinterSettings = new System.Drawing.Printing.PrinterSettings();
			//do not show the network in the printer dialog
			pageSetupDialog1.ShowNetwork = false;
		}

		private void button1_Click(object sender, System.EventArgs e)
		{
			Stream myStream;

			//create an open file dialog
			OpenFileDialog openFileDialog1 = new OpenFileDialog();

			//set the file extension filter, filter index and restore directory flag
			openFileDialog1.Filter = "template files (*.mxt)|*.mxt|mxd files (*.mxd)|*.mxd" ;
			openFileDialog1.FilterIndex = 2 ;
			openFileDialog1.RestoreDirectory = true ;

			//display open file dialog and check if user clicked ok button
			if(openFileDialog1.ShowDialog() == DialogResult.OK)
			{
				//check if a file was selected
				if((myStream = openFileDialog1.OpenFile())!= null)
				{
					//get the selected filename and path
					string fileName = openFileDialog1.FileName;

					//check if selected file is mxd file
					if (axPageLayoutControl1.CheckMxFile(fileName))
					{
						//load the mxd file into PageLayout	control
						axPageLayoutControl1.LoadMxFile(fileName, "");
					}
					myStream.Close();
				}
			}
		}

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

            //Show the page setup dialog storing the result.
            DialogResult result = pageSetupDialog1.ShowDialog();

            //set the printer settings of the preview document to the selected printer settings
            document.PrinterSettings = pageSetupDialog1.PrinterSettings;

            //set the page settings of the preview document to the selected page settings
            document.DefaultPageSettings = pageSetupDialog1.PageSettings;

            //due to a bug in PageSetupDialog the PaperSize has to be set explicitly by iterating through the
            //available PaperSizes in the PageSetupDialog finding the selected PaperSize
            int i;
            IEnumerator paperSizes = pageSetupDialog1.PrinterSettings.PaperSizes.GetEnumerator();
            paperSizes.Reset();

            for(i = 0; i<pageSetupDialog1.PrinterSettings.PaperSizes.Count; ++i)
            {
                paperSizes.MoveNext();
                if(((PaperSize)paperSizes.Current).Kind == document.DefaultPageSettings.PaperSize.Kind)
                {
                document.DefaultPageSettings.PaperSize = ((PaperSize)paperSizes.Current);
                }
            }
    
            /////////////////////////////////////////////////////////////
            ///initialize the current printer from the printer settings selected
            ///in the page setup dialog
            /////////////////////////////////////////////////////////////
            IPaper paper; 
            paper = new PaperClass(); //create a paper object

            IPrinter printer;
            printer = new EmfPrinterClass(); //create a printer object
            //in this case an EMF printer, alternatively a PS printer could be used

            //initialize the paper with the DEVMODE and DEVNAMES structures from the windows GDI
            //these structures specify information about the initialization and environment of a printer as well as
            //driver, device, and output port names for a printer
            paper.Attach(pageSetupDialog1.PrinterSettings.GetHdevmode(pageSetupDialog1.PageSettings).ToInt32(), pageSetupDialog1.PrinterSettings.GetHdevnames().ToInt32());

            //pass the paper to the emf printer
            printer.Paper = paper;

            //set the page layout control's printer to the currently selected printer
            axPageLayoutControl1.Printer = printer;
		}

	    private void button3_Click(object sender, System.EventArgs e)
		{
			//initialize the currently printed page number
			m_CurrentPrintPage = 0;

			//check if a document is loaded into PageLayout	control
			if(axPageLayoutControl1.DocumentFilename==null) return;
			//set the name of the print preview document to the name of the mxd doc
			document.DocumentName = axPageLayoutControl1.DocumentFilename;

			//set the PrintPreviewDialog.Document property to the PrintDocument object selected by the user
			printPreviewDialog1.Document = document;

			//show the dialog - this triggers the document's PrintPage event
			printPreviewDialog1.ShowDialog();
    }

		private void button4_Click(object sender, System.EventArgs e)
		{
			//allow the user to choose the page range to be printed
			printDialog1.AllowSomePages = true;
			//show the help button.
			printDialog1.ShowHelp = true;

			//set the Document property to the PrintDocument for which the PrintPage Event 
			//has been handled. To display the dialog, either this property or the 
			//PrinterSettings property must be set 
			printDialog1.Document = document;

			//show the print dialog and wait for user input
			DialogResult result = printDialog1.ShowDialog();

			// If the result is OK then print the document.
			if (result==DialogResult.OK) document.Print();
		}

		private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
		{
			//this code will be called when the PrintPreviewDialog.Show method is called
			//set the PageToPrinterMapping property of the Page. This specifies how the page 
			//is mapped onto the printer page. By default the page will be tiled 
			//get the selected mapping option
			string sPageToPrinterMapping = (string)this.comboBox1.SelectedItem; 
			if(sPageToPrinterMapping == null) 
				//if no selection has been made the default is tiling
				axPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingTile;
			else if (sPageToPrinterMapping.Equals("esriPageMappingTile"))
				axPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingTile;
			else if(sPageToPrinterMapping.Equals("esriPageMappingCrop"))
				axPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop;
			else if(sPageToPrinterMapping.Equals("esriPageMappingScale"))
				axPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingScale; 
            else
				axPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingTile;

            //get the resolution of the graphics device used by the print preview (including the graphics device)
			short dpi = (short)e.Graphics.DpiX;
			//envelope for the device boundaries
			IEnvelope devBounds = new EnvelopeClass(); 
			//get page
			IPage page = axPageLayoutControl1.Page;
      
			//the number of printer pages the page will be printed on
			short printPageCount;  
			printPageCount = axPageLayoutControl1.get_PrinterPageCount(0);
			m_CurrentPrintPage++;

			//the currently selected printer
			IPrinter printer = axPageLayoutControl1.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;
			deviceRect.left = (int) xmin;
			deviceRect.top = (int) ymin;
			deviceRect.right = (int) xmax;

			//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 
			axPageLayoutControl1.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;

		}

	}  
}

[Visual Basic .NET]

PrintPreview.vb

Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Display
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.Output
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS


Public Class Form1
    Inherits System.Windows.Forms.Form

    <STAThread()> _
Shared Sub Main()

        'Load runtime 
        If Not RuntimeManager.Bind(ProductCode.Engine) Then
            If Not RuntimeManager.Bind(ProductCode.Desktop) Then
                MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.")
                System.Environment.Exit(1) ' Force exit or other indication in the application
            End If
        End If

        Application.Run(New Form1())
    End Sub

    'Declare a PrintDocument object named document.
    Private WithEvents document As New System.Drawing.Printing.PrintDocument
    Private m_CurrentPrintPage As Short 'the page number of the currently printed page
    Private m_TrackCancel As ITrackCancel 'a cancel tracker for the printing process

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        'Release COM objects
        ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown()

        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Button2 As System.Windows.Forms.Button
    Friend WithEvents Button3 As System.Windows.Forms.Button
    Friend WithEvents PrintPreviewDialog1 As System.Windows.Forms.PrintPreviewDialog
    Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog
    Friend WithEvents PrintDialog1 As System.Windows.Forms.PrintDialog
    Friend WithEvents Button4 As System.Windows.Forms.Button
    Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox
    Friend WithEvents PageSetupDialog1 As System.Windows.Forms.PageSetupDialog
    Friend WithEvents AxPageLayoutControl1 As ESRI.ArcGIS.Controls.AxPageLayoutControl
    Friend WithEvents AxLicenseControl1 As ESRI.ArcGIS.Controls.AxLicenseControl
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))
    Me.Button1 = New System.Windows.Forms.Button
    Me.Button2 = New System.Windows.Forms.Button
    Me.Button3 = New System.Windows.Forms.Button
    Me.PrintPreviewDialog1 = New System.Windows.Forms.PrintPreviewDialog
    Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog
    Me.PrintDialog1 = New System.Windows.Forms.PrintDialog
    Me.Button4 = New System.Windows.Forms.Button
    Me.ComboBox1 = New System.Windows.Forms.ComboBox
    Me.PageSetupDialog1 = New System.Windows.Forms.PageSetupDialog
    Me.AxPageLayoutControl1 = New ESRI.ArcGIS.Controls.AxPageLayoutControl
    Me.AxLicenseControl1 = New ESRI.ArcGIS.Controls.AxLicenseControl
    CType(Me.AxPageLayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit()
    CType(Me.AxLicenseControl1, System.ComponentModel.ISupportInitialize).BeginInit()
    Me.SuspendLayout()
    '
    'Button1
    '
    Me.Button1.Location = New System.Drawing.Point(16, 8)
    Me.Button1.Name = "Button1"
    Me.Button1.Size = New System.Drawing.Size(96, 32)
    Me.Button1.TabIndex = 1
    Me.Button1.Text = "Open File"
    '
    'Button2
    '
    Me.Button2.Location = New System.Drawing.Point(128, 8)
    Me.Button2.Name = "Button2"
    Me.Button2.Size = New System.Drawing.Size(96, 32)
    Me.Button2.TabIndex = 2
    Me.Button2.Text = "Page Setup"
    '
    'Button3
    '
    Me.Button3.Location = New System.Drawing.Point(240, 8)
    Me.Button3.Name = "Button3"
    Me.Button3.Size = New System.Drawing.Size(96, 32)
    Me.Button3.TabIndex = 3
    Me.Button3.Text = "Print Preview"
    '
    'PrintPreviewDialog1
    '
    Me.PrintPreviewDialog1.AutoScrollMargin = New System.Drawing.Size(0, 0)
    Me.PrintPreviewDialog1.AutoScrollMinSize = New System.Drawing.Size(0, 0)
    Me.PrintPreviewDialog1.ClientSize = New System.Drawing.Size(400, 300)
    Me.PrintPreviewDialog1.Enabled = True
    Me.PrintPreviewDialog1.Icon = CType(resources.GetObject("PrintPreviewDialog1.Icon"), System.Drawing.Icon)
    Me.PrintPreviewDialog1.Location = New System.Drawing.Point(154, 203)
    Me.PrintPreviewDialog1.MinimumSize = New System.Drawing.Size(375, 250)
    Me.PrintPreviewDialog1.Name = "PrintPreviewDialog1"
    Me.PrintPreviewDialog1.TransparencyKey = System.Drawing.Color.Empty
    Me.PrintPreviewDialog1.Visible = False
    '
    'Button4
    '
    Me.Button4.Location = New System.Drawing.Point(352, 8)
    Me.Button4.Name = "Button4"
    Me.Button4.Size = New System.Drawing.Size(96, 32)
    Me.Button4.TabIndex = 7
    Me.Button4.Text = "Print"
    '
    'ComboBox1
    '
    Me.ComboBox1.Location = New System.Drawing.Point(464, 16)
    Me.ComboBox1.Name = "ComboBox1"
    Me.ComboBox1.Size = New System.Drawing.Size(144, 21)
    Me.ComboBox1.TabIndex = 8
    '
    'AxPageLayoutControl1
    '
    Me.AxPageLayoutControl1.Location = New System.Drawing.Point(0, 48)
    Me.AxPageLayoutControl1.Name = "AxPageLayoutControl1"
    Me.AxPageLayoutControl1.OcxState = CType(resources.GetObject("AxPageLayoutControl1.OcxState"), System.Windows.Forms.AxHost.State)
    Me.AxPageLayoutControl1.Size = New System.Drawing.Size(624, 448)
    Me.AxPageLayoutControl1.TabIndex = 9
    '
    'AxLicenseControl1
    '
    Me.AxLicenseControl1.Enabled = True
    Me.AxLicenseControl1.Location = New System.Drawing.Point(440, 112)
    Me.AxLicenseControl1.Name = "AxLicenseControl1"
    Me.AxLicenseControl1.OcxState = CType(resources.GetObject("AxLicenseControl1.OcxState"), System.Windows.Forms.AxHost.State)
    Me.AxLicenseControl1.Size = New System.Drawing.Size(32, 32)
    Me.AxLicenseControl1.TabIndex = 10
    '
    'Form1
    '
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(624, 494)
    Me.Controls.Add(Me.AxLicenseControl1)
    Me.Controls.Add(Me.AxPageLayoutControl1)
    Me.Controls.Add(Me.ComboBox1)
    Me.Controls.Add(Me.Button4)
    Me.Controls.Add(Me.Button3)
    Me.Controls.Add(Me.Button2)
    Me.Controls.Add(Me.Button1)
    Me.Name = "Form1"
    Me.Text = "Print Preview / Print dialog Sample"
    CType(Me.AxPageLayoutControl1, System.ComponentModel.ISupportInitialize).EndInit()
    CType(Me.AxLicenseControl1, System.ComponentModel.ISupportInitialize).EndInit()
    Me.ResumeLayout(False)

  End Sub

#End Region

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim myStream As System.IO.Stream

        'create a new open file dialog object
        Dim openFileDialog1 As New OpenFileDialog

        'initialize the filter, filter index and restore directory flag
        openFileDialog1.Filter = "template files (*.mxt)|*.mxt|mxd files (*.mxd)|*.mxd"
        openFileDialog1.FilterIndex = 2
        openFileDialog1.RestoreDirectory = True

        'display the dialog and wait for user input
        If openFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            myStream = openFileDialog1.OpenFile()
            If Not (myStream Is Nothing) Then

                Dim fileName As String
                fileName = openFileDialog1.FileName 'get the selected file

                If AxPageLayoutControl1.CheckMxFile(fileName) Then
                    'load the file in the page layout control
                    AxPageLayoutControl1.LoadMxFile(fileName, "")
                End If

                myStream.Close()

            End If
        End If

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        PageSetupDialog1.Document = document

        'Show the page setup dialog storing the result.
        Dim result As DialogResult
        result = PageSetupDialog1.ShowDialog()

        'set the printer settings of the preview document to the selected printer settings
        document.PrinterSettings = PageSetupDialog1.PrinterSettings

        'set the page settings of the preview document to the selected page settings
        document.DefaultPageSettings = PageSetupDialog1.PageSettings

        'due to a bug in PageSetupDialog the PaperSize has to be set explicitly by iterating through the
        'available PaperSizes in the PageSetupDialog finding the selected PaperSize
        Dim i As Integer
        For i = 0 To PageSetupDialog1.PrinterSettings.PaperSizes.Count - 1
            If PageSetupDialog1.PrinterSettings.PaperSizes.Item(i).Kind = document.DefaultPageSettings().PaperSize().Kind Then
                document.DefaultPageSettings().PaperSize() = PageSetupDialog1.PrinterSettings.PaperSizes.Item(i)
            End If
        Next i

        '------------------------------------------------------------
        'initialize the current printer from the printer settings selected
        'in the page setup dialog
        '-------------------------------------------------------------
        Dim paper As IPaper
        paper = New PaperClass   'create a paper object

        Dim printer As IPrinter
        printer = New EmfPrinterClass 'create a printer object
        'in this case an EMF printer, alternatively a PS printer could be used

        'initialize the paper with the DEVMODE and DEVNAMES structures from the windows GDI
        'these structures specify information about the initialization and environment of a printer as well as
        'driver, device, and output port names for a printer
        paper.Attach(PageSetupDialog1.PrinterSettings.GetHdevmode(PageSetupDialog1.PageSettings).ToInt32(), PageSetupDialog1.PrinterSettings.GetHdevnames().ToInt32())

        'pass the paper to the emf printer
        printer.Paper = paper

        'set the page layout control's printer to the currently selected printer
        AxPageLayoutControl1.Printer = printer

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        'initialize the currently printed page number
        m_CurrentPrintPage = 0

        If AxPageLayoutControl1.DocumentFilename Is Nothing Then Exit Sub

        'set the print document's name to that if the document in the PageLayoutControl
        document.DocumentName = AxPageLayoutControl1.DocumentFilename

        'set the Document property to the PrintDocument object selected by the user
        PrintPreviewDialog1.Document = document

        'show the dialog - this triggers the document's PrintPage event
        PrintPreviewDialog1.ShowDialog()

    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

        'allow the user to choose the page range to be printed
        PrintDialog1.AllowSomePages = True
        'show the help button.
        PrintDialog1.ShowHelp = True

        'set the Document property to the PrintDocument for which the PrintPage Event 
        'has been handled. To display the dialog, either this property or the 
        'PrinterSettings property must be set 
        PrintDialog1.Document = document

        'display the print dialog and wait for user input
        Dim result As DialogResult = PrintDialog1.ShowDialog()

        'if the result is OK then print the document.
        If (result = Windows.Forms.DialogResult.OK) Then document.Print()

    End Sub

    Private Sub InitializePrintPreviewDialog()

        'set the size, location, name and the minimum size the dialog can be resized to
        PrintPreviewDialog1.ClientSize() = New System.Drawing.Size(800, 600)
        PrintPreviewDialog1.Location() = New System.Drawing.Point(29, 29)
        PrintPreviewDialog1.Name() = "PrintPreviewDialog1"
        PrintPreviewDialog1.MinimumSize = New System.Drawing.Size(375, 250)
        'set UseAntiAlias to true to allow the operating system to smooth fonts
        PrintPreviewDialog1.UseAntiAlias = True

    End Sub

    Private Sub InitializePageSetupDialog()

        'initialize the dialog's PrinterSettings property to hold user defined printer settings.
        PageSetupDialog1.PageSettings = New System.Drawing.Printing.PageSettings
        'Initialize dialog's PrinterSettings property to hold user set printer settings
        PageSetupDialog1.PrinterSettings = New System.Drawing.Printing.PrinterSettings
        'Do not show the network in the printer dialog
        PageSetupDialog1.ShowNetwork = False

    End Sub

    Private Sub document_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles document.PrintPage

        'this code will be called when the PrintPreviewDialog.Show method is called
        'set the PageToPrinterMapping property of the Page. This specifies how the page 
        'is mapped onto the printer page.
        Dim sPageToPrinterMapping As String
        sPageToPrinterMapping = Me.ComboBox1.SelectedItem 'get the selected mapping option
        If sPageToPrinterMapping Is Nothing Then 'if no selection has been made the default is tiling
            AxPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingTile
        Else
            If sPageToPrinterMapping.Equals("esriPageMappingTile") = True Then
                AxPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingTile
            ElseIf sPageToPrinterMapping.Equals("esriPageMappingCrop") = True Then
                AxPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingCrop
            ElseIf sPageToPrinterMapping.Equals("esriPageMappingScale") = True Then
                AxPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingScale
            Else
                AxPageLayoutControl1.Page.PageToPrinterMapping = esriPageToPrinterMapping.esriPageMappingTile
            End If
        End If

        Dim deviceRect As ESRI.ArcGIS.esriSystem.tagRECT 'structure for the device boundaries

        Dim dpi As Short
        dpi = e.Graphics.DpiX 'get the resolution of the graphics device used by the print preview
        'e holds print preview arguments, including the graphics device

        Dim devBounds As IEnvelope 'envelope for the device boundaries
        devBounds = New EnvelopeClass

        Dim page As IPage 'the page of the page layout control
        page = AxPageLayoutControl1.Page

        Dim printer As IPrinter 'the currently selected printer
        printer = AxPageLayoutControl1.Printer

        Dim printPageCount As Short 'the number of printer pages the page will be printed on 

        printPageCount = AxPageLayoutControl1.get_PrinterPageCount(0) '.Page.PrinterPageCount(printer, 0, printPageCount)
        m_CurrentPrintPage += 1

        'get the device bounds of the currently selected printer
        page.GetDeviceBounds(printer, m_CurrentPrintPage, 0, dpi, devBounds)

        'Returns the coordinates of lower, left and upper, right corners
        Dim xmin, ymin, xmax, ymax As Double
        devBounds.QueryCoords(xmin, ymin, xmax, ymax)

        'initialize the structure for the device boundaries
        deviceRect.bottom = ymax
        deviceRect.left = xmin
        deviceRect.top = ymin
        deviceRect.right = xmax

        'determine the visible bounds of the currently printed page
        Dim visBounds As IEnvelope
        visBounds = New EnvelopeClass
        page.GetPageBounds(printer, m_CurrentPrintPage, 0, visBounds)

        'get a handle to the graphics device
        'this is the device the print preview will be drawn to
        Dim hdc As IntPtr = e.Graphics.GetHdc()

        'print the page of the page layout control to the graphics device using the specified boundaries 
        AxPageLayoutControl1.ActiveView.Output(hdc.ToInt32(), dpi, 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 Then
            e.HasMorePages = True 'document_PrintPage event will be called again
        Else
            e.HasMorePages = False
        End If

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        InitializePrintPreviewDialog()
        InitializePageSetupDialog()

        ComboBox1.Items.Add("esriPageMappingTile")
        ComboBox1.Items.Add("esriPageMappingCrop")
        ComboBox1.Items.Add("esriPageMappingScale")
        ComboBox1.SelectedIndex = 0

    End Sub
End Class