WinPrinterPageSetting.cs
上传用户:jx_fiona
上传日期:2014-03-08
资源大小:1387k
文件大小:11k
源码类别:

打印编程

开发平台:

Others

  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Printing;
  4. using System.Windows.Forms;
  5. namespace GoldPrinter
  6. {
  7. /// <summary>
  8. /// WinForm下的打印纸张设置、打印机设置、打印预览对话框。
  9. /// 
  10. /// 作 者:长江支流(周方勇)
  11. /// Email:flygoldfish@163.com  QQ:150439795
  12. /// 网 址:www.webmis.com.cn
  13. /// ★★★★★您可以免费使用此程序,但是请您完整保留此说明,以维护知识产权★★★★★
  14. /// 
  15. /// </summary>
  16. public class WinPrinterPageSetting:IPrinterPageSetting
  17. {
  18. //把PrintPage委托声明为类的一个成员变量
  19. private PrintPageDelegate _printPageValue;
  20. //把导出到Excel委托声明为类的一个成员变量
  21. private ImportExcelDelegate _importExcelValue;
  22. // 打印文档
  23. private PrintDocument _printDocument;
  24. #region 构造函数
  25. public WinPrinterPageSetting():this(null)
  26. {
  27. }
  28. /// <summary>
  29. /// 使用printDocument来初始化类的新实例,当printDocument为null时自动创建一个printDocument的实例
  30. /// </summary>
  31. /// <param name="printDocument">如果为null,则提供一个默认的PrintDocument</param>
  32. public WinPrinterPageSetting(PrintDocument printDocument)
  33. {
  34. if (printDocument != null)
  35. {
  36. _printDocument = printDocument;
  37. }
  38. else
  39. {
  40. _printDocument = new PrintDocument();
  41. }
  42. }
  43. #endregion
  44. #region IPrinterPageSetting 成员
  45. /// <summary>
  46. /// 获取或设置打印文档
  47. /// </summary>
  48. public PrintDocument PrintDocument
  49. {
  50. get
  51. {
  52. return this._printDocument;
  53. }
  54. set
  55. {
  56. this._printDocument = value;
  57. }
  58. }
  59. /// <summary>
  60. /// 一定要实例化此类后在调用打印/预览之前设置此属性,使之关联一个方法,目的是让具体的打印由实例化者来操作。这里当属性使用,其实可以用PrintPage。
  61. /// 意思就是告诉printerPageSetting打印的具体实现过程是PrintPageEventHandler
  62. /// C#调用:
  63. /// PrinterPageSetting1.PrintPageValue = new PrintPageDelegate(this.PrintPageEventHandler);
  64. /// VB调用:    
  65. ///    Me.printerPageSetting.PrintPageValue = New GoldPrinter.PrintPageDelegate(AddressOf printDocument_PrintPage)
  66. /// </summary>
  67. public PrintPageDelegate PrintPageValue
  68. {
  69. set
  70. {
  71. //初始委托变量,关联方法
  72. _printPageValue = value;
  73. _printDocument.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this._printPageValue);
  74. }
  75. get
  76. {
  77. return _printPageValue;
  78. }
  79. }
  80. /// <summary>
  81. /// 当需要为当前页打印的输出时发生,如果对此不了解,就用PrintPageValue赋值也可以
  82.         /// C#调用:
  83.         /// PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);
  84.         /// VB调用:    
  85.         ///    Me.printerPageSetting.PrintPageValue = New GoldPrinter.PrintPageDelegate(AddressOf printDocument_PrintPage)
  86.         /// </summary>
  87. public event PrintPageDelegate PrintPage
  88. {
  89. add
  90. {
  91. _printDocument.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(value);
  92. _printPageValue = value;
  93. }
  94. remove
  95. {
  96. _printDocument.PrintPage -= new System.Drawing.Printing.PrintPageEventHandler(value);
  97. _printPageValue = null;
  98. }
  99. }
  100. /// <summary>
  101. /// 导出Excel的实现
  102. /// </summary>
  103. public ImportExcelDelegate ImportExcelValue
  104. {
  105. set
  106. {
  107. //初始委托变量,关联方法
  108. _importExcelValue = value;
  109. }
  110. get
  111. {
  112. return _importExcelValue;
  113. }
  114. }
  115. /// <summary>
  116. /// 显示页面设置对话框,并返回PageSettings
  117. /// </summary>
  118. /// <returns></returns>
  119. public PageSettings ShowPageSetupDialog()
  120. {
  121. return ShowPageSetupDialog(this._printDocument);
  122. }
  123. /// <summary>
  124. /// 显示打印机设置对话框,并返回PrinterSettings
  125. /// </summary>
  126. /// <returns></returns>
  127. public PrinterSettings ShowPrintSetupDialog()
  128. {
  129. return ShowPrintSetupDialog(this._printDocument);
  130. }
  131. /// <summary>
  132. /// 显示打印预览对话框
  133. /// </summary>
  134. public void ShowPrintPreviewDialog()
  135. {
  136. ShowPrintPreviewDialog(this._printDocument);
  137. }
  138. #endregion
  139.         #region ***************页面设置打印设置打印预览对话框,可以独立使用***************
  140. #region 页面设置对话框 protected virtual PageSettings ShowPageSetupDialog(PrintDocument printDocument)
  141. /// <summary>
  142. /// 页面设置对话框,可以独立使用
  143. /// </summary>
  144. /// <param name="printDocument"></param>
  145. /// <returns></returns>
  146. /// <remarks>
  147. /// 作    者:周方勇
  148. /// 修改日期:2004-08-07
  149. /// </remarks>
  150. protected virtual PageSettings ShowPageSetupDialog(PrintDocument printDocument)
  151. {
  152.             //检查printDocument是否为空,空的话抛出异常
  153.             ThrowPrintDocumentNullException(printDocument);
  154. //声明返回值的PageSettings
  155. PageSettings ps = new PageSettings();
  156. //申明并实例化PageSetupDialog
  157. PageSetupDialog psDlg = new PageSetupDialog();
  158. ps = printDocument.DefaultPageSettings;
  159. try
  160. {
  161. //相关文档及文档页面默认设置
  162. psDlg.Document = printDocument;
  163. Margins mg = printDocument.DefaultPageSettings.Margins;
  164. if (System.Globalization.RegionInfo.CurrentRegion.IsMetric)
  165. {
  166. mg = PrinterUnitConvert.Convert(mg, PrinterUnit.Display, PrinterUnit.TenthsOfAMillimeter);
  167. }
  168. //备份打印文档的DefaultPageSettings,因为转换后会改变,而设置对话框单击取消按钮后不还原就不能正确显示原来的值
  169. PageSettings psPrintDocumentBack = (PageSettings)(printDocument.DefaultPageSettings.Clone());
  170. psDlg.PageSettings = psPrintDocumentBack;//printDocument.DefaultPageSettings; //用printDocument的时取消了对话框就要还原
  171. psDlg.PageSettings.Margins = mg;
  172. //显示对话框
  173. DialogResult result = psDlg.ShowDialog();
  174. if (result == DialogResult.OK)
  175. {
  176. ps = psDlg.PageSettings;
  177. printDocument.DefaultPageSettings = psDlg.PageSettings;
  178. }
  179. else
  180. {
  181. }
  182. }
  183.             catch(System.Drawing.Printing.InvalidPrinterException e)
  184.             {
  185.                 ShowInvalidPrinterException(e);
  186.             }
  187.             catch(Exception ex)
  188.             {
  189.                 ShowPrinterException(ex);
  190.             }
  191.             finally
  192. {
  193. psDlg.Dispose();
  194. psDlg = null;
  195. }
  196. return ps;
  197. }
  198. #endregion
  199. #region 打印设置对话框 protected virtual PrinterSettings ShowPrintSetupDialog(PrintDocument printDocument)
  200. /// <summary>
  201. /// 打印设置对话框,可以独立使用
  202. /// </summary>
  203. /// <param name="printDocument"></param>
  204. /// <returns></returns>
  205. /// <remarks>
  206. /// 作    者:周方勇
  207. /// 修改日期:2004-08-07
  208. /// </remarks>
  209. protected virtual PrinterSettings ShowPrintSetupDialog(PrintDocument printDocument)
  210. {
  211.             //检查printDocument是否为空,空的话抛出异常
  212.             ThrowPrintDocumentNullException(printDocument);
  213. //声明返回值的PrinterSettings
  214. PrinterSettings ps = new PrinterSettings();
  215. //申明并实例化PrintDialog
  216. PrintDialog pDlg = new PrintDialog();
  217. try
  218. {
  219. //可以选定页
  220. pDlg.AllowSomePages = true;
  221. //指定打印文档
  222. pDlg.Document = printDocument;
  223. //显示对话框
  224. DialogResult result = pDlg.ShowDialog();
  225. if (result == DialogResult.OK)
  226. {
  227. //保存打印设置
  228. ps = pDlg.PrinterSettings;
  229. //打印
  230. printDocument.Print();
  231. }
  232. }
  233.             catch(System.Drawing.Printing.InvalidPrinterException e)
  234.             {
  235.                 ShowInvalidPrinterException(e);
  236.             }
  237.             catch(Exception ex)
  238.             {
  239.                 ShowPrinterException(ex);
  240.             }
  241.             finally
  242. {
  243. pDlg.Dispose();
  244. pDlg = null;
  245. }
  246. return ps;
  247. }
  248. #endregion
  249. private void Excel_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
  250. {
  251. ToolBarButton tb = e.Button;
  252. string strToolTipText = tb.ToolTipText;
  253. if (strToolTipText == "Import Excel" && (this._importExcelValue != null))
  254. {
  255. //调用
  256. this._importExcelValue.BeginInvoke(sender,null,null,null);
  257. }
  258. }
  259. #region 打印预览对话框 protected virtual void ShowPrintPreviewDialog(PrintDocument printDocument)
  260. /// <summary>
  261. /// 打印预览对话框,可以独立使用
  262. /// </summary>
  263. /// <param name="printDocument"></param>
  264. /// <returns></returns>
  265. /// <remarks>
  266. /// 作    者:周方勇
  267. /// 修改日期:2004-08-07
  268. /// </remarks>
  269. protected virtual void ShowPrintPreviewDialog(PrintDocument printDocument)
  270. {
  271.             //检查printDocument是否为空,空的话抛出异常
  272. ThrowPrintDocumentNullException(printDocument);
  273. //申明并实例化PrintPreviewDialog
  274. PrintPreviewDialog ppDlg = new PrintPreviewDialog();
  275. //ppDlg.Icon = new Icon("..\.....myIcon.ico");
  276. //ppDlg.Text = "打印预览--欢迎使用"; //PrintPreviewDialog()继承Forms,这里居然看不到这几个属性
  277. ppDlg.Text = printDocument.DocumentName;
  278. ppDlg.WindowState = FormWindowState.Maximized;
  279. //ppDlg.Controls[0].BackColor = Color.Red; //打印预览控件白色纸张区域
  280. if (this._importExcelValue != null)
  281. {
  282. ToolBar tb = null;
  283. if (ppDlg.Controls[1] is ToolBar)
  284. {
  285. //Vs2003
  286. tb = (ToolBar)ppDlg.Controls[1]; //打印预览控件ToolBar控制
  287. ToolBarButton toolbtn = new ToolBarButton();
  288. toolbtn.ToolTipText = "Import Excel";
  289. toolbtn.ImageIndex = 2;
  290. tb.ButtonClick +=new ToolBarButtonClickEventHandler(Excel_ButtonClick);
  291. tb.Buttons.Add(toolbtn);
  292. }
  293. else
  294. {
  295. //Vs2005
  296. //VS2005中ToolBar已被ToolStrip取代,只是为了向下兼容还保留ToolBar类。
  297. //tb = ((ToolStrip)ppDlg.Controls[1]).Items.Add(new ToolStripButton("Excel"));
  298. }
  299. }
  300. try
  301. {
  302. //指定打印文档
  303. ppDlg.Document = printDocument;
  304. //显示对话框
  305. // ppDlg.FindForm().Visible = false;
  306. DialogResult result = ppDlg.ShowDialog();
  307. // ppDlg.FindForm().Visible = true;
  308. if (result == DialogResult.OK)
  309. {
  310. //...
  311. }
  312. }
  313. catch(System.Drawing.Printing.InvalidPrinterException e)
  314. {
  315. ShowInvalidPrinterException(e);
  316. }
  317. catch(Exception ex)
  318. {
  319. ShowPrinterException(ex);
  320. }
  321. finally
  322. {
  323. ppDlg.Dispose();
  324. ppDlg = null;
  325. }
  326. }
  327. #endregion
  328.         #region 对话框支持函数据  重构日期:2004-09-03
  329.         /// <summary>
  330.         /// 检查printDocument是否为空,空的话抛出异常
  331.         /// </summary>
  332.         /// <param name="printDocument"></param>
  333.         protected virtual void ThrowPrintDocumentNullException(PrintDocument printDocument)
  334.         {
  335.             if (printDocument==null)
  336.             {
  337.                 throw new Exception("关联的打印文档不能为空!");
  338.             }        
  339.         }
  340.         /// <summary>
  341.         /// 显示没安装打印机时的提示信息
  342.         /// </summary>
  343.         /// <param name="e"></param>
  344.         protected virtual void ShowInvalidPrinterException(System.Drawing.Printing.InvalidPrinterException e)
  345.         {
  346.             MessageBox.Show("未安装打印机,请进入系统控制面版添加打印机!","打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
  347.         }
  348.         /// <summary>
  349.         /// 显示打印机其它错误提示信息
  350.         /// </summary>
  351.         /// <param name="ex"></param>
  352.         protected virtual void ShowPrinterException(Exception ex)
  353.         {
  354.             MessageBox.Show(ex.Message,"打印",MessageBoxButtons.OK,MessageBoxIcon.Warning);
  355.         }
  356.         #endregion
  357.         #endregion
  358. }//End Class
  359. }//End NameSpace