工具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)
{
}
}