Microsoft 开发人员网络 > 论坛主页 > XML Paper Specification (XPS) > wpf: Open printing preferences without print dialog
提出问题提出问题
 

问题wpf: Open printing preferences without print dialog

  • 2008年6月29日 11:26Pepel 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌
     
    Hello, programing clever world. I gonna create custom print dialog in wpf. On my custom print dialog, pushing a button  I want to open standard printing preferences dialog where I can choose paper quality and other printer properties. How can I do it  without calling default print dialog (
    Code Snippet

    PrintDialog pd = new PrintDialog();   pd.ShowDialog();

    ) ?

全部回复

  • 2009年5月16日 10:58sarafuddin 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌
     
    Try this :

    [DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true,
                ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter,
            [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
            IntPtr pDevModeOutput, ref IntPtr pDevModeInput, int fMode);
            [DllImport("kernel32.dll")]
            static extern IntPtr GlobalLock(IntPtr hMem);
            [DllImport("kernel32.dll")]
            static extern bool GlobalUnlock(IntPtr hMem);
            [DllImport("kernel32.dll")]
            static extern bool GlobalFree(IntPtr hMem);
            private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings)
            {
                IntPtr handle = (new System.Windows.Interop.WindowInteropHelper(this.fullScreenPrintWindow)).Handle;
                IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
                IntPtr pDevMode = GlobalLock(hDevMode);
                int sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, ref pDevMode, 0);
                IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
                DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, ref pDevMode, 14);
                GlobalUnlock(hDevMode);
                printerSettings.SetHdevmode(devModeData);
                printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
                GlobalFree(hDevMode);
                Marshal.FreeHGlobal(devModeData);
            }
    [DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true,
                ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter,
            [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
            IntPtr pDevModeOutput, ref IntPtr pDevModeInput, int fMode);
            [DllImport("kernel32.dll")]
            static extern IntPtr GlobalLock(IntPtr hMem);
            [DllImport("kernel32.dll")]
            static extern bool GlobalUnlock(IntPtr hMem);
            [DllImport("kernel32.dll")]
            static extern bool GlobalFree(IntPtr hMem);
            private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings)
            {
            //fullScreenPrintWindow in this example is a window. 
                IntPtr handle = (new System.Windows.Interop.WindowInteropHelper(this.fullScreenPrintWindow)).Handle;
                IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
                IntPtr pDevMode = GlobalLock(hDevMode);
                int sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, ref pDevMode, 0);
                IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
                DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, ref pDevMode, 14);
                GlobalUnlock(hDevMode);
                printerSettings.SetHdevmode(devModeData);
                printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
                GlobalFree(hDevMode);
                Marshal.FreeHGlobal(devModeData);
            }
    
    //Somewhere in you code show the dialog using this : 
    
                PrinterSettings settings = new PrinterSettings();
                settings.PrinterName = CurrentPrinter.FullName;
                OpenPrinterPropertiesDialog(settings);