Exemple #1
0
        void LoadPrinterPaperSizes(string printer, PrinterSettings settings)
        {
            int    items, ret;
            IntPtr ptr_names, buff_names = IntPtr.Zero;
            IntPtr ptr_sizes, buff_sizes = IntPtr.Zero;
            IntPtr ptr_sizes_enum, buff_sizes_enum = IntPtr.Zero;
            string name;

            if (settings.PaperSizes == null)
            {
                settings.paper_sizes = new PrinterSettings.PaperSizeCollection(new PaperSize [0]);
            }
            else
            {
                settings.PaperSizes.Clear();
            }

            items = Win32DeviceCapabilities(printer, null, DCCapabilities.DC_PAPERSIZE, IntPtr.Zero, IntPtr.Zero);

            if (items == -1)
            {
                return;
            }

            try {
                ptr_sizes      = buff_sizes = Marshal.AllocHGlobal(items * 2 * 4);
                ptr_names      = buff_names = Marshal.AllocHGlobal(items * 64 * 2);
                ptr_sizes_enum = buff_sizes_enum = Marshal.AllocHGlobal(items * 2);
                ret            = Win32DeviceCapabilities(printer, null, DCCapabilities.DC_PAPERSIZE, buff_sizes, IntPtr.Zero);

                if (ret == -1)
                {
                    // the finally clause will free the unmanaged memory before returning
                    return;
                }

                ret = Win32DeviceCapabilities(printer, null, DCCapabilities.DC_PAPERS, buff_sizes_enum, IntPtr.Zero);
                ret = Win32DeviceCapabilities(printer, null, DCCapabilities.DC_PAPERNAMES, buff_names, IntPtr.Zero);

                int       x, y;
                PaperSize ps;
                PaperKind kind;
                for (int i = 0; i < ret; i++)
                {
                    x = Marshal.ReadInt32(ptr_sizes, i * 8);
                    y = Marshal.ReadInt32(ptr_sizes, (i * 8) + 4);

                    x = PrinterUnitConvert.Convert(x, PrinterUnit.TenthsOfAMillimeter,
                                                   PrinterUnit.Display);

                    y = PrinterUnitConvert.Convert(y, PrinterUnit.TenthsOfAMillimeter,
                                                   PrinterUnit.Display);

                    name      = Marshal.PtrToStringUni(ptr_names);
                    ptr_names = new IntPtr(ptr_names.ToInt64() + 64 * 2);

                    kind           = (PaperKind)Marshal.ReadInt16(ptr_sizes_enum);
                    ptr_sizes_enum = new IntPtr(ptr_sizes_enum.ToInt64() + 2);

                    ps = new PaperSize(name, x, y);
                    ps.SetKind(kind);
                    settings.PaperSizes.Add(ps);
                }
            }
            finally {
                if (buff_names != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(buff_names);
                }
                if (buff_sizes != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(buff_sizes);
                }
                if (buff_sizes_enum != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(buff_sizes_enum);
                }
            }
        }
 // used by PrinterSettings.DefaultPageSettings
 internal PageSettings(PrinterSettings printerSettings, bool color, bool landscape, PaperSize paperSize, PaperSource paperSource, PrinterResolution printerResolution)
 {
     PrinterSettings        = printerSettings;
     this.color             = color;
     this.landscape         = landscape;
     this.paperSize         = paperSize;
     this.paperSource       = paperSource;
     this.printerResolution = printerResolution;
 }