2012-12-31 38 views
7

thể trùng lặp:
How can I take a screenshot of a Winforms control/form in C#?In biểu mẫu cửa sổ có thể cuộn.

Tôi có một cửa sổ hình thành với một danh sách tên và hình ảnh. Danh sách dài và vì vậy có một bảng cuộn cho nó. Bây giờ, tôi muốn in biểu mẫu này nhưng tôi không thể vì chức năng in chỉ in phần "hiển thị" vì phần vô hình được nhìn thấy khi bạn cuộn xuống. Vậy, có cách nào để in toàn bộ biểu mẫu cùng một lúc không?

+3

Nó không phải là một người bị mắc mưu chính xác, nhưng vấn đề cơ bản là giống nhau. Không có giải pháp dễ dàng ở đây. Những gì bạn muốn in không thực sự tồn tại (vì nó chưa được vẽ). Bạn sẽ phải cuộn biểu mẫu và chụp nhiều ảnh trước khi in. Việc in dữ liệu có thể dễ dàng hơn mà không phải lo lắng quá nhiều về việc khớp chính xác với biểu mẫu. –

+1

@ JonB - vâng, loại câu hỏi này có thể giúp tìm câu trả lời chung cho vấn đề tái diễn này. Các bản sao có thể có vẻ không áp dụng thực sự tốt. Là "nó không thể" câu trả lời duy nhất bao giờ này trên SO? –

Trả lời

3

Look cho điều khiển biểu mẫu Print trong Visual Basic PowerPacks hộp công cụ

Để in khu vực khách hàng hoàn toàn của một dạng cuộn thử này ...

1.In hộp công cụ, nhấp vào PowerPacks Visual Basic và sau đó kéo thành phần PrintForm vào biểu mẫu.

Thành phần PrintForm sẽ được thêm vào khay thành phần.

2.Trong cửa sổ Thuộc tính, đặt thuộc tính PrintAction thành PrintToPrinter.

3.Thêm mã sau vào trình xử lý sự kiện thích hợp (ví dụ: trong trình xử lý sự kiện nhấp cho Nút In).

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

Give này một shot và cho tôi biết làm thế nào nó hoạt động ra cho bạn.

+0

Điều này thực sự là bệnh để xác định rằng tôi không thể mở rộng chiều cao của hình thức của tôi hơn 764. Tôi đã thử giải pháp của bạn. Nó không hoạt động với các hình thức lớn. Bạn có phương pháp nào khác để làm điều này cho biểu mẫu đi cao hơn với cuộn không. Cảm ơn – Brune

2

Đây không phải là câu trả lời chính xác, nhưng đây là một đoạn mã có ảnh chụp màn hình (ảnh bitmap) của điều khiển Bảng điều khiển cuộn trên Biểu mẫu. Hạn chế lớn nhất là màn hình nhấp nháy trong khi chụp màn hình. Tôi đã thử nghiệm nó trên các ứng dụng đơn giản, vì vậy nó có thể không hoạt động trong mọi trường hợp, nhưng đó có thể là một sự khởi đầu.

Dưới đây là làm thế nào để sử dụng nó:

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

Và đây là các tiện ích:

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); 
     } 
    } 
Các vấn đề liên quan