2009-08-31 39 views
4

C#アプリケーションでは、画面に進行状況ダイアログが表示されずに印刷プレビューを生成しようとしています。印刷プレビューを実行しているときに[印刷進行状況]ダイアログボックスが表示されないようにするには

PrintDocument.PrintControllerを使用すると、印刷プレビューではなく実際の印刷時にこの問題を防ぐことができますが、印刷プレビューの実行時には機能しないようです。次のように

私のコードは次のとおりです。

public FrmDeliveryNotePrintPreview(DeliveryNote deliveryNote) 
{ 
    InitializeComponent(); 

    this.Text = "Delivery Note #" + deliveryNote.Id.ToString(); 


    // The print preview window should occupy about 90% of the 
    // total screen height 

    int height = (int) (Screen.PrimaryScreen.Bounds.Height * 0.9); 


    // Making an assumption that we are printing to A4 landscape, 
    // then adjust the width to give the correct height:width ratio 
    // for A4 landscape. 

    int width = (int) (height/1.415); 


    // Set the bounds of this form. The PrintPreviewControl is 
    // docked, so it should just do the right thing 

    this.SetBounds(0, 0, width, height); 

    PrinterSettings printerSettings = new PrinterSettings(); 
    PrintDeliveryNotes pdn = new PrintDeliveryNotes(
     new DeliveryNote[] { deliveryNote }, 
     printerSettings); 
    PrintDocument printDocument = pdn.PrintDocument; 
    printDocument.PrintController = new PreviewPrintController(); 
    ppcDeliveryNote.Document = printDocument; 
} 

印刷プレビューが離れて印刷プレビュー進捗ダイアログが表示されているという事実から、私が望むとおりに動作します。

お願いします。

+0

PrintDeliveryNotesは、配達メモの配列を出力するクラスです。この場合、Print()メソッドを呼び出すのではなく、単にPrintDocumentプロパティを取得して、カスタムフォームのPrintPreviewControlにそのプロパティをフィードします。 – Bryan

答えて

2

私自身の質問には答えたくありませんが、解決策は私を顔で見つめていました。

私はすでに納品書を印刷する機能をコーディングしていたので、次は画面コピーを提供することです(ハードコピーを印刷するつもりはありません)。印刷プレビューダイアログは簡単な方法のようでした。

最後に、私はカスタムフォームを作成し、印刷プレビューコントロールなしで直接印刷しました。

残念ながら、より大きな問題を見るのではなく、印刷プレビューダイアログを私が望むように動作させることに集中しています。

1

あなたは、StandardPrintControllerではなくPreviewPrintControllerで運がよいかもしれません。

+0

ええ、私はすでにそれを試していますが、まだ進捗ダイアログを生成しています。 – Bryan

+0

コードサンプルを更新して、現在のクラス全体を含むようにしました。 – Bryan

0

EnumChildWindows APIを使用してウィンドウのハンドルを検索し、見つかった場合は、SW_HIDEフラグを指定したShowWindow APIを使用してウィンドウを非表示にします。あなたは、ウィンドウのタイトルを知っていれば、ここで

はのFindWindowを使用するための例です:

#region Constants 

private const int SW_HIDE = 0; 

private const int SW_SHOWNORMAL = 1; 

private const int SW_SHOW = 5; 

#endregion Constants 

#region APIs 

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto)] 

private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto)] 

private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow); 

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto)] 

private static extern bool EnableWindow(IntPtr hwnd, bool enabled); 

#endregion APIs 

public static void ShowProgress() 

{ 

IntPtr h = FindWindow(null, "titleofprogresswindow"); 

ShowWindow(h, SW_SHOW); 

EnableWindow(h, true); 

} 

public static void HideProgress() 

{ 

IntPtr h = FindWindow(null, "titleofprogresswindow"); 

ShowWindow(h, SW_HIDE); 

EnableWindow(h, false); 

} 
6

は、これが私の作品:

StandardPrintControllerにドキュメントのprintcontrollerを設定します。

static class Program 
    { 

     static void Main() 
     { 
      PrintDocument doc = new PrintDocument(); 
      doc.PrintController = new StandardPrintController(); 
      doc.PrintPage += new PrintPageEventHandler(doc_PrintPage); 

      doc.Print(); 
     } 

     static void doc_PrintPage(object sender, PrintPageEventArgs e) 
     { 
      e.Graphics.DrawString("xxx", Control.DefaultFont, Brushes.Black, new PointF(e.PageBounds.Width/2, e.PageBounds.Height/2)); 
     } 
    } 
+0

申し訳ありませんが、ちょうどプレビューのために働かなければならないことが記憶されています。 –

+0

これは私のために働いたが、私はプレビューをしていない。使用可能なさまざまなPrintControllerについては、ここでの解説を参照してください。http://msdn.microsoft.com/en-us/library/system.drawing.printing.printcontroller.aspx PrintControllerはデフォルトでPrintControllerWithStatusDialogです。 – AceJordin

0

プレビューレンダリング処理中にPrintControllerWithStatusDialogを使用するようにPrintPreviewDialogで使用PrintPreviewControlPrintDocumentPrintControllerに取って代わるだろうと思われます。 Print操作が完了すると、PrintControllerは以前の値に復元されます。他のPrintControllerを使用するようにPrintPreviewControlをカスタマイズすることはできないようです。

1

Poovenからの回答を確認するだけです。私は同じ問題を抱えて解決しようとしましたが、Stefanからの解決策も私から働いていませんでした。最終的にソースコードを見て、それが変更できないようにハードコードされていることを確認します。ステータスダイアログを非表示にする必要がある場合は、PrintPreviewControl以外の解決策を探してください。ここにPrintPreviewControlのソースコードがあります。

private void ComputePreview() { 
     int oldStart = StartPage; 

     if (document == null) 
      pageInfo = new PreviewPageInfo[0]; 
     else { 
      IntSecurity.SafePrinting.Demand(); 

      PrintController oldController = document.PrintController; 

// --> HERE they have hardcoded it! Why they do this! 

      PreviewPrintController previewController = new PreviewPrintController(); 
      previewController.UseAntiAlias = UseAntiAlias; 
      document.PrintController = new PrintControllerWithStatusDialog(previewController, 
                      SR.GetString(SR.PrintControllerWithStatusDialog_DialogTitlePreview)); 

      // Want to make sure we've reverted any security asserts before we call Print -- that calls into user code 
      document.Print(); 
      pageInfo = previewController.GetPreviewPageInfo(); 
      Debug.Assert(pageInfo != null, "ReviewPrintController did not give us preview info"); 

// --> and then swap the old one 
      document.PrintController = oldController; 
     } 

     if (oldStart != StartPage) { 
      OnStartPageChanged(EventArgs.Empty); 
     } 
    } 

ソース http://reflector.webtropy.com/default.aspx/[email protected]/[email protected]/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/WinForms/Managed/System/WinForms/Printing/[email protected]/1305376/[email protected]

0

私はそれをやったと思います。 PrintPreviewControlの代わりにこのクラスを使用してください。

public class PrintPreviewControlSilent : PrintPreviewControl 
{ 
    public new PrintDocument Document 
    { 
     get { return base.Document; } 
     set 
     { 
      base.Document = value; 

      PreviewPrintController ppc = new PreviewPrintController(); 

      Document.PrintController = ppc; 
      Document.Print(); 

      FieldInfo fi = typeof(PrintPreviewControl).GetField("pageInfo", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
      fi.SetValue(this, ppc.GetPreviewPageInfo()); 
     } 
    } 
}