Exemplo n.º 1
0
        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);
        }