あなたの質問が反対票を投じた理由がわからない、私にはかなり合理的だと思われる????
とにかく、私が PrintDialog で気付いたことがいくつかあります (あなたの質問に答えるかもしれないし、答えないかもしれません)。
まず、Windows com ダイアログの単なるラッパー クラスであるということです。
[DllImport("comdlg32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool PrintDlg([In, Out] NativeMethods.PRINTDLG lppd);
そして2番目に、あなたの質問に関して最も重要だと思います: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 を直接使用するというオプションもあります (私が知っているほどではありません)。
幸運を。