2009-08-31 80 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 2009-08-31 14:40:38

回答

2

我不想回答我自己的問題,但解決方案是在我面前凝視着我。

正如我已經編碼打印送貨單的能力,我的下一步是提供一個在屏幕上覆制(即沒有打印硬拷貝的意圖)。打印預覽對話框似乎是一個簡單的方法。

最後,我剛剛創建自定義表單,並看不到打印預覽控制直接塗到它。

不幸的是,我太專注於試圖讓打印預覽對話,表現爲我想要的,而不是着眼於更大的問題。

1

你可能有一些運氣PreviewPrintController代替StandardPrintController。

+0

是的,但是我已經嘗試過了,它仍然會產生進度對話框。 – Bryan 2009-08-31 14:33:44

+0

我已經更新了代碼示例以包括整個班級,因爲它目前的狀態。 – Bryan 2009-08-31 14:38:51

0

一種解決方法是使用EnumChildWindows API,以找到手感的窗口,如果找到,則使用的ShowWindow API與SW_HIDE標誌隱藏窗口。

以下是使用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

這個工作對我來說:

設置文檔的printcontroller爲StandardPrintController

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

對不起,只記得那是要預覽的。 – 2009-09-01 08:27:39

+0

這對我有用,但我沒有做預覽。請參閱此處的「備註」以瞭解可用的不同PrintController:http://msdn.microsoft.com/zh-cn/library/system.drawing.printing.printcontroller.aspx。 PrintController默認是PrintControllerWithStatusDialog。 – AceJordin 2011-11-17 19:00:34

0

看來,通過PrintPreviewDialog使用的PrintPreviewControl將取代PrintDocumentPrintController,使其在預覽渲染過程中使用PrintControllerWithStatusDialog。一旦Print操作完成,PrintController恢復到其先前的值。似乎不可能自定義PrintPreviewControl以使用任何其他PrintController

1

只是爲了確認Pooven的答案。我遇到了同樣的問題並試圖解決,斯蒂芬的解決方案也不適合我。然後我終於看到了源代碼,發現它是硬編碼的,所以不能更改。如果您需要隱藏狀態對話框,請尋找另一個解決方案,而不是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()); 
     } 
    } 
}