我正在尝试修改System.Drawing.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,因为我需要打印Word,但这似乎不是问题。似乎在显示对话框后,所有设置都已提交到打印机并且更改PrinterSettings什么也没做。有关如何使其工作的任何想法?
编辑:我有一些解决方法。我想要的是得到这些具体问题的答案:是否可以在显示对话框后更改PrinterSettings对象,并在打印时考虑这些更改。如果有人只知道如何使用它的一种方式(你可以决定你想用什么API进行打印,只要使用PrinterSettings对象就没关系),我会非常感激。答案 0 :(得分:2)
不确定为什么你的问题得到了投票,对我来说非常合理????
无论如何,我在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 $以通常的内部/私有方式使用许多内部结构。
当然有一个选项(不太好我知道)只是在调用后使用Win API - 如果需要,可以从上面的dialgues中创建自己的包装器。
祝你好运。答案 1 :(得分:1)
来自Aspose文档:
AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc);
awPrintDoc.PrinterSettings = printDlg.PrinterSettings;
因此,您似乎可以将yuor修改后的PrinterSettings对象传递给您要打印的word文档。你能告诉我这是否有效吗?