我正在尝试修改system.draining.printing.printersettings对象,即我从system.windows.forms.printdialog显示给用户后。虽然我能够在PrinterSettings对象上更改属性值,但在打印文档时实际上考虑了对话框后我制作的更改。

这是我的意思:

//Show the printdialog and retreive the printersettings    
var printDialog = new PrintDialog();
if (printDialog.ShowDialog() != DialogResult.OK) 
            return;
var printerSettings = printDialog.PrinterSettings;

//Now modify the printersettings object
printerSettings.ToPage = 8;
.

现在使用printersettings对象进行打印。我使用第三方dll aspose.words为此,因为我需要打印字,但这似乎不是问题。似乎在对话框后,所有设置已经通信到打印机并更改打印机即将达到任何内容。关于如何获得工作的任何想法?

编辑:我有一些解决方法。我想要的是解决这些特定问题的答案:是否可以在对话框显示后更改PrinterSettings对象,并且在打印中考虑这些更改。如果有人只知道它如何工作的一种方式(你可以决定要用于打印的API,那么只要使用PrinterSettings对象),就不重要),我会非常感谢。

有帮助吗?

解决方案

不确定为什么你的问题下降了投票,看似对我来说非常合理吗????

无论如何,我用printdialog注意到了一些东西(可能会或可能不回答你的问题)。

第一件事是它只是Windows COM对话的包装类。

[DllImport("comdlg32.dll", CharSet=CharSet.Auto, SetLastError=true)]
        public static extern bool PrintDlg([In, Out] NativeMethods.PRINTDLG lppd);
.

和第二,并且最重要的是关于你的问题我猜: PrintDialog类具有此例程,该例程在关闭PrintDLG呼叫之后调用

if (!UnsafeNativeMethods.PrintDlg(data))
                return false;

            IntSecurity.AllPrintingAndUnmanagedCode.Assert();
            try { 
                UpdatePrinterSettings(data.hDevMode, data.hDevNames, data.nCopies, data.Flags, settings, PageSettings); 
            }
            finally { 
                CodeAccessPermission.RevertAssert();
            }
.

。 。 。

// VSWhidbey 93449: Due to the nature of PRINTDLGEX vs PRINTDLG, separate but similar methods 
// are required for updating the settings from the structure utilized by the dialog.
// Take information from print dialog and put in PrinterSettings
private static void UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, short copies, int flags, PrinterSettings settings, PageSettings pageSettings) {
        // Mode 
        settings.SetHdevmode(hDevMode);
        settings.SetHdevnames(hDevNames); 

        if (pageSettings!= null)
            pageSettings.SetHdevmode(hDevMode); 

        //Check for Copies == 1 since we might get the Right number of Copies from hdevMode.dmCopies...
        //this is Native PrintDialogs
        if (settings.Copies == 1) 
            settings.Copies = copies;

        settings.PrintRange = (PrintRange) (flags & printRangeMask); 
    }
.

这里还有一个相当有趣的相互作用(铭记您设置了printersettings.topage):

public PrinterSettings PrinterSettings {
   get { 
        if (settings == null)
        {
            settings = new PrinterSettings(); 
        }
        return settings; 
    } 
    set {
        if (value != PrinterSettings) 
        {
            settings = value;
            **printDocument = null;**
        } 
    }
} 
.

然后

public PrintDocument Document {
            get { return printDocument;}
            set {
                printDocument = value; 
                **if (printDocument == null)
                    settings = new PrinterSettings();** 
                else 
                    settings = printDocument.PrinterSettings;
            } 
        }
.

我不知道直接答案,但我认为应该指出你的正确方向,为什么不起作用。在我看来,在对话中的使用过程中,它可以愉快地无效地完成更改时的设置,因为它将在完成时重新创建,但是当对话框完成时,更改设置实际上会使文档打印设置无效,直到再次设置。可以手动执行此操作,或者它可能是M $的洛奇\ ked在许多内部的通常的内部/私人方式。

当然(我知道不太好的)可以选择呼叫后刚刚使用WIN API DIETTLY,如果需要,可以从上面的拨号码与上述角型拨号来构建自己的包装器。

祝你好运。

其他提示

从Aspose文档:

AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc);
awPrintDoc.PrinterSettings = printDlg.PrinterSettings;
.

所以似乎您可以将yuor修改的printersettings对象传递给您尝试打印的Word文档。你能告诉我这个工作吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top