2 回答
TA贡献1866条经验 获得超5个赞
我不确定您是如何使用当前代码复制屏幕的正确部分的。Bounds ()属性返回一个相对于PARENT控件的矩形,但您要求控件本身(而不是父控件)转换为屏幕坐标:
获取或设置控件(包括其非客户端元素)相对于父控件的大小和位置(以像素为单位)。
我希望看到更多类似的东西:
Rectangle bounds = ctrl.Parent.RectangleToScreen(ctrl.Bounds);
Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(bounds.Location, new Point(0,0), bounds.Size);
}
不过,我不知道这是否能在不同的缩放模式下正常工作。
TA贡献1852条经验 获得超7个赞
我找不到修复它的方法。我更改了方法并在表单上使用了 DrawToBitmap,然后从控件位置制作了一个图像。我必须考虑一个固定的偏移量。我认为这与顶部栏包含在窗体的位图中而不是包含在窗体中控件的位置有关。
要考虑的一件事是 DrawToBitmap 以相反的堆栈顺序绘制。如果您有叠加对象,您可能需要颠倒 DrawToBitmap 的顺序。
private void capture(Control ctrl, string fileName)
{
Bitmap bitmapForm = new Bitmap(this.Width, this.Height);
this.DrawToBitmap(bitmapForm, new Rectangle(0, 0, this.Width, this.Height));
Rectangle myControlRect = new Rectangle(ctrl.Location,ctrl.Size);
//Correct for boarder around form
myControlRect.Offset(8,31);
Bitmap bitmap = bitmapForm.Clone(myControlRect, PixelFormat.DontCare);
string filetype = fileName.Substring(fileName.LastIndexOf('.')).ToLower();
switch (filetype)
{
case ".png":
bitmap.Save(fileName, ImageFormat.Png);
break;
case ".jpeg":
bitmap.Save(fileName, ImageFormat.Jpeg);
break;
case ".bmp":
bitmap.Save(fileName, ImageFormat.Bmp);
break;
default:
break;
}
}
- 2 回答
- 0 关注
- 114 浏览
添加回答
举报