Изменение параметров принтера после отображения PrintDialog
Я пытаюсь изменить объект 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), я был бы очень благодарен.
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 непосредственно после вызова - код может быть выделен из вышеприведенных диалоговых окон для создания вашей собственной оболочки, если это необходимо.
Удачи.
Из документации Aspose:
AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc);
awPrintDoc.PrinterSettings = printDlg.PrinterSettings;
Таким образом, вы можете передать измененный объект PrinterSettings в текстовый документ, который вы пытаетесь распечатать. Не могли бы вы сказать мне, если это работает?