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 { /// /// Represents a dialog containing a control /// used to preview and print objects. /// /// /// This dialog is similar to the standard /// but provides additional options such printer and page setup buttons, /// a better UI based on the control, and built-in /// PDF export. /// public partial class CoolPrintPreviewDialog : DevExpress.XtraEditors.XtraForm { PrintDocument _doc; /// /// Initializes a new instance of a . /// public CoolPrintPreviewDialog() : this(null) { } /// /// Initializes a new instance of a . /// /// Parent form that defines the initial size for this dialog. public CoolPrintPreviewDialog(Control parentForm) { InitializeComponent(); if (parentForm != null) { Size = parentForm.Size; } } /// /// Gets or sets the to preview. /// 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 /// /// Overridden to assign document to preview control only after the /// initial activation. /// /// that contains the event data. protected override void OnShown(EventArgs e) { base.OnShown(e); _preview.Document = Document; } /// /// Overridden to cancel any ongoing previews when closing form. /// /// that contains the event data. 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 } /// /// This version of the PageImageList is a simple List. It is simple, /// but caches one image (GDI object) per preview page. /// class PageImageList : List { } }