Winforms-如何打印整个表单,包括看不见的部分? [英] Winforms - how to print the whole of a form, including unseen parts?
问题描述
我有一个用C#编写的Windows窗体项目。主窗体上有 TabControl
,并且要求其中一个用户能够打印 TabPages $ c之一$ c>。表格很长,我使用垂直滚动条。
I have a windows forms project written in C#. The main form has a TabControl
on it and there is a requirement for one of the users to be able to print one of the TabPages
. The form is very long and I use a vertical scroll bar. The whole of the form needs to be able to be printed.
我尝试使用 DrawToBitmap
方法进行转换到位图,但这只会包括用户可以看到的部分形式。我尝试过的其他一些解决方案也涉及到屏幕捕获,这也存在相同的问题。
I have tried using the DrawToBitmap
method to convert to a bitmap first, but this will only include the portion of the form that the user can see. Some other solutions I have tried involve screen capturing, which has the same issue.
如何打印或获取整个标签页的图像,包括用户向下滚动时只能看到的部分?
How can I print out, or get an image, of the whole of the tab page, including the parts the user only sees when they scroll down?
推荐答案
对于包括 TabControls
和 TabPages
,但不包含 Forms
。
This is rather simple for any control including TabControls
and TabPages
but not Forms
.
您需要做的就是放大相关控件以显示其所有内容。 (他们不必实际上必须在屏幕上可见。)
All you need to do is enlarge the relevant controls enough to show all their content. (They don't have to be actually visible on screen.)
这里是一个例子:
tabControl1.Height = 10080;
tabPage2.Height = 10050;
dataGridView1.Height = 10000;
dataGridView1.Rows.Add(3000);
for (int i = 0; i < dataGridView1.Rows.Count; i++) dataGridView1[0, i].Value = i;
using (Bitmap bmp = new Bitmap(tabControl1.Width , tabControl1.Height ))
{
tabControl1.DrawToBitmap(bmp, tabControl1.ClientRectangle);
bmp.Save("D:\\xxxx.png", ImageFormat.Png);
}
这将保存 DataGridView的全部内容
, TabPage
和 TabControl
..
注意::这不适用于表单,表单不能超出屏幕尺寸。.
Note: that this will not work with forms, which can't much exceed the screen dimensions..
更新:这是通过将多个位图修补在一起来保存垂直滚动表单的代码。当然,它也可以扩展为包括水平滚动。我已经为大型面板此处。
Update: Here is code that saves a form with vertical scrolling by patching several bitmaps together. It can, of course be expanded to include horizontal scrolling as well. I have coded a similar solution for larger Panels here.
static void saveLargeForm(Form form, string fileName)
{
// yes it may take a while
form.Cursor = Cursors.WaitCursor;
// allocate target bitmap and a buffer bitmap
Bitmap target = new Bitmap(form.DisplayRectangle.Width, form.DisplayRectangle.Height);
Bitmap buffer = new Bitmap(form.Width, form.Height);
// the vertical pointer
int y = 0;
var vsc = form.VerticalScroll;
vsc.Value = 0;
form.AutoScrollPosition = new Point(0, 0);
// the scroll amount
int l = vsc.LargeChange;
Rectangle srcRect = ClientBounds(form);
Rectangle destRect = Rectangle.Empty;
bool done = false;
// we'll draw onto the large bitmap with G
using (Graphics G = Graphics.FromImage(target))
{
while (!done)
{
destRect = new Rectangle(0, y, srcRect.Width, srcRect.Height);
form.DrawToBitmap(buffer, new Rectangle(0, 0, form.Width, form.Height));
G.DrawImage(buffer, destRect, srcRect, GraphicsUnit.Pixel);
int v = vsc.Value;
vsc.Value = vsc.Value + l;
form.AutoScrollPosition = new Point(form.AutoScrollPosition.X, vsc.Value + l);
int delta = vsc.Value - v;
done = delta < l;
y += delta;
}
destRect = new Rectangle(0, y, srcRect.Width, srcRect.Height);
form.DrawToBitmap(buffer, new Rectangle(0, 0, form.Width, form.Height));
G.DrawImage(buffer, destRect, srcRect, GraphicsUnit.Pixel);
}
// write result to disc and clean up
target.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
target.Dispose();
buffer.Dispose();
GC.Collect(); // not sure why, but it helped
form.Cursor = Cursors.Default;
}
它使用辅助函数来确定虚拟设备的净大小客户矩形,即不包括边框,标题和滚动条:
It makes use of a helper function to determine the the net size of the virtual client rectangle, ie excluding borders, title and scrollbar:
static Rectangle ClientBounds(Form f)
{
Rectangle rc = f.ClientRectangle;
Rectangle rb = f.Bounds;
int sw = SystemInformation.VerticalScrollBarWidth;
var vsc = f.VerticalScroll;
int bw = (rb.Width - rc.Width - (vsc.Visible ? sw : 0) ) / 2;
int th = (rb.Height - rc.Height) - bw * 2;
return new Rectangle(bw, th + bw, rc.Width, rc.Height );
}
这篇关于Winforms-如何打印整个表单,包括看不见的部分?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!