基本信息
源码名称:C#类似QQ截图
源码大小:0.28M
文件格式:.rar
开发语言:C#
更新时间:2015-11-05
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
private Main main; //直接对Main窗体进行控制
private APIMethod api = new APIMethod(); //调用API的完成类(将API的调用封装起来,是可以直接调用产生效果的类)
private Rectangle area = Rectangle.Empty; //截图矩形
private Point op; //area起点位置
private Button b = new Button(); //CancelButton
private int index = -1;
private bool draw = false;
private bool inited = false; //确定是否已经完成area的绘制,以确定是否要显示矩形大小
private bool drawing = false; //确定是否进入画图状态,用来清除多余的GDI 图形
private int type = -1; //确定GDI 的类型
private Graphics graphics; //进行GDI 绘图
private Point sl; //初始位置
private bool md = false; //判断是否截图,如果发生MouseDown事件则开始截图,值为true
private bool isdrew = false; //是否使用过GDI ,如果使用过则不能拖动area
private Pen pen; //GDI 使用的画笔
GraphicsPath points; //画笔工具
private Image img; //GDI 绘图用的背景
private Image origin; //原始桌面
private bool fd = false; //确定是否进行文字绘制
private bool drew = false; //控制是否在重绘事件中绘制area
public Snipping()
{
InitializeComponent();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Snipping));
·imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11015")));
imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11014")));
imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11016")));
imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11017")));
imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11018")));
imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11024")));
imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("CameraDll_dll_11025")));
imageList1.Images.Add((System.Drawing.Icon)(resources.GetObject("comres_1_2857")));
pictureBox1.Image = imageList1.Images[0];
pictureBox2.Image = imageList1.Images[1];
pictureBox3.Image = imageList1.Images[2];
pictureBox4.Image = imageList1.Images[3];
pictureBox5.Image = imageList1.Images[4];
pictureBox6.Image = imageList1.Images[5];
pictureBox7.Image = imageList1.Images[6];
pictureBox8.Image = imageList1.Images[7];
b.Click = new EventHandler(b_Click);
this.CancelButton = b;
}
private void Snipping_Load(object sender, EventArgs e)
{
main = (Main)this.Owner;
this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
this.BackgroundImage = origin = api.GetScreenSnapShot();
graphics = this.CreateGraphics();
pen = new Pen(label9.BackColor);
points = new GraphicsPath();
comboBox1.SelectedIndex = 0;
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
this.UpdateStyles();
}
private void b_Click(object sender, EventArgs e)
{
api.ReleaseCursor();
this.Dispose();
}
#endregion
#region DrawLine
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (this.area == Rectangle.Empty && e.Button == MouseButtons.Left)
{
this.area.Location = new Point(e.X, e.Y);
}
this.op = new Point(e.X, e.Y);
this.index = this.GetSelectedHandle(new Point(e.X, e.Y));
this.SetCursor();
draw = true;
if (this.area.Contains(e.Location) && drawing)
{
sl = e.Location;
md = true;
RECT rect = new RECT();
rect.left = this.area.Left;
rect.right = this.area.Right;
rect.top = this.area.Top;
rect.bottom = this.area.Bottom;
WindowsAPI.ClipCursor(ref rect);
}
if (textBox1.Visible)
{
graphics = Graphics.FromImage(origin);
graphics.DrawString(textBox1.Text, textBox1.Font, new SolidBrush(label9.BackColor), new RectangleF(new Point(textBox1.Location.X, textBox1.Location.Y 2), textBox1.Size));
graphics = Graphics.FromImage(img);
graphics.DrawString(textBox1.Text, textBox1.Font, new SolidBrush(label9.BackColor), new RectangleF(new Point(textBox1.Location.X, textBox1.Location.Y 2), textBox1.Size));
graphics = this.CreateGraphics();
graphics.DrawImage(img, new Point(0, 0));
textBox1.Text = "";
textBox1.Visible = false;
api.ReleaseCursor();
fd = false;
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (drawing && md)
{
DrawGDI(type, e.Location);
if (type == 2)
fd = true;
}
else
{
if (this.Capture)
{
this.MoveHandleTo(new Point(e.X, e.Y));
this.Invalidate();
}
else
{
this.index = this.GetSelectedHandle(new Point(e.X, e.Y));
this.SetCursor();
}
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (!this.IsDisposed)
{
base.OnMouseUp(e);
int left = area.Left;
int top = area.Top;
int right = area.Right;
int bottom = area.Bottom;
area.X = Math.Min(left, right);
area.Y = Math.Min(top, bottom);
area.Width = Math.Abs(left - right);
area.Height = Math.Abs(top - bottom);
if (e.Button == MouseButtons.Right)
{
if (this.area == Rectangle.Empty)
{
this.DialogResult = DialogResult.Cancel;
}
else
{
this.area = Rectangle.Empty;
this.Invalidate();
}
}
this.index = this.GetSelectedHandle(new Point(e.X, e.Y));
this.SetCursor();
if (drawing && md)
{
if (type == 2 && fd)
{
md = false;
textBox1.Visible = true;
textBox1.Focus();
}
else
{
DrawGDI(type, e.Location);
md = false;
DrawGDI(type, e.Location);
api.ReleaseCursor();
if (type == 4)
points.Reset();
}
}
draw = false;
if (!inited)
inited = true;
this.Refresh();
}
}
private void DrawGDI(int drawtype, Point p)
{
PointF rectStartPointF = sl;
switch (drawtype)
{
case 0:
{
float width = Math.Abs(p.X - sl.X);
float heigth = Math.Abs(p.Y - sl.Y);
if (p.X < sl.X)
{
rectStartPointF.X = p.X;
}
if (p.Y < sl.Y)
{
rectStartPointF.Y = p.Y;
}
if (!md)
{
graphics = Graphics.FromImage(origin);
graphics.DrawRectangle(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
graphics = Graphics.FromImage(img);
graphics.DrawRectangle(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
graphics = this.CreateGraphics();
graphics.DrawImage(img, new Point(0, 0));
}
else
{
Image image = (Image)this.img.Clone();
graphics = Graphics.FromImage(image);
graphics.DrawRectangle(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
graphics = this.CreateGraphics();
graphics.DrawImage(image, new Point(0, 0));
}
isdrew = true;
break;
}
case 1:
{
float width = Math.Abs(p.X - sl.X);
float heigth = Math.Abs(p.Y - sl.Y);
if (p.X < sl.X)
{
rectStartPointF.X = p.X;
}
if (p.Y < sl.Y)
{
rectStartPointF.Y = p.Y;
}
if (!md)
{
graphics = Graphics.FromImage(origin);
graphics.DrawEllipse(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
graphics = Graphics.FromImage(img);
graphics.DrawEllipse(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
graphics = this.CreateGraphics();
graphics.DrawImage(img, new Point(0, 0));
}
else
{
Image image = (Image)this.img.Clone();
graphics = Graphics.FromImage(image);
graphics.DrawEllipse(pen, rectStartPointF.X, rectStartPointF.Y, width, heigth);
graphics = this.CreateGraphics();
graphics.DrawImage(image, new Point(0, 0));
}
isdrew = true;
break;
}
case 2:
{
float width = Math.Abs(p.X - sl.X);
float heigth = Math.Abs(p.Y - sl.Y);
if (p.X < sl.X)
{
rectStartPointF.X = p.X;
}
if (p.Y < sl.Y)
{
rectStartPointF.Y = p.Y;
}
Image image = (Image)this.img.Clone();
graphics = Graphics.FromImage(image);
graphics.DrawRectangle(Pens.Black, rectStartPointF.X, rectStartPointF.Y, width, heigth);
textBox1.Size = new Size((int)width, (int)heigth);
textBox1.Location = sl;
graphics = this.CreateGraphics();
graphics.DrawImage(image, new Point(0, 0));
isdrew = true;
break;
}
case 3:
{
if (!md)
{
graphics = Graphics.FromImage(origin);
pen.EndCap = LineCap.ArrowAnchor;
pen.Width = 4;
graphics.DrawLine(pen, sl, p);
graphics = Graphics.FromImage(img);
graphics.DrawLine(pen, sl, p);
pen.Width = 1;
pen.EndCap = LineCap.NoAnchor;
graphics = this.CreateGraphics();
graphics.DrawImage(img, new Point(0, 0));
}
else
{
Image image = (Image)this.img.Clone();
graphics = Graphics.FromImage(image);
pen.EndCap = LineCap.ArrowAnchor;
pen.Width = 4;
graphics.DrawLine(pen, sl, p);
pen.Width = 1;
pen.EndCap = LineCap.NoAnchor;
graphics = this.CreateGraphics();
graphics.DrawImage(image, new Point(0, 0));
}
isdrew = true;
break;
}
case 4:
{
if (!md)
{
points.AddLine(p, p);
graphics = Graphics.FromImage(origin);
graphics.DrawPath(pen, points);
graphics = Graphics.FromImage(img);
graphics.DrawPath(pen, points);
graphics = this.CreateGraphics();
graphics.DrawImage(img, new Point(0, 0));
}
else
{
graphics = this.CreateGraphics();
points.AddLine(p, p);
graphics.DrawPath(pen, points);
}
isdrew = true;
break;
}
}
drew = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (drawing)
return;
if (!drew)
{
e.Graphics.DrawRectangle(new Pen(this.ForeColor), this.area);
for (int i = 1; i < 9; i )
{
e.Graphics.FillRectangle(new SolidBrush(Color.Blue), this.GetHandleRect(i));
}
}
if (draw && !inited)
{
Point p = new Point(area.Right, area.Bottom);
string str = Math.Abs(area.Width).ToString() " × " Math.Abs(area.Height).ToString();
e.Graphics.DrawString(str, new Font("宋体", 12, FontStyle.Bold), Brushes.White, new Point(p.X, p.Y - 30));
e.Graphics.FillRectangle(Brushes.Black, new Rectangle(new Point(p.X, p.Y - 30), new Size((int)e.Graphics.MeasureString(str, new Font("宋体", 12, FontStyle.Bold)).Width 4, 20)));
e.Graphics.DrawString(str, new Font("宋体", 12, FontStyle.Bold), Brushes.White, new Point(p.X, p.Y - 30));
}
if (inited && !drawing)
{
pictureBox1.Visible = true;
pictureBox1.Location = new Point(this.area.Left, this.area.Bottom 5);
pictureBox2.Visible = true;
pictureBox2.Location = new Point(this.area.Left 18, this.area.Bottom 5);
pictureBox8.Visible = true;
pictureBox8.Location = new Point(this.area.Left 36, this.area.Bottom 5);
pictureBox3.Visible = true;
pictureBox3.Location = new Point(this.area.Left 54, this.area.Bottom 5);
pictureBox4.Visible = true;
pictureBox4.Location = new Point(this.area.Left 72, this.area.Bottom 5);
pictureBox5.Visible = true;
pictureBox5.Location = new Point(this.area.Left 90, this.area.Bottom 5);
pictureBox6.Visible = true;
pictureBox6.Location = new Point(this.area.Left 108, this.area.Bottom 5);
pictureBox7.Visible = true;
pictureBox7.Location = new Point(this.area.Left 126, this.area.Bottom 5);
}
}
#endregion
#region DrawAREA
private int GetSelectedHandle(Point p)
{
int index = -1;
for (int i = 1; i < 9; i )
{
if (GetHandleRect(i).Contains(p))
{
index = i;
break;
}
}
if (this.area.Contains(p)) index = 0;
System.Diagnostics.Trace.WriteLine(area.ToString());
System.Diagnostics.Trace.WriteLine(p.ToString());
System.Diagnostics.Trace.WriteLine(index.ToString());
return index;
}
private void MoveHandleTo(Point point)
{
if (isdrew)
return;
int left = area.Left;
int top = area.Top;
int right = area.Right;
int bottom = area.Bottom;
switch (index)
{
case 0:
area.X = point.X - op.X;
area.Y = point.Y - op.Y;
this.op = point;
return;
case 1:
left = point.X;
top = point.Y;
break;
case 2:
top = point.Y;
break;
case 3:
right = point.X;
top = point.Y;
break;
case 4:
right = point.X;
break;
case 5:
right = point.X;
bottom = point.Y;
break;
case 6:
bottom = point.Y;
break;
case 7:
left = point.X;
bottom = point.Y;
break;
case 8:
left = point.X;
break;
}
this.op = point;
area.X = left;
area.Y = top;
area.Width = right - left;
area.Height = bottom - top;
}
private void SetCursor()
{
Cursor cr = Cursors.Default;
if (index == 1 || index == 5)
{
cr = Cursors.SizeNWSE;
}
else if (index == 2 || index == 6)
{
cr = Cursors.SizeNS;
}
else if (index == 3 || index == 7)
{
cr = Cursors.SizeNESW;
}
else if (index == 4 || index == 8)
{
cr = Cursors.SizeWE;
}
else if (index == 0)
{
cr = Cursors.Default;
}
Cursor.Current = cr;
}
private Rectangle GetHandleRect(int index)
{
Point point = GetHandle(index);
return new Rectangle(point.X - 3, point.Y - 3, 5, 5);
}
private Point GetHandle(int index)
{
int x, y, xCenter, yCenter;
xCenter = area.X area.Width / 2;
yCenter = area.Y area.Height / 2;
x = area.X;
y = area.Y;
switch (index)
{
case 1:
x = area.X;
y = area.Y;
break;
case 2:
x = xCenter;
y = area.Y;
break;
case 3:
x = area.Right;
y = area.Y;
break;
case 4:
x = area.Right;
y = yCenter;
break;
case 5:
x = area.Right;
y = area.Bottom;
break;
case 6:
x = xCenter;
y = area.Bottom;
break;
case 7:
x = area.X;
y = area.Bottom;
break;
case 8:
x = area.X;
y = yCenter;
break;
}
return new Point(x, y);
}
#endregion