CoolPrintPreviewDialog.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using DevExpress.XtraEditors;
  11. using System.Drawing.Printing;
  12. namespace ProjectBase.Controls
  13. {
  14. /// <summary>
  15. /// Represents a dialog containing a <see cref="CoolPrintPreviewControl"/> control
  16. /// used to preview and print <see cref="PrintDocument"/> objects.
  17. /// </summary>
  18. /// <remarks>
  19. /// This dialog is similar to the standard <see cref="PrintPreviewDialog"/>
  20. /// but provides additional options such printer and page setup buttons,
  21. /// a better UI based on the <see cref="ToolStrip"/> control, and built-in
  22. /// PDF export.
  23. /// </remarks>
  24. public partial class CoolPrintPreviewDialog : DevExpress.XtraEditors.XtraForm
  25. {
  26. PrintDocument _doc;
  27. /// <summary>
  28. /// Initializes a new instance of a <see cref="CoolPrintPreviewDialog"/>.
  29. /// </summary>
  30. public CoolPrintPreviewDialog() : this(null)
  31. {
  32. }
  33. /// <summary>
  34. /// Initializes a new instance of a <see cref="CoolPrintPreviewDialog"/>.
  35. /// </summary>
  36. /// <param name="parentForm">Parent form that defines the initial size for this dialog.</param>
  37. public CoolPrintPreviewDialog(Control parentForm)
  38. {
  39. InitializeComponent();
  40. if (parentForm != null)
  41. {
  42. Size = parentForm.Size;
  43. }
  44. }
  45. /// <summary>
  46. /// Gets or sets the <see cref="PrintDocument"/> to preview.
  47. /// </summary>
  48. public PrintDocument Document
  49. {
  50. get { return _doc; }
  51. set
  52. {
  53. // unhook event handlers
  54. if (_doc != null)
  55. {
  56. _doc.BeginPrint -= _doc_BeginPrint;
  57. _doc.EndPrint -= _doc_EndPrint;
  58. }
  59. // save the value
  60. _doc = value;
  61. // hook up event handlers
  62. if (_doc != null)
  63. {
  64. _doc.BeginPrint += _doc_BeginPrint;
  65. _doc.EndPrint += _doc_EndPrint;
  66. }
  67. // don't assign document to preview until this form becomes visible
  68. if (Visible)
  69. {
  70. _preview.Document = Document;
  71. }
  72. }
  73. }
  74. #region ** overloads
  75. /// <summary>
  76. /// Overridden to assign document to preview control only after the
  77. /// initial activation.
  78. /// </summary>
  79. /// <param name="e"><see cref="EventArgs"/> that contains the event data.</param>
  80. protected override void OnShown(EventArgs e)
  81. {
  82. base.OnShown(e);
  83. _preview.Document = Document;
  84. }
  85. /// <summary>
  86. /// Overridden to cancel any ongoing previews when closing form.
  87. /// </summary>
  88. /// <param name="e"><see cref="FormClosingEventArgs"/> that contains the event data.</param>
  89. protected override void OnFormClosing(FormClosingEventArgs e)
  90. {
  91. base.OnFormClosing(e);
  92. if (_preview.IsRendering && !e.Cancel)
  93. {
  94. _preview.Cancel();
  95. }
  96. }
  97. #endregion
  98. #region ** main commands
  99. void _btnPrint_Click(object sender, EventArgs e)
  100. {
  101. using (var dlg = new PrintDialog())
  102. {
  103. // configure dialog
  104. dlg.AllowSomePages = true;
  105. dlg.AllowSelection = true;
  106. dlg.UseEXDialog = true;
  107. dlg.Document = Document;
  108. // show allowed page range
  109. var ps = dlg.PrinterSettings;
  110. ps.MinimumPage = ps.FromPage = 1;
  111. ps.MaximumPage = ps.ToPage = _preview.PageCount;
  112. // show dialog
  113. if (dlg.ShowDialog(this) == DialogResult.OK)
  114. {
  115. // print selected page range
  116. _preview.Print();
  117. }
  118. }
  119. }
  120. void _btnPageSetup_Click(object sender, EventArgs e)
  121. {
  122. using (var dlg = new PageSetupDialog())
  123. {
  124. dlg.Document = Document;
  125. if (dlg.ShowDialog(this) == DialogResult.OK)
  126. {
  127. // to show new page layout
  128. _preview.RefreshPreview();
  129. }
  130. }
  131. }
  132. #endregion
  133. #region ** zoom
  134. void _btnZoom_ButtonClick(object sender, EventArgs e)
  135. {
  136. _preview.ZoomMode = _preview.ZoomMode == ZoomMode.ActualSize
  137. ? ZoomMode.FullPage
  138. : ZoomMode.ActualSize;
  139. }
  140. void _btnZoom_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
  141. {
  142. if (e.ClickedItem == _itemActualSize)
  143. {
  144. _preview.ZoomMode = ZoomMode.ActualSize;
  145. }
  146. else if (e.ClickedItem == _itemFullPage)
  147. {
  148. _preview.ZoomMode = ZoomMode.FullPage;
  149. }
  150. else if (e.ClickedItem == _itemPageWidth)
  151. {
  152. _preview.ZoomMode = ZoomMode.PageWidth;
  153. }
  154. else if (e.ClickedItem == _itemTwoPages)
  155. {
  156. _preview.ZoomMode = ZoomMode.TwoPages;
  157. }
  158. if (e.ClickedItem == _item10)
  159. {
  160. _preview.Zoom = .1;
  161. }
  162. else if (e.ClickedItem == _item100)
  163. {
  164. _preview.Zoom = 1;
  165. }
  166. else if (e.ClickedItem == _item150)
  167. {
  168. _preview.Zoom = 1.5;
  169. }
  170. else if (e.ClickedItem == _item200)
  171. {
  172. _preview.Zoom = 2;
  173. }
  174. else if (e.ClickedItem == _item25)
  175. {
  176. _preview.Zoom = .25;
  177. }
  178. else if (e.ClickedItem == _item50)
  179. {
  180. _preview.Zoom = .5;
  181. }
  182. else if (e.ClickedItem == _item500)
  183. {
  184. _preview.Zoom = 5;
  185. }
  186. else if (e.ClickedItem == _item75)
  187. {
  188. _preview.Zoom = .75;
  189. }
  190. }
  191. #endregion
  192. #region ** page navigation
  193. void _btnFirst_Click(object sender, EventArgs e)
  194. {
  195. _preview.StartPage = 0;
  196. }
  197. void _btnPrev_Click(object sender, EventArgs e)
  198. {
  199. _preview.StartPage--;
  200. }
  201. void _btnNext_Click(object sender, EventArgs e)
  202. {
  203. _preview.StartPage++;
  204. }
  205. void _btnLast_Click(object sender, EventArgs e)
  206. {
  207. _preview.StartPage = _preview.PageCount - 1;
  208. }
  209. void _txtStartPage_Enter(object sender, EventArgs e)
  210. {
  211. _txtStartPage.SelectAll();
  212. }
  213. void _txtStartPage_Validating(object sender, CancelEventArgs e)
  214. {
  215. CommitPageNumber();
  216. }
  217. void _txtStartPage_KeyPress(object sender, KeyPressEventArgs e)
  218. {
  219. var c = e.KeyChar;
  220. if (c == (char)13)
  221. {
  222. CommitPageNumber();
  223. e.Handled = true;
  224. }
  225. else if (c > ' ' && !char.IsDigit(c))
  226. {
  227. e.Handled = true;
  228. }
  229. }
  230. void CommitPageNumber()
  231. {
  232. int page;
  233. if (int.TryParse(_txtStartPage.Text, out page))
  234. {
  235. _preview.StartPage = page - 1;
  236. }
  237. }
  238. void _preview_StartPageChanged(object sender, EventArgs e)
  239. {
  240. var page = _preview.StartPage + 1;
  241. _txtStartPage.Text = page.ToString();
  242. }
  243. private void _preview_PageCountChanged(object sender, EventArgs e)
  244. {
  245. this.Update();
  246. Application.DoEvents();
  247. _lblPageCount.Text = string.Format("/ {0}", _preview.PageCount);
  248. }
  249. #endregion
  250. #region ** job control
  251. void _btnCancel_Click(object sender, EventArgs e)
  252. {
  253. if (_preview.IsRendering)
  254. {
  255. _preview.Cancel();
  256. }
  257. else
  258. {
  259. Close();
  260. }
  261. }
  262. void _doc_BeginPrint(object sender, PrintEventArgs e)
  263. {
  264. _btnCancel.Text = "取消(&C)";
  265. _btnPrint.Enabled = _btnPageSetup.Enabled = false;
  266. }
  267. void _doc_EndPrint(object sender, PrintEventArgs e)
  268. {
  269. _btnCancel.Text = "关闭(&C)";
  270. _btnPrint.Enabled = _btnPageSetup.Enabled = true;
  271. }
  272. #endregion
  273. }
  274. /// <summary>
  275. /// This version of the PageImageList is a simple List<Image>. It is simple,
  276. /// but caches one image (GDI object) per preview page.
  277. /// </summary>
  278. class PageImageList : List<Image>
  279. {
  280. }
  281. }