2012-12-31 10 views
7

Powiel możliwe:
How can I take a screenshot of a Winforms control/form in C#?Drukowanie przewijanego formularza okna.

Mam okna tworzą wraz z listą nazwisk i zdjęć. Lista jest długa i dlatego jest tam panel przewijania. Teraz chciałbym wydrukować ten formularz, ale nie mogę, ponieważ funkcja drukowania drukuje tylko "widoczną" część, ponieważ niewidoczna część jest widoczna podczas przewijania w dół. Czy istnieje sposób na wydrukowanie całego formularza naraz?

+3

To nie jest dokładna dupe, ale problem jest zasadniczo taka sama. Nie ma tu łatwego rozwiązania. To, co chcesz wydrukować, w rzeczywistości nie istnieje (ponieważ nie zostało narysowane). Będziesz musiał przewinąć formularz i przechwycić wiele obrazów przed drukowaniem. Łatwiej będzie po prostu wydrukować dane, nie martwiąc się zbytnio o dokładne dopasowanie formularza. –

+1

@JonB - cóż, tego rodzaju pytanie może pomóc w znalezieniu ogólnej odpowiedzi na ten powtarzający się problem. Prawdopodobny duplikat zdaje się nie mieć zastosowania naprawdę dobrze. Czy "to nie jest możliwe" jest jedyną odpowiedzią na to pytanie? –

Odpowiedz

3

Look za kontrolę formie drukowanej w Visual Basic Powerpacks przybornika

aby wydrukować kompletny obszar roboczy z funkcją przewijania formie spróbować ...

1.In przyborniku kliknij Visual Basic Powerpacks kartę, a następnie przeciągnij składnik PrintForm na formularz.

Składnik PrintForm zostanie dodany do podajnika części.

2. W oknie Właściwości ustaw właściwość PrintAction na PrintToPrinter.

3.Dodaj następujący kod do odpowiedniej procedury obsługi zdarzeń (na przykład w module obsługi zdarzeń dla przycisku Drukuj).

1.PrintForm1.Print (Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)

Daj ten strzał i daj mi znać, jak to działa dla Ciebie.

+0

To jest naprawdę chore, aby stwierdzić, że nie mogę zwiększyć wysokości formularza ponad 764. Wypróbowałem Twoje rozwiązanie. Nie działa z dużymi formularzami. Czy masz jakąkolwiek inną metodę zrobienia tego dla formy, aby uzyskać więcej wysokości z przewijaniem. Dzięki – Brune

2

To nie jest kompletna odpowiedź, ale tutaj jest fragment kodu, który wykonuje zrzut ekranu (bitmapy) przewijanego kontrolki Panelu na formularzu. Dużą wadą jest migotanie ekranu podczas wykonywania zrzutu ekranu. Przetestowałem go na prostych aplikacjach, więc może nie działać we wszystkich przypadkach, ale to może być początek.

Oto jak go używać:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); // create a scrollable panel1 component 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     TakeScreenshot(panel1, "C:\\mypanel.bmp"); 
    } 
} 

A oto narzędzie:

public static void TakeScreenshot(Panel panel, string filePath) 
    { 
     if (panel == null) 
      throw new ArgumentNullException("panel"); 

     if (filePath == null) 
      throw new ArgumentNullException("filePath"); 

     // get parent form (may not be a direct parent) 
     Form form = panel.FindForm(); 
     if (form == null) 
      throw new ArgumentException(null, "panel"); 

     // remember form position 
     int w = form.Width; 
     int h = form.Height; 
     int l = form.Left; 
     int t = form.Top; 

     // get panel virtual size 
     Rectangle display = panel.DisplayRectangle; 

     // get panel position relative to parent form 
     Point panelLocation = panel.PointToScreen(panel.Location); 
     Size panelPosition = new Size(panelLocation.X - form.Location.X, panelLocation.Y - form.Location.Y); 

     // resize form and move it outside the screen 
     int neededWidth = panelPosition.Width + display.Width; 
     int neededHeight = panelPosition.Height + display.Height; 
     form.SetBounds(0, -neededHeight, neededWidth, neededHeight, BoundsSpecified.All); 

     // resize panel (useless if panel has a dock) 
     int pw = panel.Width; 
     int ph = panel.Height; 
     panel.SetBounds(0, 0, display.Width, display.Height, BoundsSpecified.Size); 

     // render the panel on a bitmap 
     try 
     { 
      Bitmap bmp = new Bitmap(display.Width, display.Height); 
      panel.DrawToBitmap(bmp, display); 
      bmp.Save(filePath); 
     } 
     finally 
     { 
      // restore 
      panel.SetBounds(0, 0, pw, ph, BoundsSpecified.Size); 
      form.SetBounds(l, t, w, h, BoundsSpecified.All); 
     } 
    } 
Powiązane problemy