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);
}
}
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. –
@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? –