5

ダイアログがユーザーに表示された後、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 オブジェクトを使用して印刷します。Word を印刷する必要があるため、サード パーティの dll Aspose.Words を使用していますが、これは問題ではないようです。ダイアログが表示された後、すべての設定が既にプリンターにコミットされており、PrinterSettings を変更しても何も達成されないようです。これを機能させる方法についてのアイデアはありますか?

編集:これにはいくつかの回避策があります。ここで私が欲しいのは、これらの特定の質問に対する答えを得ることです: ダイアログが表示された後に PrinterSettings オブジェクトを変更することは可能ですか? これらの変更は印刷時に考慮されますか? 誰かがこれがどのように機能するかを 1 つだけ知っている場合 (印刷に使用する API を決めることができます。PrinterSettings オブジェクトが使用されている限り、それは問題ではありません)、私は非常に感謝しています。

4

2 に答える 2

2

あなたの質問が反対票を投じた理由がわからない、私にはかなり合理的だと思われる????

とにかく、私が 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 を直接使用するというオプションもあります (私が知っているほどではありません)。

幸運を。

于 2012-03-17T09:32:19.193 に答える
1

Aspose のドキュメントから:

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

したがって、変更した PrinterSettings オブジェクトを、印刷しようとしている Word ドキュメントに渡すことができるようです。これが機能するかどうか教えていただけますか?

于 2012-03-14T16:20:14.777 に答える