2012-12-31 30 views
7

Olası Çoğalt:
How can I take a screenshot of a Winforms control/form in C#?Kaydırılabilir bir pencere formunu yazdırma.

Bir pencere isimleri ve resimlerin bir listesi ile meydana vardır. Liste uzun ve bunun için bir kaydırma paneli var. Şimdi, bu formu yazdırmak istiyorum ama yapamam çünkü baskı fonksiyonu sadece "görünür" kısmı yazdırıyor çünkü aşağı inerken görünmez kısım görülüyor. Yani, tüm formu aynı anda basmanın bir yolu var mı?

bu deneyin kaydırılabilir formunun eksiksiz müşteri alanını yazdırmak için Visual Basic PowerPacks araç kutusu

Yazdırma şekli kontrol etmek için

+3

Bu kesin dupe değil, ama sorun temelde aynıdır. Burada kolay bir çözüm yok. Yazdırmak istediğiniz şey gerçekte mevcut değil (çizilmiş olmadığı için). Formu kaydırmanız ve yazdırmadan önce birden çok görüntü yakalamanız gerekir. Formu tam olarak eşleştirmekten çok endişelenmeden verileri yazdırmak daha kolay olabilir. –

+1

@JonB - Bu tür bir soru, bu tekrarlanan soruna genel bir cevap bulabilir. Muhtemel kopya gerçekten iyi görünmüyor. "Bu mümkün değil" bu SO için tek cevap var mı? –

cevap

3

Bak ...

Toolbox 1.In, Visual Basic Powerpacks tıklayın sekmesini tıklatın ve sonra PrintForm bileşenini forma sürükleyin.

PrintForm bileşeni

bileşen tepsisine eklenecektir. Özellikler penceresinde 2.In

, PrintToPrinter için PrintAction özelliğini ayarlayın.

3.Add (Bir Baskı Düğme tıklatarak olay işleyicisi örneğin,) uygun bir olay işleyicisi aşağıdaki kodu.

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

bu bir atış ver ve bana sizin için nasıl çalıştığını bildirin.

+0

Bu, formumun boyunu 764'ten fazla uzatamayacağımı belirlemek için gerçekten çok hastaydı. Çözümü denedim. Büyük formlarla çalışmaz. Form için bunu yapmak için başka bir yönteminiz var mı? Teşekkürler – Brune

2

Bu tam bir tam cevap değil, ama burada bir form üzerinde kaydırılabilir bir panel kontrolü bir ekran görüntüsü (bitmap) alır kod parçasıdır. Büyük dezavantaj, ekran görüntüsü çekilirken ekran titriyor. Basit uygulamalarda test ettim, bu yüzden her durumda çalışmayabilir, ancak bu bir başlangıç ​​olabilir. İşte

nasıl kullanılacağını geçerli:

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

Ve burada aracıdır:

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); 
     } 
    } 
İlgili konular