C# 如何使用Control.DrawToBitmap将窗体渲染为位图,而不使用其装饰(标题栏、边框)?
我有一个表单,其中有一个覆盖控件(透明的灰色背景,在“Drop here…”上有白色文本,还有一个图标),只有当文件拖到表单上时才可见。通过在控件背面绘制控件,然后用透明灰色(ARGB)填充,覆盖层变得透明。当覆盖应该覆盖在不是表单的控件上时,但当我使用C# 如何使用Control.DrawToBitmap将窗体渲染为位图,而不使用其装饰(标题栏、边框)?,c#,.net,winforms,gdi+,drawtobitmap,C#,.net,Winforms,Gdi+,Drawtobitmap,我有一个表单,其中有一个覆盖控件(透明的灰色背景,在“Drop here…”上有白色文本,还有一个图标),只有当文件拖到表单上时才可见。通过在控件背面绘制控件,然后用透明灰色(ARGB)填充,覆盖层变得透明。当覆盖应该覆盖在不是表单的控件上时,但当我使用控件时,该方法非常有效。DrawToBitmap要呈现表单,而不是通常的控件,它还会呈现标题栏和边框。您可以渲染整个表单,然后使用位图.Clone()只获取所需的部分。您已经解释了如何操作。表单。DrawToBitmap绘制整个表单,包括非客户端
控件时,该方法非常有效。DrawToBitmap
要呈现表单,而不是通常的控件,它还会呈现标题栏和边框。您可以渲染整个表单,然后使用位图.Clone()
只获取所需的部分。您已经解释了如何操作。表单。DrawToBitmap
绘制整个表单,包括非客户端区域。你可以用。BitBlt函数执行与矩形像素对应的颜色数据从指定的源设备上下文到目标设备上下文的位块传输
该方法始终返回从控件左上角绘制的位图,即使向该方法传递一个具有特定边界的矩形也是如此
这里,表单的ClientRectangle
部分使用其边界的大小进行翻译
请注意,如果您的应用程序不是DPIAware,则可能会从所有返回点或矩形的方法中获得错误的度量值。包括非DPIAware Windows API
如果需要保存生成的位图,请使用PNG
作为目标格式:它的无损压缩更适合这种渲染
调用此方法时,将clientreaonly
参数设置为true
,使其仅返回clientrea
的位图
public Bitmap FormScreenShot(Form form, bool clientAreaOnly)
{
var fullSizeBitmap = new Bitmap(form.Width, form.Height, PixelFormat.Format32bppArgb);
// .Net 4.7+
fullSizeBitmap.SetResolution(form.DeviceDpi, form.DeviceDpi);
form.DrawToBitmap(fullSizeBitmap, new Rectangle(Point.Empty, form.Size));
if (!clientAreaOnly) return fullSizeBitmap;
Point p = form.PointToScreen(Point.Empty);
var clientRect =
new Rectangle(new Point(p.X - form.Bounds.X, p.Y - form.Bounds.Y), form.ClientSize);
var clientAreaBitmap = fullSizeBitmap.Clone(clientRect, PixelFormat.Format32bppArgb);
fullSizeBitmap.Dispose();
return clientAreaBitmap;
}
您只需要右矩形,以便排除标题栏和边框。使用带有Point.Empty和ClientSize的表单矩形ToScreen()。该属性仅在.NET Framework v4.7+中可用。有其他方法可以获取该值,但这是一个广泛的问题(用于注释)。这只是一个预防措施(你可以在这里阅读它有用的原因:)。如果您知道这一点,您可以将其删除。这不是绝对必要的。
public Bitmap FormScreenShot(Form form, bool clientAreaOnly)
{
var fullSizeBitmap = new Bitmap(form.Width, form.Height, PixelFormat.Format32bppArgb);
// .Net 4.7+
fullSizeBitmap.SetResolution(form.DeviceDpi, form.DeviceDpi);
form.DrawToBitmap(fullSizeBitmap, new Rectangle(Point.Empty, form.Size));
if (!clientAreaOnly) return fullSizeBitmap;
Point p = form.PointToScreen(Point.Empty);
var clientRect =
new Rectangle(new Point(p.X - form.Bounds.X, p.Y - form.Bounds.Y), form.ClientSize);
var clientAreaBitmap = fullSizeBitmap.Clone(clientRect, PixelFormat.Format32bppArgb);
fullSizeBitmap.Dispose();
return clientAreaBitmap;
}