在向用户显示对话框后,我正试图修改从system.windows.forms.printDialog获取的system.drawing.printing.printersettings对象。虽然我可以更改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,因为我需要打印word,但这似乎不是问题所在。似乎在对话框显示后,所有设置都已提交给打印机,更改打印机设置将一事无成。有什么办法让它工作吗?
编辑:我有一些解决办法。我想在这里得到这些具体问题的答案:是否可以在对话框显示后更改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$定位。
当然,有一个选项(不是我所知道的那么好)就是在调用代码可以从上面的拨号中hyt出来之后直接使用win api来构建自己的包装器(如果需要的话)。
祝你好运。

09-20 14:39