2012-03-14 44 views
5

ユーザーにダイアログが表示された後、System.Windows.Forms.PrintDialogから取得するSystem.Drawing.Printing.PrinterSettingsオブジェクトを変更しようとしています。 PrinterSettingsオブジェクトのプロパティ値を変更することはできますが、ダイアログを表示した後に行った変更は、実際にドキュメントを印刷するときには考慮されません。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オブジェクトを使用します。ここでは

は、私が何を意味するかの一例です。 Wordを印刷する必要があるので、私はサードパーティのdll Aspose.Wordsを使っていますが、これは問題ではないようです。ダイアログが表示された後、すべての設定がすでにプリンタにコミットされており、PrinterSettingsを変更すると何も成立しないようです。どのようにこれを動作させるためのアイデア?

編集:これにはいくつかの回避策があります。ここで私が欲しいのは、これらの具体的な質問に対する答えを得ることです。ダイアログが表示された後にPrinterSettingsオブジェクトを変更し、これらの変更が印刷で考慮されているかどうかを確認することは可能ですか?誰かがこれがどのように機能するかを知っているだけであれば(PrinterSettingsオブジェクトが使用されている限り、あなたは印刷に使用するAPIを決めることができます)、とても感謝しています。 Aspose社のドキュメントから

+0

ダイアログを開く前に設定を変更しない理由はありますか? –

+0

はい、私のアプリケーションでは、多くの異なる文書で構成された「マージされた文書」があります。印刷ダイアログでは、1つのドキュメントとして表示する必要がありますが、印刷するには個別に処理する必要があります。つまり、PrinterSettingsの中には、すべてのドキュメントを適用するものと、個々のドキュメントごとに個別に設定するものがあります。私は個々のプロパティ/設定私はユーザーの操作なしで計算することができますが、印刷のために私はそれらをプリンタの設定に注入する必要があります。 – user1182735

+0

スニペットから実際の印刷ジョブにprinterSettingsオブジェクトがどのように適用されているかは完全にはわかりません。また、あなたのコードに欠けていることは、問題の原因を説明します。 –

答えて

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(); 
      } 

を閉じた後に呼び出され、このルーチンを持っている:あなたを参照して

[DllImport("comdlg32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
     public static extern bool PrintDlg([In, Out] NativeMethods.PRINTDLG lppd); 

と第二、そして最も重要なのは、私は推測疑問。 。 。

// 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を使い分けるだけの選択肢があります。

幸運。

+0

私はこれをしばらくチェックしていないので、私はリプレイでちょっと遅いです:どうもありがとう。 – user1182735

+0

とbtw。私はこのウェブサイト上の人々の中には、実際の問題とその質問の内容を考慮しない傾向があるため、この質問には下落があると思います。作者がプログラミングの超実用的なアイデア以上のものを持っていることを認めたいとは思わない。この質問に関しては、コードの他の部分でいくつかの間違いを犯したと思うのが簡単なルートです。問題は、reallityが存在しないことです。申し訳ありませんが、私はあなたの答えをアップアップするために十分なクレジットやポイントを持っていません。 – user1182735

1

AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc); 
awPrintDoc.PrinterSettings = printDlg.PrinterSettings; 

だから、あなたがyuor修正PrinterSettingsはあなたが印刷しようとしているWord文書にオブジェクトを渡すことができるようです。これが動作するか教えてください。

+0

こんにちはスティーブ、結果は同じです。 printDialogの設定のみが考慮されます。マニュアルは変更されません。私は今、別のアプローチに従って、すべてのドキュメントを(Asposeで)xpsに変換し、それらを1つのxpsにマージし、wpf printdialogを使ってこの1つのxps(または選択したページ)を印刷します。 – user1182735

関連する問題