protected override bool RunDialog(IntPtr hwndOwner) { NativeMethods.WndProc hookProcPtr = new NativeMethods.WndProc(HookProc); if (pageSettings == null) { throw new ArgumentException(SR.PSDcantShowWithoutPage); } NativeMethods.PAGESETUPDLG data = new NativeMethods.PAGESETUPDLG(); data.lStructSize = Marshal.SizeOf(data); data.Flags = GetFlags(); data.hwndOwner = hwndOwner; data.lpfnPageSetupHook = hookProcPtr; PrinterUnit toUnit = PrinterUnit.ThousandthsOfAnInch; // Below was a breaking change from RTM and EVERETT even though this was a correct FIX. // EnableMetric is a new Whidbey property which we allow the users to choose between the AutoConversion or not. if (EnableMetric) { //take the Units of Measurement while determining the PrinterUnits... // StringBuilder sb = new StringBuilder(2); int result = UnsafeNativeMethods.GetLocaleInfo(NativeMethods.LOCALE_USER_DEFAULT, NativeMethods.LOCALE_IMEASURE, sb, sb.Capacity); if (result > 0 && int.Parse(sb.ToString(), CultureInfo.InvariantCulture) == 0) { toUnit = PrinterUnit.HundredthsOfAMillimeter; } } if (MinMargins != null) { Margins margins = PrinterUnitConvert.Convert(MinMargins, PrinterUnit.Display, toUnit); data.minMarginLeft = margins.Left; data.minMarginTop = margins.Top; data.minMarginRight = margins.Right; data.minMarginBottom = margins.Bottom; } if (pageSettings.Margins != null) { Margins margins = PrinterUnitConvert.Convert(pageSettings.Margins, PrinterUnit.Display, toUnit); data.marginLeft = margins.Left; data.marginTop = margins.Top; data.marginRight = margins.Right; data.marginBottom = margins.Bottom; } // Ensure that the margins are >= minMargins. // This is a requirement of the PAGESETUPDLG structure. // data.marginLeft = Math.Max(data.marginLeft, data.minMarginLeft); data.marginTop = Math.Max(data.marginTop, data.minMarginTop); data.marginRight = Math.Max(data.marginRight, data.minMarginRight); data.marginBottom = Math.Max(data.marginBottom, data.minMarginBottom); PrinterSettings printer = printerSettings ?? pageSettings.PrinterSettings; data.hDevMode = printer.GetHdevmode(pageSettings); data.hDevNames = printer.GetHdevnames(); try { bool status = UnsafeNativeMethods.PageSetupDlg(data); if (!status) { // Debug.WriteLine(Windows.CommonDialogErrorToString(Windows.CommDlgExtendedError())); return(false); } UpdateSettings(data, pageSettings, printerSettings); // yes, printerSettings, not printer return(true); } finally { UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevMode)); UnsafeNativeMethods.GlobalFree(new HandleRef(data, data.hDevNames)); } }
protected override bool RunDialog(IntPtr hwndOwner) { System.Windows.Forms.NativeMethods.PAGESETUPDLG pagesetupdlg; bool flag2; System.Windows.Forms.IntSecurity.SafePrinting.Demand(); System.Windows.Forms.NativeMethods.WndProc proc = new System.Windows.Forms.NativeMethods.WndProc(this.HookProc); if (this.pageSettings == null) { throw new ArgumentException(System.Windows.Forms.SR.GetString("PSDcantShowWithoutPage")); } pagesetupdlg = new System.Windows.Forms.NativeMethods.PAGESETUPDLG { lStructSize = Marshal.SizeOf(pagesetupdlg), Flags = this.GetFlags(), hwndOwner = hwndOwner, lpfnPageSetupHook = proc }; PrinterUnit thousandthsOfAnInch = PrinterUnit.ThousandthsOfAnInch; if (this.EnableMetric) { StringBuilder lpLCData = new StringBuilder(2); if ((UnsafeNativeMethods.GetLocaleInfo(System.Windows.Forms.NativeMethods.LOCALE_USER_DEFAULT, 13, lpLCData, lpLCData.Capacity) > 0) && (int.Parse(lpLCData.ToString(), CultureInfo.InvariantCulture) == 0)) { thousandthsOfAnInch = PrinterUnit.HundredthsOfAMillimeter; } } if (this.MinMargins != null) { Margins margins = PrinterUnitConvert.Convert(this.MinMargins, PrinterUnit.Display, thousandthsOfAnInch); pagesetupdlg.minMarginLeft = margins.Left; pagesetupdlg.minMarginTop = margins.Top; pagesetupdlg.minMarginRight = margins.Right; pagesetupdlg.minMarginBottom = margins.Bottom; } if (this.pageSettings.Margins != null) { Margins margins2 = PrinterUnitConvert.Convert(this.pageSettings.Margins, PrinterUnit.Display, thousandthsOfAnInch); pagesetupdlg.marginLeft = margins2.Left; pagesetupdlg.marginTop = margins2.Top; pagesetupdlg.marginRight = margins2.Right; pagesetupdlg.marginBottom = margins2.Bottom; } pagesetupdlg.marginLeft = Math.Max(pagesetupdlg.marginLeft, pagesetupdlg.minMarginLeft); pagesetupdlg.marginTop = Math.Max(pagesetupdlg.marginTop, pagesetupdlg.minMarginTop); pagesetupdlg.marginRight = Math.Max(pagesetupdlg.marginRight, pagesetupdlg.minMarginRight); pagesetupdlg.marginBottom = Math.Max(pagesetupdlg.marginBottom, pagesetupdlg.minMarginBottom); System.Drawing.Printing.PrinterSettings settings = (this.printerSettings == null) ? this.pageSettings.PrinterSettings : this.printerSettings; System.Windows.Forms.IntSecurity.AllPrintingAndUnmanagedCode.Assert(); try { pagesetupdlg.hDevMode = settings.GetHdevmode(this.pageSettings); pagesetupdlg.hDevNames = settings.GetHdevnames(); } finally { CodeAccessPermission.RevertAssert(); } try { if (!UnsafeNativeMethods.PageSetupDlg(pagesetupdlg)) { return(false); } UpdateSettings(pagesetupdlg, this.pageSettings, this.printerSettings); flag2 = true; } finally { UnsafeNativeMethods.GlobalFree(new HandleRef(pagesetupdlg, pagesetupdlg.hDevMode)); UnsafeNativeMethods.GlobalFree(new HandleRef(pagesetupdlg, pagesetupdlg.hDevNames)); } return(flag2); }