123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Linq;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using DevExpress.XtraEditors;
- using System.Drawing.Printing;
- namespace ProjectBase.Controls
- {
- /// <summary>
- /// Represents a dialog containing a <see cref="CoolPrintPreviewControl"/> control
- /// used to preview and print <see cref="PrintDocument"/> objects.
- /// </summary>
- /// <remarks>
- /// This dialog is similar to the standard <see cref="PrintPreviewDialog"/>
- /// but provides additional options such printer and page setup buttons,
- /// a better UI based on the <see cref="ToolStrip"/> control, and built-in
- /// PDF export.
- /// </remarks>
- public partial class CoolPrintPreviewDialog : DevExpress.XtraEditors.XtraForm
- {
- PrintDocument _doc;
- /// <summary>
- /// Initializes a new instance of a <see cref="CoolPrintPreviewDialog"/>.
- /// </summary>
- public CoolPrintPreviewDialog() : this(null)
- {
- }
- /// <summary>
- /// Initializes a new instance of a <see cref="CoolPrintPreviewDialog"/>.
- /// </summary>
- /// <param name="parentForm">Parent form that defines the initial size for this dialog.</param>
- public CoolPrintPreviewDialog(Control parentForm)
- {
- InitializeComponent();
- if (parentForm != null)
- {
- Size = parentForm.Size;
- }
- }
- /// <summary>
- /// Gets or sets the <see cref="PrintDocument"/> to preview.
- /// </summary>
- public PrintDocument Document
- {
- get { return _doc; }
- set
- {
- // unhook event handlers
- if (_doc != null)
- {
- _doc.BeginPrint -= _doc_BeginPrint;
- _doc.EndPrint -= _doc_EndPrint;
- }
- // save the value
- _doc = value;
- // hook up event handlers
- if (_doc != null)
- {
- _doc.BeginPrint += _doc_BeginPrint;
- _doc.EndPrint += _doc_EndPrint;
- }
- // don't assign document to preview until this form becomes visible
- if (Visible)
- {
- _preview.Document = Document;
- }
- }
- }
- #region ** overloads
- /// <summary>
- /// Overridden to assign document to preview control only after the
- /// initial activation.
- /// </summary>
- /// <param name="e"><see cref="EventArgs"/> that contains the event data.</param>
- protected override void OnShown(EventArgs e)
- {
- base.OnShown(e);
- _preview.Document = Document;
- }
- /// <summary>
- /// Overridden to cancel any ongoing previews when closing form.
- /// </summary>
- /// <param name="e"><see cref="FormClosingEventArgs"/> that contains the event data.</param>
- protected override void OnFormClosing(FormClosingEventArgs e)
- {
- base.OnFormClosing(e);
- if (_preview.IsRendering && !e.Cancel)
- {
- _preview.Cancel();
- }
- }
- #endregion
- #region ** main commands
- void _btnPrint_Click(object sender, EventArgs e)
- {
- using (var dlg = new PrintDialog())
- {
- // configure dialog
- dlg.AllowSomePages = true;
- dlg.AllowSelection = true;
- dlg.UseEXDialog = true;
- dlg.Document = Document;
- // show allowed page range
- var ps = dlg.PrinterSettings;
- ps.MinimumPage = ps.FromPage = 1;
- ps.MaximumPage = ps.ToPage = _preview.PageCount;
- // show dialog
- if (dlg.ShowDialog(this) == DialogResult.OK)
- {
- // print selected page range
- _preview.Print();
- }
- }
- }
- void _btnPageSetup_Click(object sender, EventArgs e)
- {
- using (var dlg = new PageSetupDialog())
- {
- dlg.Document = Document;
- if (dlg.ShowDialog(this) == DialogResult.OK)
- {
- // to show new page layout
- _preview.RefreshPreview();
- }
- }
- }
- #endregion
- #region ** zoom
- void _btnZoom_ButtonClick(object sender, EventArgs e)
- {
- _preview.ZoomMode = _preview.ZoomMode == ZoomMode.ActualSize
- ? ZoomMode.FullPage
- : ZoomMode.ActualSize;
- }
- void _btnZoom_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
- {
- if (e.ClickedItem == _itemActualSize)
- {
- _preview.ZoomMode = ZoomMode.ActualSize;
- }
- else if (e.ClickedItem == _itemFullPage)
- {
- _preview.ZoomMode = ZoomMode.FullPage;
- }
- else if (e.ClickedItem == _itemPageWidth)
- {
- _preview.ZoomMode = ZoomMode.PageWidth;
- }
- else if (e.ClickedItem == _itemTwoPages)
- {
- _preview.ZoomMode = ZoomMode.TwoPages;
- }
- if (e.ClickedItem == _item10)
- {
- _preview.Zoom = .1;
- }
- else if (e.ClickedItem == _item100)
- {
- _preview.Zoom = 1;
- }
- else if (e.ClickedItem == _item150)
- {
- _preview.Zoom = 1.5;
- }
- else if (e.ClickedItem == _item200)
- {
- _preview.Zoom = 2;
- }
- else if (e.ClickedItem == _item25)
- {
- _preview.Zoom = .25;
- }
- else if (e.ClickedItem == _item50)
- {
- _preview.Zoom = .5;
- }
- else if (e.ClickedItem == _item500)
- {
- _preview.Zoom = 5;
- }
- else if (e.ClickedItem == _item75)
- {
- _preview.Zoom = .75;
- }
- }
- #endregion
- #region ** page navigation
- void _btnFirst_Click(object sender, EventArgs e)
- {
- _preview.StartPage = 0;
- }
- void _btnPrev_Click(object sender, EventArgs e)
- {
- _preview.StartPage--;
- }
- void _btnNext_Click(object sender, EventArgs e)
- {
- _preview.StartPage++;
- }
- void _btnLast_Click(object sender, EventArgs e)
- {
- _preview.StartPage = _preview.PageCount - 1;
- }
- void _txtStartPage_Enter(object sender, EventArgs e)
- {
- _txtStartPage.SelectAll();
- }
- void _txtStartPage_Validating(object sender, CancelEventArgs e)
- {
- CommitPageNumber();
- }
- void _txtStartPage_KeyPress(object sender, KeyPressEventArgs e)
- {
- var c = e.KeyChar;
- if (c == (char)13)
- {
- CommitPageNumber();
- e.Handled = true;
- }
- else if (c > ' ' && !char.IsDigit(c))
- {
- e.Handled = true;
- }
- }
- void CommitPageNumber()
- {
- int page;
- if (int.TryParse(_txtStartPage.Text, out page))
- {
- _preview.StartPage = page - 1;
- }
- }
- void _preview_StartPageChanged(object sender, EventArgs e)
- {
- var page = _preview.StartPage + 1;
- _txtStartPage.Text = page.ToString();
- }
- private void _preview_PageCountChanged(object sender, EventArgs e)
- {
- this.Update();
- Application.DoEvents();
- _lblPageCount.Text = string.Format("/ {0}", _preview.PageCount);
- }
- #endregion
- #region ** job control
- void _btnCancel_Click(object sender, EventArgs e)
- {
- if (_preview.IsRendering)
- {
- _preview.Cancel();
- }
- else
- {
- Close();
- }
- }
- void _doc_BeginPrint(object sender, PrintEventArgs e)
- {
- _btnCancel.Text = "取消(&C)";
- _btnPrint.Enabled = _btnPageSetup.Enabled = false;
- }
- void _doc_EndPrint(object sender, PrintEventArgs e)
- {
- _btnCancel.Text = "关闭(&C)";
- _btnPrint.Enabled = _btnPageSetup.Enabled = true;
- }
- #endregion
- }
- /// <summary>
- /// This version of the PageImageList is a simple List<Image>. It is simple,
- /// but caches one image (GDI object) per preview page.
- /// </summary>
- class PageImageList : List<Image>
- {
- }
- }
|