2009-08-31 2 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를 사용하여 창 핸들을 찾은 다음 ShowWindow API와 SW_HIDE 플래그를 함께 사용하여 창을 숨길 수 있습니다.

#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을 설정 여기

는 윈도우의 제목을 알고있는 경우를 FindWindow를 사용하는 예입니다.

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