<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5763115508258462541</id><updated>2012-02-09T01:30:55.535-08:00</updated><title type='text'>The BinSoft Blog</title><subtitle type='html'>Welcome to my development blog. Within these posts you will find a wide variety of code samples, grips and whatever else I decide to share with you. It's my way of giving something back to the many people that have provided me with snippets and advice over the years.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://anotherdeveloper.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5763115508258462541/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://anotherdeveloper.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>David</name><uri>http://www.blogger.com/profile/17125105494896617758</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://3.bp.blogspot.com/-6h6tws3qcyc/TbIxeOFWWaI/AAAAAAAAAAQ/Q2DksRZZzkM/s220/57949_1509560393038_1655215657_1271155_1556591_n2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5763115508258462541.post-1438848394212492615</id><published>2012-01-21T07:52:00.000-08:00</published><updated>2012-01-21T07:57:09.078-08:00</updated><title type='text'>How-to Hide the .NET PrintPreviewControl's "Generating Previews" Dialog</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;strong&gt;&lt;span style="color: #38761d; font-family: Arial;"&gt;[C# - WinForms - .NET 2.0+]&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black; font-family: Arial;"&gt;&lt;span style="font-family: Times New Roman;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-family: Arial;"&gt;&lt;span style="color: black; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;I have been working on revising an old program and decided to add a Print Preview dialog to the print functionality. To my dismay the standard .NET PrintPreviewControl shows this annoying little, application-focus stealing "Generating Previews" dialog every time the PrintPreviewControl is refreshed. &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-family: Times New Roman;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;So I started searching on Google to see how to disable this little annoyance and found that there is no out-of-the-box way to disable the dialog. On top of that I saw posts from people having the same frustrations dating back to 2005. Now why Microsoft never added a ShowDialog property to this control so their users would have the option of turning this happy little feature on and off is beyond me. &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-family: Times New Roman;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;I decided that I would have to create my own control and get rid of that dialog box once and for all. Turns out this is easier said than done. I won't go into the detail of this code but it works and that pesky dialog box no longer shows up. There is a lot of reflected code in this control and I can't guarantee that it will be compatible with future versions but that's all tweakable.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-family: Times New Roman;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;Download and enjoy.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black; font-family: Arial;"&gt;&lt;br /&gt;&lt;span style="font-family: Times New Roman;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using System.Drawing.Printing;&lt;br /&gt;using System.Globalization;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using System.Security;&lt;br /&gt;using System.Security.Permissions;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Threading;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;namespace CustomControls&lt;br /&gt;{&lt;br /&gt; public class PrintControllerNoStatusDialog : PrintController&lt;br /&gt; {&lt;br /&gt;  private PrintDocument document;&lt;br /&gt;  private int pageNumber;&lt;br /&gt;  private PrintController underlyingController;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  public PrintControllerNoStatusDialog(PrintController underlyingController)&lt;br /&gt;  {&lt;br /&gt;   this.underlyingController = underlyingController;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  public override void OnEndPage(PrintDocument document, PrintPageEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   this.underlyingController.OnEndPage(document, e);&lt;br /&gt;   &lt;br /&gt;   this.pageNumber++;&lt;br /&gt;   base.OnEndPage(document, e);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public override void OnEndPrint(PrintDocument document, PrintEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   this.underlyingController.OnEndPrint(document, e);   &lt;br /&gt;   base.OnEndPrint(document, e);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public override Graphics OnStartPage(PrintDocument document, PrintPageEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   base.OnStartPage(document, e);&lt;br /&gt;   &lt;br /&gt;   Graphics graphics = this.underlyingController.OnStartPage(document, e);&lt;br /&gt;&lt;br /&gt;   return graphics;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public override void OnStartPrint(PrintDocument document, PrintEventArgs e)&lt;br /&gt;  {&lt;br /&gt;   base.OnStartPrint(document, e);&lt;br /&gt;   &lt;br /&gt;   this.document = document;&lt;br /&gt;   this.pageNumber = 1;&lt;br /&gt;  &lt;br /&gt;   try&lt;br /&gt;   {&lt;br /&gt;    this.underlyingController.OnStartPrint(document, e);&lt;br /&gt;   }&lt;br /&gt;   catch&lt;br /&gt;   {&lt;br /&gt;    throw;&lt;br /&gt;   }   &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public override bool IsPreview&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return ((this.underlyingController != null) &amp;&amp; this.underlyingController.IsPreview);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; internal class NativeMethods&lt;br /&gt; {&lt;br /&gt;  [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;  public class SCROLLINFO&lt;br /&gt;  {&lt;br /&gt;   public int cbSize;&lt;br /&gt;   public int fMask;&lt;br /&gt;   public int nMin;&lt;br /&gt;   public int nMax;&lt;br /&gt;   public int nPage;&lt;br /&gt;   public int nPos;&lt;br /&gt;   public int nTrackPos;&lt;br /&gt;&lt;br /&gt;   public SCROLLINFO()&lt;br /&gt;   {&lt;br /&gt;    this.cbSize = Marshal.SizeOf(typeof(NativeMethods.SCROLLINFO));&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;   public SCROLLINFO(int mask, int min, int max, int page, int pos)&lt;br /&gt;   {&lt;br /&gt;    this.cbSize = Marshal.SizeOf(typeof(NativeMethods.SCROLLINFO));&lt;br /&gt;    this.fMask = mask;&lt;br /&gt;    this.nMin = min;&lt;br /&gt;    this.nMax = max;&lt;br /&gt;    this.nPage = page;&lt;br /&gt;    this.nPos = pos;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;  public struct RECT&lt;br /&gt;  {&lt;br /&gt;   public int left;&lt;br /&gt;   public int top;&lt;br /&gt;   public int right;&lt;br /&gt;   public int bottom;&lt;br /&gt;&lt;br /&gt;   public RECT(int left, int top, int right, int bottom)&lt;br /&gt;   {&lt;br /&gt;    this.left = left;&lt;br /&gt;    this.top = top;&lt;br /&gt;    this.right = right;&lt;br /&gt;    this.bottom = bottom;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public RECT(Rectangle r)&lt;br /&gt;   {&lt;br /&gt;    this.left = r.Left;&lt;br /&gt;    this.top = r.Top;&lt;br /&gt;    this.right = r.Right;&lt;br /&gt;    this.bottom = r.Bottom;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static NativeMethods.RECT FromXYWH(int x, int y, int width, int height)&lt;br /&gt;   {&lt;br /&gt;    return new NativeMethods.RECT(x, y, x + width, y + height);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public Size Size&lt;br /&gt;   {&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;     return new Size(this.right - this.left, this.bottom - this.top);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  internal static class Util&lt;br /&gt;  {&lt;br /&gt;   public static int HIWORD(int n)&lt;br /&gt;   {&lt;br /&gt;    return ((n &gt;&gt; 0x10) &amp; 0xffff);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static int HIWORD(IntPtr n)&lt;br /&gt;   {&lt;br /&gt;    return HIWORD((int)((long)n));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static int LOWORD(int n)&lt;br /&gt;   {&lt;br /&gt;    return (n &amp; 0xffff);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static int LOWORD(IntPtr n)&lt;br /&gt;   {&lt;br /&gt;    return LOWORD((int)((long)n));&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; internal static class SafeNativeMethods&lt;br /&gt; {&lt;br /&gt;  [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]&lt;br /&gt;  public static extern bool GetScrollInfo(HandleRef hWnd, int fnBar, [In, Out] NativeMethods.SCROLLINFO si);&lt;br /&gt;&lt;br /&gt;  [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]&lt;br /&gt;  public static extern bool ScrollWindow(HandleRef hWnd, int nXAmount, int nYAmount, ref NativeMethods.RECT rectScrollRegion, ref NativeMethods.RECT rectClip);&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; internal static class UnsafeNativeMethods&lt;br /&gt; {&lt;br /&gt;  [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]&lt;br /&gt;  public static extern int GetDeviceCaps(HandleRef hDC, int nIndex);&lt;br /&gt;&lt;br /&gt;  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]&lt;br /&gt;  public static extern int SetScrollPos(HandleRef hWnd, int nBar, int nPos, bool bRedraw);&lt;br /&gt;&lt;br /&gt;  [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]&lt;br /&gt;  public static extern int SetScrollInfo(HandleRef hWnd, int fnBar, NativeMethods.SCROLLINFO si, bool redraw);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDispatch), DefaultProperty("Document")]&lt;br /&gt; public class PrintPreviewControl : Control&lt;br /&gt; {&lt;br /&gt;  private bool antiAlias;&lt;br /&gt;  private bool autoZoom = true;&lt;br /&gt;  private const int border = 10;&lt;br /&gt;  private int columns = 1;&lt;br /&gt;  private const double DefaultZoom = 0.3;&lt;br /&gt;  private PrintDocument document;&lt;br /&gt;  private static readonly object EVENT_STARTPAGECHANGED = new object();&lt;br /&gt;  private bool exceptionPrinting;&lt;br /&gt;  private Size imageSize = Size.Empty;&lt;br /&gt;  private Point lastOffset;&lt;br /&gt;  private bool layoutOk;&lt;br /&gt;  private PreviewPageInfo[] pageInfo;&lt;br /&gt;  private bool pageInfoCalcPending;&lt;br /&gt;  private Point position = new Point(0, 0);&lt;br /&gt;  private int rows = 1;&lt;br /&gt;  private Point screendpi = Point.Empty;&lt;br /&gt;  private const int SCROLL_LINE = 5;&lt;br /&gt;  private const int SCROLL_PAGE = 100;&lt;br /&gt;  private int startPage;&lt;br /&gt;  private Size virtualSize = new Size(1, 1);&lt;br /&gt;  private double zoom = 0.3;&lt;br /&gt;&lt;br /&gt;  public event EventHandler StartPageChanged&lt;br /&gt;  {&lt;br /&gt;   add&lt;br /&gt;   {&lt;br /&gt;    base.Events.AddHandler(EVENT_STARTPAGECHANGED, value);&lt;br /&gt;   }&lt;br /&gt;   remove&lt;br /&gt;   {&lt;br /&gt;    base.Events.RemoveHandler(EVENT_STARTPAGECHANGED, value);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]&lt;br /&gt;  public event EventHandler TextChanged&lt;br /&gt;  {&lt;br /&gt;   add&lt;br /&gt;   {&lt;br /&gt;    base.TextChanged += value;&lt;br /&gt;   }&lt;br /&gt;   remove&lt;br /&gt;   {&lt;br /&gt;    base.TextChanged -= value;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Methods&lt;br /&gt;  public PrintPreviewControl()&lt;br /&gt;  {&lt;br /&gt;   this.ResetBackColor();&lt;br /&gt;   this.ResetForeColor();&lt;br /&gt;   base.Size = new Size(100, 100);&lt;br /&gt;   base.SetStyle(ControlStyles.ResizeRedraw, false);&lt;br /&gt;   base.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.Opaque, true);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private int AdjustScroll(Message m, int pos, int maxPos, bool horizontal)&lt;br /&gt;  {&lt;br /&gt;   switch (NativeMethods.Util.LOWORD(m.WParam))&lt;br /&gt;   {&lt;br /&gt;    case 0:&lt;br /&gt;     if (pos &lt;= 5)&lt;br /&gt;     {&lt;br /&gt;      pos = 0;&lt;br /&gt;      return pos;&lt;br /&gt;     }&lt;br /&gt;     pos -= 5;&lt;br /&gt;     return pos;&lt;br /&gt;&lt;br /&gt;    case 1:&lt;br /&gt;     if (pos &gt;= (maxPos - 5))&lt;br /&gt;     {&lt;br /&gt;      pos = maxPos;&lt;br /&gt;      return pos;&lt;br /&gt;     }&lt;br /&gt;     pos += 5;&lt;br /&gt;     return pos;&lt;br /&gt;&lt;br /&gt;    case 2:&lt;br /&gt;     if (pos &lt;= 100)&lt;br /&gt;     {&lt;br /&gt;      pos = 0;&lt;br /&gt;      return pos;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     pos -= 100;&lt;br /&gt;     return pos;&lt;br /&gt;&lt;br /&gt;    case 3:&lt;br /&gt;     if (pos &gt;= (maxPos - 100))&lt;br /&gt;     {&lt;br /&gt;      pos = maxPos;&lt;br /&gt;      return pos;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     pos += 100;&lt;br /&gt;     return pos;&lt;br /&gt;&lt;br /&gt;    case 4:&lt;br /&gt;    case 5:&lt;br /&gt;     {&lt;br /&gt;      NativeMethods.SCROLLINFO si = new NativeMethods.SCROLLINFO&lt;br /&gt;      {&lt;br /&gt;       cbSize = Marshal.SizeOf(typeof(NativeMethods.SCROLLINFO)),&lt;br /&gt;       fMask = 0x10&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;      int fnBar = horizontal ? 0 : 1;&lt;br /&gt;&lt;br /&gt;      if (!SafeNativeMethods.GetScrollInfo(new HandleRef(this, m.HWnd), fnBar, si))&lt;br /&gt;      {&lt;br /&gt;       pos = NativeMethods.Util.HIWORD(m.WParam);&lt;br /&gt;       return pos;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      pos = si.nTrackPos;&lt;br /&gt;&lt;br /&gt;      return pos;&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;   return pos;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void CalculatePageInfo()&lt;br /&gt;  {&lt;br /&gt;   if (!this.pageInfoCalcPending)&lt;br /&gt;   {&lt;br /&gt;    this.pageInfoCalcPending = true;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;     if (this.pageInfo == null)&lt;br /&gt;     {&lt;br /&gt;      try&lt;br /&gt;      {&lt;br /&gt;       this.ComputePreview();&lt;br /&gt;      }&lt;br /&gt;      catch&lt;br /&gt;      {&lt;br /&gt;       this.exceptionPrinting = true;&lt;br /&gt;       throw;&lt;br /&gt;      }&lt;br /&gt;      finally&lt;br /&gt;      {&lt;br /&gt;       base.Invalidate();&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;    finally&lt;br /&gt;    {&lt;br /&gt;     this.pageInfoCalcPending = false;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void ComputeLayout()&lt;br /&gt;  {&lt;br /&gt;   this.layoutOk = true;&lt;br /&gt;&lt;br /&gt;   if (this.pageInfo.Length == 0)&lt;br /&gt;   {&lt;br /&gt;    base.ClientSize = base.Size;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    Graphics wrapper = Graphics.FromHwndInternal(this.Handle);&lt;br /&gt;    IntPtr hdc = wrapper.GetHdc();&lt;br /&gt;&lt;br /&gt;    this.screendpi = new Point(UnsafeNativeMethods.GetDeviceCaps(new HandleRef(wrapper, hdc), 0x58), UnsafeNativeMethods.GetDeviceCaps(new HandleRef(wrapper, hdc), 90));&lt;br /&gt;&lt;br /&gt;    wrapper.ReleaseHdcInternal(hdc);&lt;br /&gt;    wrapper.Dispose();&lt;br /&gt;&lt;br /&gt;    Size physicalSize = this.pageInfo[this.StartPage].PhysicalSize;&lt;br /&gt;    Size size2 = new Size(PixelsToPhysical(new Point(base.Size), this.screendpi));&lt;br /&gt;&lt;br /&gt;    if (this.autoZoom)&lt;br /&gt;    {&lt;br /&gt;     double num = (size2.Width - (10 * (this.columns + 1))) / ((double)(this.columns * physicalSize.Width));&lt;br /&gt;     double num2 = (size2.Height - (10 * (this.rows + 1))) / ((double)(this.rows * physicalSize.Height));&lt;br /&gt;&lt;br /&gt;     this.zoom = Math.Min(num, num2);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    this.imageSize = new Size((int)(this.zoom * physicalSize.Width), (int)(this.zoom * physicalSize.Height));&lt;br /&gt;&lt;br /&gt;    int x = (this.imageSize.Width * this.columns) + (10 * (this.columns + 1));&lt;br /&gt;    int y = (this.imageSize.Height * this.rows) + (10 * (this.rows + 1));&lt;br /&gt;&lt;br /&gt;    this.SetVirtualSizeNoInvalidate(new Size(PhysicalToPixels(new Point(x, y), this.screendpi)));&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void ComputePreview()&lt;br /&gt;  {&lt;br /&gt;   int startPage = this.StartPage;&lt;br /&gt;&lt;br /&gt;   if (this.document == null)&lt;br /&gt;   {&lt;br /&gt;    this.pageInfo = new PreviewPageInfo[0];&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    new PrintingPermission(PrintingPermissionLevel.SafePrinting).Demand();&lt;br /&gt;&lt;br /&gt;    PrintController printController = this.document.PrintController;&lt;br /&gt;    PreviewPrintController underlyingController = new PreviewPrintController&lt;br /&gt;    {&lt;br /&gt;     UseAntiAlias = this.UseAntiAlias&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    this.document.PrintController = new PrintControllerNoStatusDialog(underlyingController);&lt;br /&gt;    this.document.Print();&lt;br /&gt;&lt;br /&gt;    this.pageInfo = underlyingController.GetPreviewPageInfo();&lt;br /&gt;    this.document.PrintController = printController;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (startPage != this.StartPage)&lt;br /&gt;   {&lt;br /&gt;    this.OnStartPageChanged(EventArgs.Empty);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void InvalidateLayout()&lt;br /&gt;  {&lt;br /&gt;   this.layoutOk = false;&lt;br /&gt;   base.Invalidate();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void InvalidatePreview()&lt;br /&gt;  {&lt;br /&gt;   this.pageInfo = null;&lt;br /&gt;   this.InvalidateLayout();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnPaint(PaintEventArgs pevent)&lt;br /&gt;  {&lt;br /&gt;   using (Brush brush = new SolidBrush(this.BackColor))&lt;br /&gt;   {&lt;br /&gt;    if ((this.pageInfo == null) || (this.pageInfo.Length == 0))&lt;br /&gt;    {&lt;br /&gt;     pevent.Graphics.FillRectangle(brush, base.ClientRectangle);&lt;br /&gt;&lt;br /&gt;     if ((this.pageInfo != null) || this.exceptionPrinting)&lt;br /&gt;     {&lt;br /&gt;      StringFormat format = new StringFormat&lt;br /&gt;      {&lt;br /&gt;       Alignment = TranslateAlignment(ContentAlignment.MiddleCenter),&lt;br /&gt;       LineAlignment = TranslateLineAlignment(ContentAlignment.MiddleCenter)&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;      SolidBrush brush2 = new SolidBrush(this.ForeColor);&lt;br /&gt;&lt;br /&gt;      try&lt;br /&gt;      {&lt;br /&gt;       if (this.exceptionPrinting)&lt;br /&gt;       {&lt;br /&gt;        pevent.Graphics.DrawString("Document cannot be displayed.", this.Font, brush2, base.ClientRectangle, format);&lt;br /&gt;       }&lt;br /&gt;       else&lt;br /&gt;       {&lt;br /&gt;        pevent.Graphics.DrawString("Document does not contain any pages.", this.Font, brush2, base.ClientRectangle, format);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       goto Label_04D7;&lt;br /&gt;      }&lt;br /&gt;      finally&lt;br /&gt;      {&lt;br /&gt;       brush2.Dispose();&lt;br /&gt;       format.Dispose();&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     base.BeginInvoke(new MethodInvoker(this.CalculatePageInfo));&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     Point point2 = new Point();&lt;br /&gt;&lt;br /&gt;     if (!this.layoutOk)&lt;br /&gt;     {&lt;br /&gt;      this.ComputeLayout();&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     Size size = new Size(PixelsToPhysical(new Point(base.Size), this.screendpi));&lt;br /&gt;     Point point = new Point(this.VirtualSize);&lt;br /&gt;&lt;br /&gt;     point2 = new Point(Math.Max(0, (base.Size.Width - point.X) / 2), Math.Max(0, (base.Size.Height - point.Y) / 2));&lt;br /&gt;     point2.X = point2.X - this.Position.X;&lt;br /&gt;     point2.Y = point2.Y - this.Position.Y;&lt;br /&gt;&lt;br /&gt;     this.lastOffset = point2;&lt;br /&gt;&lt;br /&gt;     int num = PhysicalToPixels(10, this.screendpi.X);&lt;br /&gt;     int num2 = PhysicalToPixels(10, this.screendpi.Y);&lt;br /&gt;     Region clip = pevent.Graphics.Clip;&lt;br /&gt;     Rectangle[] rectangleArray = new Rectangle[this.rows * this.columns];&lt;br /&gt;     Point empty = Point.Empty;&lt;br /&gt;     int num3 = 0;&lt;br /&gt;&lt;br /&gt;     try&lt;br /&gt;     {&lt;br /&gt;      for (int j = 0; j &lt; this.rows; j++)&lt;br /&gt;      {&lt;br /&gt;       empty.X = 0;&lt;br /&gt;       empty.Y = num3 * j;&lt;br /&gt;&lt;br /&gt;       for (int k = 0; k &lt; this.columns; k++)&lt;br /&gt;       {&lt;br /&gt;        int index = (this.StartPage + k) + (j * this.columns);&lt;br /&gt;&lt;br /&gt;        if (index &lt; this.pageInfo.Length)&lt;br /&gt;        {&lt;br /&gt;         Size physicalSize = this.pageInfo[index].PhysicalSize;&lt;br /&gt;&lt;br /&gt;         if (this.autoZoom)&lt;br /&gt;         {&lt;br /&gt;          double num7 = (size.Width - (10 * (this.columns + 1))) / ((double)(this.columns * physicalSize.Width));&lt;br /&gt;          double num8 = (size.Height - (10 * (this.rows + 1))) / ((double)(this.rows * physicalSize.Height));&lt;br /&gt;          this.zoom = Math.Min(num7, num8);&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         this.imageSize = new Size((int)(this.zoom * physicalSize.Width), (int)(this.zoom * physicalSize.Height));&lt;br /&gt;&lt;br /&gt;         Point point4 = PhysicalToPixels(new Point(this.imageSize), this.screendpi);&lt;br /&gt;         int x = (point2.X + (num * (k + 1))) + empty.X;&lt;br /&gt;         int y = (point2.Y + (num2 * (j + 1))) + empty.Y;&lt;br /&gt;&lt;br /&gt;         empty.X += point4.X;&lt;br /&gt;         num3 = Math.Max(num3, point4.Y);&lt;br /&gt;         rectangleArray[index - this.StartPage] = new Rectangle(x, y, point4.X, point4.Y);&lt;br /&gt;&lt;br /&gt;         pevent.Graphics.ExcludeClip(rectangleArray[index - this.StartPage]);&lt;br /&gt;        }&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      pevent.Graphics.FillRectangle(brush, base.ClientRectangle);&lt;br /&gt;     }&lt;br /&gt;     finally&lt;br /&gt;     {&lt;br /&gt;      pevent.Graphics.Clip = clip;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     for (int i = 0; i &lt; rectangleArray.Length; i++)&lt;br /&gt;     {&lt;br /&gt;      if ((i + this.StartPage) &lt; this.pageInfo.Length)&lt;br /&gt;      {&lt;br /&gt;       Rectangle rect = rectangleArray[i];&lt;br /&gt;       pevent.Graphics.DrawRectangle(Pens.Black, rect);&lt;br /&gt;       pevent.Graphics.FillRectangle(new SolidBrush(this.ForeColor), rect);&lt;br /&gt;&lt;br /&gt;       rect.Inflate(-1, -1);&lt;br /&gt;&lt;br /&gt;       if (this.pageInfo[i + this.StartPage].Image != null)&lt;br /&gt;       {&lt;br /&gt;        pevent.Graphics.DrawImage(this.pageInfo[i + this.StartPage].Image, rect);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       rect.Width--;&lt;br /&gt;       rect.Height--;&lt;br /&gt;&lt;br /&gt;       pevent.Graphics.DrawRectangle(Pens.Black, rect);&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  Label_04D7:&lt;br /&gt;   base.OnPaint(pevent);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnResize(EventArgs eventargs)&lt;br /&gt;  {&lt;br /&gt;   this.InvalidateLayout();&lt;br /&gt;   base.OnResize(eventargs);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected virtual void OnStartPageChanged(EventArgs e)&lt;br /&gt;  {&lt;br /&gt;   EventHandler handler = base.Events[EVENT_STARTPAGECHANGED] as EventHandler;&lt;br /&gt;   if (handler != null)&lt;br /&gt;   {&lt;br /&gt;    handler(this, e);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private static Point PhysicalToPixels(Point physical, Point dpi)&lt;br /&gt;  {&lt;br /&gt;   return new Point(PhysicalToPixels(physical.X, dpi.X), PhysicalToPixels(physical.Y, dpi.Y));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private static Size PhysicalToPixels(Size physicalSize, Point dpi)&lt;br /&gt;  {&lt;br /&gt;   return new Size(PhysicalToPixels(physicalSize.Width, dpi.X), PhysicalToPixels(physicalSize.Height, dpi.Y));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private static int PhysicalToPixels(int physicalSize, int dpi)&lt;br /&gt;  {&lt;br /&gt;   return (int)(((double)(physicalSize * dpi)) / 100.0);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private static Point PixelsToPhysical(Point pixels, Point dpi)&lt;br /&gt;  {&lt;br /&gt;   return new Point(PixelsToPhysical(pixels.X, dpi.X), PixelsToPhysical(pixels.Y, dpi.Y));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private static Size PixelsToPhysical(Size pixels, Point dpi)&lt;br /&gt;  {&lt;br /&gt;   return new Size(PixelsToPhysical(pixels.Width, dpi.X), PixelsToPhysical(pixels.Height, dpi.Y));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private static int PixelsToPhysical(int pixels, int dpi)&lt;br /&gt;  {&lt;br /&gt;   return (int)((pixels * 100.0) / ((double)dpi));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [EditorBrowsable(EditorBrowsableState.Never)]&lt;br /&gt;  public override void ResetBackColor()&lt;br /&gt;  {&lt;br /&gt;   this.BackColor = SystemColors.AppWorkspace;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [EditorBrowsable(EditorBrowsableState.Never)]&lt;br /&gt;  public override void ResetForeColor()&lt;br /&gt;  {&lt;br /&gt;   this.ForeColor = Color.White;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void SetPositionNoInvalidate(Point value)&lt;br /&gt;  {&lt;br /&gt;   Point position = this.position;&lt;br /&gt;&lt;br /&gt;   this.position = value;&lt;br /&gt;   this.position.X = Math.Min(this.position.X, this.virtualSize.Width - base.Width);&lt;br /&gt;   this.position.Y = Math.Min(this.position.Y, this.virtualSize.Height - base.Height);&lt;br /&gt;&lt;br /&gt;   if (this.position.X &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    this.position.X = 0;&lt;br /&gt;   }&lt;br /&gt;   if (this.position.Y &lt; 0)&lt;br /&gt;   {&lt;br /&gt;    this.position.Y = 0;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   Rectangle clientRectangle = base.ClientRectangle;&lt;br /&gt;&lt;br /&gt;   NativeMethods.RECT rectScrollRegion = NativeMethods.RECT.FromXYWH(clientRectangle.X, clientRectangle.Y, clientRectangle.Width, clientRectangle.Height);&lt;br /&gt;   SafeNativeMethods.ScrollWindow(new HandleRef(this, base.Handle), position.X - this.position.X, position.Y - this.position.Y, ref rectScrollRegion, ref rectScrollRegion);&lt;br /&gt;   UnsafeNativeMethods.SetScrollPos(new HandleRef(this, base.Handle), 0, this.position.X, true);&lt;br /&gt;   UnsafeNativeMethods.SetScrollPos(new HandleRef(this, base.Handle), 1, this.position.Y, true);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  internal void SetVirtualSizeNoInvalidate(Size value)&lt;br /&gt;  {&lt;br /&gt;   this.virtualSize = value;&lt;br /&gt;   this.SetPositionNoInvalidate(this.position);&lt;br /&gt;&lt;br /&gt;   NativeMethods.SCROLLINFO si = new NativeMethods.SCROLLINFO&lt;br /&gt;   {&lt;br /&gt;    fMask = 3,&lt;br /&gt;    nMin = 0,&lt;br /&gt;    nMax = Math.Max(base.Height, this.virtualSize.Height) - 1,&lt;br /&gt;    nPage = base.Height&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   UnsafeNativeMethods.SetScrollInfo(new HandleRef(this, base.Handle), 1, si, true);&lt;br /&gt;&lt;br /&gt;   si.fMask = 3;&lt;br /&gt;   si.nMin = 0;&lt;br /&gt;   si.nMax = Math.Max(base.Width, this.virtualSize.Width) - 1;&lt;br /&gt;   si.nPage = base.Width;&lt;br /&gt;&lt;br /&gt;   UnsafeNativeMethods.SetScrollInfo(new HandleRef(this, base.Handle), 0, si, true);&lt;br /&gt;  }&lt;br /&gt;    &lt;br /&gt;  private void WmHScroll(ref Message m)&lt;br /&gt;  {&lt;br /&gt;   if (m.LParam != IntPtr.Zero)&lt;br /&gt;   {&lt;br /&gt;    base.WndProc(ref m);&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    Point position = this.position;&lt;br /&gt;    int x = position.X;&lt;br /&gt;    int maxPos = Math.Max(base.Width, this.virtualSize.Width);&lt;br /&gt;    position.X = this.AdjustScroll(m, x, maxPos, true);&lt;br /&gt;    this.Position = position;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void WmKeyDown(ref Message msg)&lt;br /&gt;  {&lt;br /&gt;   Keys keys = ((Keys)((int)msg.WParam)) | Control.ModifierKeys;&lt;br /&gt;   Point position = this.Position;&lt;br /&gt;   int x = 0;&lt;br /&gt;   int num2 = 0;&lt;br /&gt;   switch ((keys &amp; Keys.KeyCode))&lt;br /&gt;   {&lt;br /&gt;    case Keys.Prior:&lt;br /&gt;     if ((keys &amp; ~Keys.KeyCode) != Keys.Control)&lt;br /&gt;     {&lt;br /&gt;      if (this.StartPage &gt; 0)&lt;br /&gt;      {&lt;br /&gt;       this.StartPage--;&lt;br /&gt;      }&lt;br /&gt;      return;&lt;br /&gt;     }&lt;br /&gt;     x = position.X;&lt;br /&gt;     if (x &lt;= 100)&lt;br /&gt;     {&lt;br /&gt;      x = 0;&lt;br /&gt;      break;&lt;br /&gt;     }&lt;br /&gt;     x -= 100;&lt;br /&gt;     break;&lt;br /&gt;&lt;br /&gt;    case Keys.Next:&lt;br /&gt;     if ((keys &amp; ~Keys.KeyCode) != Keys.Control)&lt;br /&gt;     {&lt;br /&gt;      if (this.StartPage &lt; this.pageInfo.Length)&lt;br /&gt;      {&lt;br /&gt;       this.StartPage++;&lt;br /&gt;      }&lt;br /&gt;      return;&lt;br /&gt;     }&lt;br /&gt;     x = position.X;&lt;br /&gt;     num2 = Math.Max(base.Width, this.virtualSize.Width);&lt;br /&gt;     if (x &gt;= (num2 - 100))&lt;br /&gt;     {&lt;br /&gt;      x = num2;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;      x += 100;&lt;br /&gt;     }&lt;br /&gt;     position.X = x;&lt;br /&gt;     this.Position = position;&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case Keys.End:&lt;br /&gt;     if ((keys &amp; ~Keys.KeyCode) == Keys.Control)&lt;br /&gt;     {&lt;br /&gt;      this.StartPage = this.pageInfo.Length;&lt;br /&gt;     }&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case Keys.Home:&lt;br /&gt;     if ((keys &amp; ~Keys.KeyCode) == Keys.Control)&lt;br /&gt;     {&lt;br /&gt;      this.StartPage = 0;&lt;br /&gt;     }&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case Keys.Left:&lt;br /&gt;     x = position.X;&lt;br /&gt;     if (x &lt;= 5)&lt;br /&gt;     {&lt;br /&gt;      x = 0;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;      x -= 5;&lt;br /&gt;     }&lt;br /&gt;     position.X = x;&lt;br /&gt;     this.Position = position;&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case Keys.Up:&lt;br /&gt;     x = position.Y;&lt;br /&gt;     if (x &lt;= 5)&lt;br /&gt;     {&lt;br /&gt;      x = 0;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;      x -= 5;&lt;br /&gt;     }&lt;br /&gt;     position.Y = x;&lt;br /&gt;     this.Position = position;&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case Keys.Right:&lt;br /&gt;     x = position.X;&lt;br /&gt;     num2 = Math.Max(base.Width, this.virtualSize.Width);&lt;br /&gt;     if (x &gt;= (num2 - 5))&lt;br /&gt;     {&lt;br /&gt;      x = num2;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;      x += 5;&lt;br /&gt;     }&lt;br /&gt;     position.X = x;&lt;br /&gt;     this.Position = position;&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case Keys.Down:&lt;br /&gt;     x = position.Y;&lt;br /&gt;     num2 = Math.Max(base.Height, this.virtualSize.Height);&lt;br /&gt;     if (x &gt;= (num2 - 5))&lt;br /&gt;     {&lt;br /&gt;      x = num2;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;      x += 5;&lt;br /&gt;     }&lt;br /&gt;     position.Y = x;&lt;br /&gt;     this.Position = position;&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    default:&lt;br /&gt;     return;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   position.X = x;&lt;br /&gt;   this.Position = position;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void WmVScroll(ref Message m)&lt;br /&gt;  {&lt;br /&gt;   if (m.LParam != IntPtr.Zero)&lt;br /&gt;   {&lt;br /&gt;    base.WndProc(ref m);&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    Point position = this.Position;&lt;br /&gt;    int y = position.Y;&lt;br /&gt;    int maxPos = Math.Max(base.Height, this.virtualSize.Height);&lt;br /&gt;&lt;br /&gt;    position.Y = this.AdjustScroll(m, y, maxPos, false);&lt;br /&gt;&lt;br /&gt;    this.Position = position;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]&lt;br /&gt;  protected override void WndProc(ref Message m)&lt;br /&gt;  {&lt;br /&gt;   switch (m.Msg)&lt;br /&gt;   {&lt;br /&gt;    case 0x114:&lt;br /&gt;     this.WmHScroll(ref m);&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case 0x115:&lt;br /&gt;     this.WmVScroll(ref m);&lt;br /&gt;     return;&lt;br /&gt;&lt;br /&gt;    case 0x100:&lt;br /&gt;     this.WmKeyDown(ref m);&lt;br /&gt;     return;&lt;br /&gt;   }&lt;br /&gt;   base.WndProc(ref m);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DefaultValue(true)]&lt;br /&gt;  public bool AutoZoom&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.autoZoom;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    if (this.autoZoom != value)&lt;br /&gt;    {&lt;br /&gt;     this.autoZoom = value;&lt;br /&gt;     this.InvalidateLayout();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DefaultValue(1)]&lt;br /&gt;  public int Columns&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.columns;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    if (value &lt; 1)&lt;br /&gt;    {&lt;br /&gt;     object[] args = new object[] { "Columns", value.ToString(CultureInfo.CurrentCulture), 1.ToString(CultureInfo.CurrentCulture) };&lt;br /&gt;     throw new ArgumentOutOfRangeException("Columns", String.Format("InvalidLowBoundArgument=Value of '{1}' is not valid for '{0}'. '{0}' must be greater than {2}.", args));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    this.columns = value;&lt;br /&gt;    this.InvalidateLayout();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override CreateParams CreateParams&lt;br /&gt;  {&lt;br /&gt;   [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    CreateParams createParams = base.CreateParams;&lt;br /&gt;    createParams.Style |= 0x100000;&lt;br /&gt;    createParams.Style |= 0x200000;&lt;br /&gt;    return createParams;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DefaultValue((string)null)]&lt;br /&gt;  public PrintDocument Document&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.document;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    this.document = value;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false)]&lt;br /&gt;  private Point Position&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.position;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    this.SetPositionNoInvalidate(value);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [AmbientValue(2), Localizable(true)]&lt;br /&gt;  public override RightToLeft RightToLeft&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return base.RightToLeft;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    base.RightToLeft = value;&lt;br /&gt;    this.InvalidatePreview();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DefaultValue(1)]&lt;br /&gt;  public int Rows&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.rows;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    if (value &lt; 1)&lt;br /&gt;    {&lt;br /&gt;     object[] args = new object[] { "Rows", value.ToString(CultureInfo.CurrentCulture), 1.ToString(CultureInfo.CurrentCulture) };&lt;br /&gt;     throw new ArgumentOutOfRangeException("Rows", String.Format("InvalidLowBoundArgumentEx=Value of '{1}' is not valid for '{0}'. '{0}' must be greater than or equal to {2}.", args));&lt;br /&gt;    }&lt;br /&gt;    this.rows = value;&lt;br /&gt;    this.InvalidateLayout();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DefaultValue(0)]&lt;br /&gt;  public int StartPage&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    int startPage = this.startPage;&lt;br /&gt;&lt;br /&gt;    if (this.pageInfo != null)&lt;br /&gt;    {&lt;br /&gt;     startPage = Math.Min(startPage, this.pageInfo.Length - (this.rows * this.columns));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return Math.Max(startPage, 0);&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    if (value &lt; 0)&lt;br /&gt;    {&lt;br /&gt;     object[] args = new object[] { "StartPage", value.ToString(CultureInfo.CurrentCulture), 0.ToString(CultureInfo.CurrentCulture) };&lt;br /&gt;     throw new ArgumentOutOfRangeException("StartPage", String.Format("InvalidLowBoundArgumentEx=Value of '{1}' is not valid for '{0}'. '{0}' must be greater than or equal to {2}.", args));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    int startPage = this.StartPage;&lt;br /&gt;    this.startPage = value;&lt;br /&gt;&lt;br /&gt;    if (startPage != this.startPage)&lt;br /&gt;    {&lt;br /&gt;     this.InvalidateLayout();&lt;br /&gt;     this.OnStartPageChanged(EventArgs.Empty);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [Bindable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]&lt;br /&gt;  public override string Text&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return base.Text;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    base.Text = value;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DefaultValue(false)]&lt;br /&gt;  public bool UseAntiAlias&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.antiAlias;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    this.antiAlias = value;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false)]&lt;br /&gt;  private Size VirtualSize&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.virtualSize;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    this.SetVirtualSizeNoInvalidate(value);&lt;br /&gt;    base.Invalidate();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  [DefaultValue((double)0.3)]&lt;br /&gt;  public double Zoom&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    return this.zoom;&lt;br /&gt;   }&lt;br /&gt;   set&lt;br /&gt;   {&lt;br /&gt;    if (value &lt;= 0.0)&lt;br /&gt;    {&lt;br /&gt;     throw new ArgumentException("PrintPreviewControlZoomNegative=Zoom must be 0 or greater. Negative values are not permitted.");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    this.autoZoom = false;&lt;br /&gt;    this.zoom = value;&lt;br /&gt;&lt;br /&gt;    this.InvalidateLayout();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  private static ContentAlignment anyRight = ContentAlignment.BottomRight | ContentAlignment.MiddleRight | ContentAlignment.TopRight;&lt;br /&gt;  private static ContentAlignment anyBottom = ContentAlignment.BottomRight | ContentAlignment.BottomCenter | ContentAlignment.BottomLeft;&lt;br /&gt;  private static ContentAlignment anyCenter = ContentAlignment.BottomCenter | ContentAlignment.MiddleCenter | ContentAlignment.TopCenter;&lt;br /&gt;  private static ContentAlignment anyMiddle = ContentAlignment.MiddleRight | ContentAlignment.MiddleCenter | ContentAlignment.MiddleLeft;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;  internal static StringAlignment TranslateAlignment(ContentAlignment align)&lt;br /&gt;  {&lt;br /&gt;   if ((align &amp; anyRight) != ((ContentAlignment)0))&lt;br /&gt;   {&lt;br /&gt;    return StringAlignment.Far;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if ((align &amp; anyCenter) != ((ContentAlignment)0))&lt;br /&gt;   {&lt;br /&gt;    return StringAlignment.Center;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return StringAlignment.Near;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  internal static StringAlignment TranslateLineAlignment(ContentAlignment align)&lt;br /&gt;  {&lt;br /&gt;   if ((align &amp; anyBottom) != ((ContentAlignment)0))&lt;br /&gt;   {&lt;br /&gt;    return StringAlignment.Far;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if ((align &amp; anyMiddle) != ((ContentAlignment)0))&lt;br /&gt;   {&lt;br /&gt;    return StringAlignment.Center;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return StringAlignment.Near;&lt;br /&gt;  } &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5763115508258462541-1438848394212492615?l=anotherdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anotherdeveloper.blogspot.com/feeds/1438848394212492615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://anotherdeveloper.blogspot.com/2012/01/how-to-hide-net-printpreviewcontrols.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5763115508258462541/posts/default/1438848394212492615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5763115508258462541/posts/default/1438848394212492615'/><link rel='alternate' type='text/html' href='http://anotherdeveloper.blogspot.com/2012/01/how-to-hide-net-printpreviewcontrols.html' title='How-to Hide the .NET PrintPreviewControl&apos;s &quot;Generating Previews&quot; Dialog'/><author><name>David</name><uri>http://www.blogger.com/profile/17125105494896617758</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://3.bp.blogspot.com/-6h6tws3qcyc/TbIxeOFWWaI/AAAAAAAAAAQ/Q2DksRZZzkM/s220/57949_1509560393038_1655215657_1271155_1556591_n2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5763115508258462541.post-1101379919693060132</id><published>2011-04-23T08:33:00.000-07:00</published><updated>2011-04-23T09:13:21.411-07:00</updated><title type='text'>A New Way to Disable a Form's Controls</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="color: #38761d; font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;&lt;strong&gt;[C# - WinForms]&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;I was working on a new project and I came across a re-occurring problem that has always annoyed the crap out of me; disabling all of the controls on a form when an operation is working in the background. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;None of these standard methods really worked for me:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;1) Form.Enabled = false&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;This not only causes all of the controls to be disabled but it also completely disabled the form and, most importantly,&amp;nbsp;the ability to close the form.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;2) Looping each control and disabling it&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;Not too bad but I was using themed controls on my form and some of them looked horrible when disabled. This was not going to work either.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;3) Extending the Form class and disabling mouse and keyboard input when needed.&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;This wouldn't work because I needed, at the minimum, mouse input to cancel the background operation. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;So, I decided to do something different. I created a custom control based off&amp;nbsp;the Panel control to overlay the portion of the screen that I wanted "disabled" and made it take a quick snapshot of the screen underneath when it rendered.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;I simply dropped the panel on my form,&amp;nbsp;covered the area that I wanted to disable during the background operation, sent the panel to the back of the control hierarchy and set the visibility to false. Then, in my button's onclick event, I enabled the form's wait cursor and simply brought the panel to the front and turned the visibility on.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;this.UseWaitCursor = true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;transparentPanel1.BringToFront();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;transparentPanel1.Visible = true;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;It worked great! I now have an easy way to disable my form without changing the appearance or writing a ton of code to disable and re-enable&amp;nbsp;all of&amp;nbsp;the controls.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;Here is the code for the TransparentPanel&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;using System;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using System.Drawing.Drawing2D;&lt;br /&gt;using System.Drawing.Text;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;public partial class TransparentPanel : Panel&lt;br /&gt;{   &lt;br /&gt;&lt;br /&gt; public TransparentPanel()&lt;br /&gt; {&lt;br /&gt;  InitializeComponent();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public TransparentPanel(IContainer container)&lt;br /&gt; {&lt;br /&gt;  container.Add(this);&lt;br /&gt;&lt;br /&gt;  InitializeComponent();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt; protected override void OnPaintBackground(PaintEventArgs e)&lt;br /&gt; {&lt;br /&gt;  Bitmap bgCache = new Bitmap(this.Width, this.Height);&lt;br /&gt;&lt;br /&gt;  using (Graphics g = Graphics.FromImage(bgCache))&lt;br /&gt;  {&lt;br /&gt;   if (this.Parent == null || this.DesignMode)&lt;br /&gt;   {&lt;br /&gt;    //No parent or the control is in the designer.&lt;br /&gt;    //Just paint the control normally&lt;br /&gt;    g.FillRectangle(SystemBrushes.Control, 0, 0, this.Width, this.Height);&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    Point p2 = this.Parent.PointToScreen(this.Location);&lt;br /&gt;    g.CopyFromScreen(p2.X, p2.Y, 0, 0, new Size(this.Width, this.Height));&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  e.Graphics.SmoothingMode = SmoothingMode.HighQuality;&lt;br /&gt;  e.Graphics.CompositingQuality = CompositingQuality.HighQuality;&lt;br /&gt;  e.Graphics.InterpolationMode = InterpolationMode.High;&lt;br /&gt;  e.Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;&lt;br /&gt;&lt;br /&gt;  e.Graphics.DrawImage(bgCache, 0, 0);   &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5763115508258462541-1101379919693060132?l=anotherdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anotherdeveloper.blogspot.com/feeds/1101379919693060132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://anotherdeveloper.blogspot.com/2011/04/c-winforms-disable-forms-with-fake.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5763115508258462541/posts/default/1101379919693060132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5763115508258462541/posts/default/1101379919693060132'/><link rel='alternate' type='text/html' href='http://anotherdeveloper.blogspot.com/2011/04/c-winforms-disable-forms-with-fake.html' title='A New Way to Disable a Form&apos;s Controls'/><author><name>David</name><uri>http://www.blogger.com/profile/17125105494896617758</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://3.bp.blogspot.com/-6h6tws3qcyc/TbIxeOFWWaI/AAAAAAAAAAQ/Q2DksRZZzkM/s220/57949_1509560393038_1655215657_1271155_1556591_n2.jpg'/></author><thr:total>0</thr:total></entry></feed>
