利用CopyFromScreen截图边框被剪切掉的问题!

wangtong2010 2018-03-04 05:35:09
当窗体的FormBorderStyle属性设置为FixedDialog时,截下来的窗体被切掉边了。当属性设置为Sizable时,没有这个问题。可是我不想让别人调整窗体的大小。怎样才能FormBorderStyle属性设置为FixedDialog时,窗体的边沿能够完整保存下来?
程序代码如下:

private void button1_Click(object sender, EventArgs e)
{
Bitmap bit = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bit);
g.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, bit.Size);
bit.Save(this.Name + ".png");
g.Dispose();
}

这是FormBorderStyle属性设置为FixedDialog时的截图效果,窗体的边沿被剪切掉了,不好看。

这是FormBorderStyle属性设置为Sizable时的截图效果,窗体的边沿完整保存了下来,这才是我想要的。
...全文
425 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangtong2010 2018-03-04
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
PointToScreen 取得 form 中的点在屏幕上的真实位置,用于你用的是 CopyFromScreen 从屏幕中赋值图片
所以点是否准确就决定一切
var p = PointToScreen(new Point(0, 0)); 就是左上角的坐标
你自己可以对比一下他与 Location 的差异


ar bt = new Bitmap(Width, Height);
DrawToBitmap(bt, new Rectangle(Point.Empty, Size));
bt 就是所需的图片

所有控件都有 DrawToBitmap 方法

后来改用DrawToBitmap方法
修改代码如下


private void button1_Click(object sender, EventArgs e)
{
Bitmap bit = new Bitmap(this.Width, this.Height);
DrawToBitmap(bit, new Rectangle(Point.Empty, bit.Size));
bit.Save(this.Name + ".png");
}

效果如下,与真实界面还是有所不同,好像更象在VS中的界面,不过还可以被接受。
wangtong2010 2018-03-04
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
PointToScreen 取得 form 中的点在屏幕上的真实位置,用于你用的是 CopyFromScreen 从屏幕中赋值图片
所以点是否准确就决定一切
var p = PointToScreen(new Point(0, 0)); 就是左上角的坐标
你自己可以对比一下他与 Location 的差异


ar bt = new Bitmap(Width, Height);
DrawToBitmap(bt, new Rectangle(Point.Empty, Size));
bt 就是所需的图片

所有控件都有 DrawToBitmap 方法

首先说一下PointToScreen方法,我修改如下代码

private void button1_Click(object sender, EventArgs e)
{
Point p = PointToScreen(new Point(0, 0));
Bitmap bit = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bit);
g.CopyFromScreen(p.X, p.Y, 0, 0, bit.Size);
bit.Save(this.Name + ".png");
g.Dispose();
}

截取图片效果是这样,偏差更大。
xuzuning 2018-03-04
  • 打赏
  • 举报
回复
PointToScreen 取得 form 中的点在屏幕上的真实位置,用于你用的是 CopyFromScreen 从屏幕中赋值图片 所以点是否准确就决定一切 var p = PointToScreen(new Point(0, 0)); 就是左上角的坐标 你自己可以对比一下他与 Location 的差异 ar bt = new Bitmap(Width, Height); DrawToBitmap(bt, new Rectangle(Point.Empty, Size)); bt 就是所需的图片 所有控件都有 DrawToBitmap 方法
wangtong2010 2018-03-04
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
FormBorderStyle.Sizable 较 FormBorderStyle.FixedDialog 要大一圈 显然你没有考虑到这一点 你可以用 PointToScreen 方法探知一下实际的位置,而不是简单的用 Location 或者使用 DrawToBitmap 方法直接生成,而不是截图
关于您说的PointToScreen和DrawToBitmap 方法如何用,我试了一下,还是不会用,您能否说详细些?谢谢。
xuzuning 2018-03-04
  • 打赏
  • 举报
回复
FormBorderStyle.Sizable 较 FormBorderStyle.FixedDialog 要大一圈 显然你没有考虑到这一点 你可以用 PointToScreen 方法探知一下实际的位置,而不是简单的用 Location 或者使用 DrawToBitmap 方法直接生成,而不是截图

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧