在向用户显示对话框后,我正试图修改从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来构建自己的包装器(如果需要的话)。
祝你好运。