C# 实用工具分享(1)
大家好,今天分享一些在开发过程中比较实用的工具。
首先在软件开发的过程中不可避免的要使用截图这样的功能,以前这样的功能我自己也是选择开发出新功能。但是自己开发还是非常费时费力的,并且效果也不一定特别好。
于是我找到了一个现成的截图功能。
如下所示:名字为screencapturer
这个软件的使用方法如下:
private void button1_Click(object sender, EventArgs e)
{
ScreenCapturer.ScreenCapturerTool screen = new ScreenCapturer.ScreenCapturerTool();
if (screen.ShowDialog()==DialogResult.OK)
{
Bitmap bmp = (Bitmap)screen.Image;
pictureBox1.BackgroundImage = bmp;
}
}
使用的效果如下图所示:
这个截图中有以下功能:
画框:
可以切换总共16种颜色的框线用来进行画框标注。
也可以画椭圆:
和画框一样也可以切换总共16种颜色的框线用来进行椭圆标注。
不每个都介绍了,大家可以自己体会其他的功能。
截图软件的使用描述:
Library for fast screenshot make and screen capture based on SharpDX package.
使用过程中也发现了了一些问题,首先就是这个截图软件只能满足一个屏幕的截屏,也就是只可以主屏幕使用,第二个屏幕无法使用截图。还有就是在截图以后,影响其他软件使用,无法直接进行软件缩小。只能通过切换才能处理这个问题。
如果是自己开发一个截图功能,也需要考虑一些事情:
例如:
1、界面信息刷新,会造成窗口一直抖动,这样的问题需要先将操作记录到内存里,然后一起刷新到前端界面上。
用画框来举个例子:
// 获取鼠标按下的坐标
Point newPoint = new Point(startPoint.X, startPoint.Y);
// 新建画板和画笔
Graphics g = Graphics.FromImage(copyBmp);
Pen p = new Pen(Color.Red, 1);
// 获取矩形的长宽
width = Math.Abs(startPoint.X - e.X);
height = Math.Abs(startPoint.Y - e.Y);
if (startPoint.X < e.X)
{
recX = startPoint.X;
newPoint.X = startPoint.X;
}
else
{
recX = startPoint.X - width;
newPoint.X = startPoint.X - width;
}
if (startPoint.Y < e.Y)
{
recY = startPoint.Y;
newPoint.Y = startPoint.Y;
}
else
{
recY = startPoint.Y - height;
newPoint.Y = startPoint.Y - height;
}
Rectangle CatchRectangle = new Rectangle(newPoint, new Size(width, height));
// 将矩形画在画板上
g.DrawRectangle(p, CatchRectangle);
// 释放目前的画板
g.Dispose();
p.Dispose();
// 从当前窗体创建新的画板
Graphics g1 = this.CreateGraphics();
// 将刚才所画的图片画到截图窗体上
// 为什么不直接在当前窗体画图呢?
// 如果自己解决将矩形画在窗体上,会造成图片抖动并且有无数个矩形
// 这样实现也属于二次缓冲技术
g1.DrawImage(copyBmp, new Point(0, 0));
g1.Dispose();
// 释放拷贝图片,防止内存被大量消耗
copyBmp.Dispose();
Pen pen = new Pen(Color.Red, 2);
pen.DashPattern = new float[] { 1, 2 };
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
main_g.DrawRectangle(pen, recX, recY, width, height);
string ss = $"{width}×{height}";
main_g.DrawString(ss, new Font("宋体", 12, FontStyle.Bold), Brushes.Green, new Point(e.X, e.Y));
今天要讲的就是这么多,我们下篇文章再见。