显示PrintDialog后修改Printersettings
-
14-12-2019 - |
题
我正在尝试修改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文档。你能告诉我这个工作吗?