Beispiel #1
0
        public unsafe void PRINTDLGW_32_ensure_layout()
        {
            PRINTDLGW_32 sut  = new PRINTDLGW_32();
            byte *       addr = (byte *)&sut;

            Assert.Equal(0, (byte *)&sut._lStructSize - addr);           // 4, DWORD
            Assert.Equal(4, (byte *)&sut._hwndOwner - addr);             // 4, HWND
            Assert.Equal(8, (byte *)&sut._hDevMode - addr);              // 4, HGLOBAL
            Assert.Equal(12, (byte *)&sut._hDevNames - addr);            // 4, HGLOBAL
            Assert.Equal(16, (byte *)&sut._hDC - addr);                  // 4, HDC
            Assert.Equal(20, (byte *)&sut._flags - addr);                // 4, DWORD
            Assert.Equal(24, (byte *)&sut._nFromPage - addr);            // 2, WORD
            Assert.Equal(26, (byte *)&sut._nToPage - addr);              // 2, WORD
            Assert.Equal(28, (byte *)&sut._nMinPage - addr);             // 2, WORD
            Assert.Equal(30, (byte *)&sut._nMaxPage - addr);             // 2, WORD
            Assert.Equal(32, (byte *)&sut._nCopies - addr);              // 2, WORD
            Assert.Equal(34, (byte *)&sut._hInstance - addr);            // 4, HINSTANCE
            Assert.Equal(38, (byte *)&sut._lCustData - addr);            // 4, LPARAM
            Assert.Equal(42, (byte *)&sut._lpfnPrintHook - addr);        // 4, LPPRINTHOOKPROC
            Assert.Equal(46, (byte *)&sut._lpfnSetupHook - addr);        // 4, LPSETUPHOOKPROC
            Assert.Equal(50, (byte *)&sut._lpPrintTemplateName - addr);  // 4, LPCWSTR
            Assert.Equal(54, (byte *)&sut._lpSetupTemplateName - addr);  // 4, LPCWSTR
            Assert.Equal(58, (byte *)&sut._hPrintTemplate - addr);       // 4, HGLOBAL
            Assert.Equal(62, (byte *)&sut._hSetupTemplate - addr);       // 4, HGLOBAL
        }
Beispiel #2
0
        private unsafe bool ShowPrintDialog(IntPtr hwndOwner)
        {
            PRINTDLGW data;

            if (IntPtr.Size == 4)
            {
                data = new PRINTDLGW_32
                {
                    lStructSize = (uint)sizeof(PRINTDLGW_32)
                };
            }
            else
            {
                data = new PRINTDLGW_64
                {
                    lStructSize = (uint)sizeof(PRINTDLGW_64)
                };
            }

            data.nFromPage = 1;
            data.nToPage   = 1;
            data.nMinPage  = 0;
            data.nMaxPage  = 9999;
            data.Flags     = GetFlags();
            data.nCopies   = (ushort)PrinterSettings.Copies;
            data.hwndOwner = hwndOwner;

            User32.WNDPROCINT wndproc = new User32.WNDPROCINT(HookProc);
            data.lpfnPrintHook = Marshal.GetFunctionPointerForDelegate(wndproc);

            try
            {
                if (PageSettings is null)
                {
                    data.hDevMode = PrinterSettings.GetHdevmode();
                }
                else
                {
                    data.hDevMode = PrinterSettings.GetHdevmode(PageSettings);
                }

                data.hDevNames = PrinterSettings.GetHdevnames();
            }
            catch (InvalidPrinterException)
            {
                // Leave those fields null; Windows will fill them in
                data.hDevMode  = IntPtr.Zero;
                data.hDevNames = IntPtr.Zero;
            }

            try
            {
                // Windows doesn't like it if page numbers are invalid
                if (AllowSomePages)
                {
                    if (PrinterSettings.FromPage < PrinterSettings.MinimumPage ||
                        PrinterSettings.FromPage > PrinterSettings.MaximumPage)
                    {
                        throw new ArgumentException(string.Format(SR.PDpageOutOfRange, "FromPage"));
                    }

                    if (PrinterSettings.ToPage < PrinterSettings.MinimumPage ||
                        PrinterSettings.ToPage > PrinterSettings.MaximumPage)
                    {
                        throw new ArgumentException(string.Format(SR.PDpageOutOfRange, "ToPage"));
                    }

                    if (PrinterSettings.ToPage < PrinterSettings.FromPage)
                    {
                        throw new ArgumentException(string.Format(SR.PDpageOutOfRange, "FromPage"));
                    }

                    data.nFromPage = (ushort)PrinterSettings.FromPage;
                    data.nToPage   = (ushort)PrinterSettings.ToPage;
                    data.nMinPage  = (ushort)PrinterSettings.MinimumPage;
                    data.nMaxPage  = (ushort)PrinterSettings.MaximumPage;
                }

                if (PrintDlg(ref data).IsFalse())
                {
                    var result = CommDlgExtendedError();
                    return(false);
                }

                UpdatePrinterSettings(data.hDevMode, data.hDevNames, (short)data.nCopies, data.Flags, settings, PageSettings);

                PrintToFile = (data.Flags & PD.PRINTTOFILE) != 0;
                PrinterSettings.PrintToFile = PrintToFile;

                if (AllowSomePages)
                {
                    PrinterSettings.FromPage = data.nFromPage;
                    PrinterSettings.ToPage   = data.nToPage;
                }

                // When the flag PD_USEDEVMODECOPIESANDCOLLATE is not set,
                // PRINTDLG.nCopies or PRINTDLG.nCopies indicates the number of copies the user wants
                // to print, and the PD_COLLATE flag in the Flags member indicates
                // whether the user wants to print them collated.
                if ((data.Flags & PD.USEDEVMODECOPIESANDCOLLATE) == 0)
                {
                    PrinterSettings.Copies  = (short)data.nCopies;
                    PrinterSettings.Collate = (data.Flags & PD.COLLATE) == PD.COLLATE;
                }

                return(true);
            }
            finally
            {
                GC.KeepAlive(wndproc);
                Kernel32.GlobalFree(data.hDevMode);
                Kernel32.GlobalFree(data.hDevNames);
            }
        }
Beispiel #3
0
 private static extern BOOL PrintDlgW(ref PRINTDLGW_32 lppd);