基本信息
源码名称:C# 仿qq截图功能 例子完整源码下载
源码大小:0.40M
文件格式:.rar
开发语言:C#
更新时间:2013-08-31
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
仿qq截图功能,如下图
仿qq截图功能,如下图
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Threading;
namespace CSharpWin_JD.CaptureImage
{
public partial class CaptureImageTool : Form
{
/// <summary>
/// 遮罩层颜色
/// </summary>
private static SolidBrush mask = new SolidBrush(Color.FromArgb(100, 0, 0, 0));
/// <summary>
/// 原始屏幕图
/// </summary>
private Image ScreenImage;
#region Fields
private Image _image;
private CaptureImageToolColorTable _colorTable;
private Cursor _selectCursor = Cursors.Default;
private Cursor _drawCursor = Cursors.Cross;
private Point _mouseDownPoint;
private Point _endPoint;
private bool _mouseDown;
private Rectangle _selectImageRect;
private Rectangle _selectImageBounds;
private bool _selectedImage;
private SizeGrip _sizeGrip;
private Dictionary<SizeGrip,Rectangle> _sizeGripRectList;
private OperateManager _operateManager;
private List<Point> _linePointList;
private static readonly Font TextFont =
new Font("Times New Roman", 12F, FontStyle.Bold, GraphicsUnit.Point, 0);
private static readonly string ToolTipStartCapture = "按住左键不放选择截图区域";
#endregion
#region Constructors
public CaptureImageTool()
{
InitializeComponent();
Init();
}
#endregion
#region Properties
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public CaptureImageToolColorTable ColorTable
{
get
{
if (_colorTable == null)
{
_colorTable = new CaptureImageToolColorTable();
}
return _colorTable;
}
set
{
_colorTable = value;
base.Invalidate();
SetControlColorTable();
}
}
private void SetControlColorTable()
{
CaptureImageToolColorTable colorTable = ColorTable;
ToolStripRendererEx renderer = new ToolStripRendererEx(colorTable);
contextMenuStrip.Renderer = renderer;
drawToolsControl.ColorTable = colorTable;
colorSelector.ColorTable = colorTable;
}
public Image Image
{
get { return _image; }
}
public Cursor SelectCursor
{
get { return _selectCursor; }
set { _selectCursor = value; }
}
public Cursor DrawCursor
{
get { return _drawCursor; }
set { _drawCursor = value; }
}
internal bool SelectedImage
{
get { return _selectedImage; }
set { _selectedImage = value; }
}
internal Rectangle SelectImageRect
{
get { return _selectImageRect; }
set
{
_selectImageRect = value;
if (!_selectImageRect.IsEmpty)
{
CalCulateSizeGripRect();
base.Invalidate();
}
}
}
internal SizeGrip SizeGrip
{
get { return _sizeGrip; }
set { _sizeGrip = value; }
}
internal Dictionary<SizeGrip, Rectangle> SizeGripRectList
{
get
{
if (_sizeGripRectList == null)
{
_sizeGripRectList = new Dictionary<SizeGrip,Rectangle>();
}
return _sizeGripRectList;
}
}
internal OperateManager OperateManager
{
get
{
if (_operateManager == null)
{
_operateManager = new OperateManager();
}
return _operateManager;
}
}
private DrawStyle DrawStyle
{
get { return drawToolsControl.DrawStyle; }
}
private Color SelectedColor
{
get { return colorSelector.SelectedColor; }
}
private int FontSize
{
get { return colorSelector.FontSize; }
}
private List<Point> LinePointList
{
get
{
if (_linePointList == null)
{
_linePointList = new List<Point>(100);
}
return _linePointList;
}
}
#endregion
#region Override Methods
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
toolTip.SetToolTip(this, ToolTipStartCapture);
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
Cursor = SelectCursor;
if (!SelectedImage)
{
this.Invalidate(true);
this.Update();
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (textBox.Visible)
{
if (SelectImageRect.Contains(e.Location) ||
e.Button == MouseButtons.Left)
{
string text = textBox.Text;
Font font = textBox.Font;
Color color = textBox.ForeColor;
HideTextBox();
if (OperateManager.OperateCount > 0)
{
OperateObject obj =
OperateManager.OperateList[OperateManager.OperateCount - 1];
if (obj.OperateType == OperateType.DrawText)
{
DrawTextData textData = obj.Data as DrawTextData;
if (!textData.Completed)
{
if (string.IsNullOrEmpty(text))
{
OperateManager.RedoOperate();
}
else
{
obj.Color = color;
textData.Font = font;
textData.Text = text;
textData.Completed = true;
}
}
}
}
}
base.Invalidate();
return;
}
if (e.Button == MouseButtons.Left)
{
if (SelectedImage)
{
if (SizeGrip != SizeGrip.None)
{
_mouseDown = true;
_mouseDownPoint = e.Location;
HideDrawToolsControl();
base.Invalidate();
}
if (DrawStyle != DrawStyle.None)
{
if (SelectImageRect.Contains(e.Location))
{
_mouseDown = true;
_mouseDownPoint = e.Location;
if (DrawStyle == DrawStyle.Line)
{
LinePointList.Add(_mouseDownPoint);
}
ClipCursor(false);
}
}
}
else
{
_mouseDown = true;
_mouseDownPoint = e.Location;
}
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (_mouseDown)
{
if (!SelectedImage)
{
SelectImageRect = GetSelectImageRect(e.Location);
}
else
{
if (DrawStyle != DrawStyle.None)
{
_endPoint = e.Location;
if (DrawStyle == DrawStyle.Line)
{
LinePointList.Add(_endPoint);
}
base.Invalidate();
}
else if (SizeGrip != SizeGrip.None)
{
ChangeSelctImageRect(e.Location);
}
}
}
else
{
if (!SelectedImage)
{
toolTip.SetToolTip(this, ToolTipStartCapture);
}
else
{
if (DrawStyle == DrawStyle.None)
{
if (OperateManager.OperateCount == 0)
{
SetSizeGrip(e.Location);
}
}
else
{
if(SelectImageRect.Contains(e.Location))
{
Cursor = DrawCursor;
}
else
{
Cursor = SelectCursor;
}
}
}
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
if (e.Button == MouseButtons.Left)
{
if (!SelectedImage)
{
SelectImageRect = GetSelectImageRect(e.Location);
if (!SelectImageRect.IsEmpty)
{
SelectedImage = true;
ShowDrawToolsControl();
}
}
else
{
_endPoint = e.Location;
base.Invalidate();
if (DrawStyle != DrawStyle.None)
{
ClipCursor(true);
AddOperate(e.Location);
}
else if (SizeGrip != SizeGrip.None)
{
_selectImageBounds = SelectImageRect;
ShowDrawToolsControl();
SizeGrip = SizeGrip.None;
}
}
_mouseDown = false;
_mouseDownPoint = Point.Empty;
}
else if (e.Button == MouseButtons.Right)
{
if (SelectedImage)
{
if (SelectImageRect.Contains(e.Location))
{
contextMenuStrip.Show(this, e.Location);
contextMenuStripVisible = true;
}
else
{
ResetSelectImage();
}
}
else
{
DialogResult = DialogResult.Cancel;
}
}
}
protected override void OnMouseDoubleClick(MouseEventArgs e)
{
base.OnMouseDoubleClick(e);
bool contains = SelectImageRect.Contains(e.Location);
if (e.Button == MouseButtons.Left)
{
if (contains)
{
DrawLastImage();
DialogResult = DialogResult.OK;
}
}
else if (e.Button == MouseButtons.Right)
{
if (!contains)
{
DialogResult = DialogResult.Cancel;
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
//if (SelectImageRect.IsEmpty)
//{
// base.OnPaint(e);
// return;
//}
base.OnPaint(e);
//将所选择区域原色显示
//画突出显示的部分
Graphics oldg = e.Graphics;
oldg.DrawImage(this.ScreenImage, SelectImageRect, SelectImageRect, GraphicsUnit.Pixel);
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
if (SelectImageRect.Width != 0 && SelectImageRect.Height != 0 )
{
Rectangle rect = SelectImageRect;
CaptureImageToolColorTable colorTable = ColorTable;
if (_mouseDown)
{
if (!SelectedImage || SizeGrip != SizeGrip.None)
{
using (SolidBrush brush = new SolidBrush(
Color.FromArgb(0, colorTable.BackColorNormal)))
{
g.FillRectangle(brush, rect);
}
DrawImageSizeInfo(g, rect);
}
}
using (Pen pen = new Pen(colorTable.BorderColor))
{
g.DrawRectangle(pen, rect);
using (SolidBrush brush = new SolidBrush(colorTable.BackColorPressed))
{
foreach (Rectangle sizeGripRect in SizeGripRectList.Values)
{
g.FillRectangle(
brush,
sizeGripRect);
}
}
}
DrawOperate(g);
if (DrawStyle != DrawStyle.None)
{
DrawTools(g, _endPoint);
}
}
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
if (_sizeGripRectList != null)
{
_sizeGripRectList.Clear();
_sizeGripRectList = null;
}
if (_operateManager != null)
{
_operateManager.Dispose();
_operateManager = null;
}
if (_linePointList != null)
{
_linePointList.Clear();
_linePointList = null;
}
_selectCursor = null;
_drawCursor = null;
}
#endregion
#region Draw Methods
private void DrawImageSizeInfo(Graphics g, Rectangle rect)
{
string text = string.Format(
"{0}x{1}",
rect.Width,
rect.Height);
Size textSize = TextRenderer.MeasureText(text, TextFont);
Rectangle screenBounds = Screen.GetBounds(this);
int x = 0;
int y = 0;
if (rect.X textSize.Width > screenBounds.Right - 3)
{
x = screenBounds.Right - textSize.Width - 3;
}
else
{
x = rect.X 2;
}
if (rect.Y - textSize.Width < screenBounds.Y 3)
{
y = rect.Y 2;
}
else
{
y = rect.Y - textSize.Height - 2;
}
Rectangle textRect = new Rectangle(
x, y, textSize.Width, textSize.Height);
g.FillRectangle(Brushes.Black, textRect);
TextRenderer.DrawText(
g,
text,
TextFont,
textRect,
Color.White);
}
private void DrawTools(Graphics g, Point point)
{
if (!SelectImageRect.Contains(_mouseDownPoint))
{
return;
}
Color color = SelectedColor;
switch (DrawStyle)
{
case DrawStyle.Rectangle:
using (Pen pen = new Pen(color))
{
g.DrawRectangle(
pen,
ImageBoundsToRect(Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
point.X,
point.Y)));
}
break;
case DrawStyle.Ellipse:
using (Pen pen = new Pen(color))
{
g.DrawEllipse(
pen,
ImageBoundsToRect(Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
point.X,
point.Y)));
}
break;
case DrawStyle.Arrow:
using (Pen pen = new Pen(color))
{
pen.EndCap = LineCap.ArrowAnchor;
pen.EndCap = LineCap.Custom;
pen.CustomEndCap = new AdjustableArrowCap(4, 4, true);
g.DrawLine(pen, _mouseDownPoint, point);
}
break;
case DrawStyle.Text:
using (Pen pen = new Pen(color))
{
pen.DashStyle = DashStyle.DashDot;
pen.DashCap = DashCap.Round;
pen.DashPattern = new float[] { 9f, 3f, 3f, 3f };
g.DrawRectangle(
pen,
ImageBoundsToRect(Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
point.X,
point.Y)));
}
break;
case DrawStyle.Line:
if (LinePointList.Count < 2)
{
return;
}
Point[] points = LinePointList.ToArray();
using (Pen pen = new Pen(color))
{
g.DrawLines(
pen,
points);
}
break;
}
}
private void DrawOperate(Graphics g)
{
foreach (OperateObject obj in OperateManager.OperateList)
{
switch (obj.OperateType)
{
case OperateType.DrawRectangle:
using (Pen pen = new Pen(obj.Color))
{
g.DrawRectangle(
pen,
(Rectangle)obj.Data);
}
break;
case OperateType.DrawEllipse:
using (Pen pen = new Pen(obj.Color))
{
g.DrawEllipse(
pen,
(Rectangle)obj.Data);
}
break;
case OperateType.DrawArrow:
Point[] points = obj.Data as Point[];
using (Pen pen = new Pen(obj.Color))
{
pen.EndCap = LineCap.Custom;
pen.CustomEndCap = new AdjustableArrowCap(4, 4, true);
g.DrawLine(pen, points[0], points[1]);
}
break;
case OperateType.DrawText:
DrawTextData textdata = obj.Data as DrawTextData;
if (string.IsNullOrEmpty(textdata.Text))
{
using (Pen pen = new Pen(obj.Color))
{
pen.DashStyle = DashStyle.DashDot;
pen.DashCap = DashCap.Round;
pen.DashPattern = new float[] { 9f, 3f, 3f, 3f };
g.DrawRectangle(
pen,
textdata.TextRect);
}
}
else
{
using (SolidBrush brush = new SolidBrush(obj.Color))
{
g.DrawString(
textdata.Text,
textdata.Font,
brush,
textdata.TextRect);
}
}
break;
case OperateType.DrawLine:
using (Pen pen = new Pen(obj.Color))
{
g.DrawLines(pen, obj.Data as Point[]);
}
break;
}
}
}
private void DrawLastImage()
{
using (Bitmap allBmp = new Bitmap(
Width, Height, PixelFormat.Format32bppArgb))
{
using (Graphics allGraphics = Graphics.FromImage(allBmp))
{
allGraphics.InterpolationMode =
InterpolationMode.HighQualityBicubic;
allGraphics.SmoothingMode = SmoothingMode.AntiAlias;
//使用原始图片获取截图(涂剑凯修改)
allGraphics.DrawImage(ScreenImage, Point.Empty);
//使用窗体背景图片截图(原版)
//allGraphics.DrawImage(BackgroundImage,Point.Empty);
DrawOperate(allGraphics);
allGraphics.Flush();
Bitmap bmp = new Bitmap(
SelectImageRect.Width,
SelectImageRect.Height,
PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(
allBmp,
0,
0,
SelectImageRect,
GraphicsUnit.Pixel);
g.Flush();
g.Dispose();
_image = bmp;
}
}
//将图片放到剪贴板(涂剑凯添加)
Clipboard.SetDataObject(this.Image,true);
}
#endregion
#region Events Methods
private void ColorSelectorColorChanged(object sender, EventArgs e)
{
if (DrawStyle == DrawStyle.Text && textBox.Visible)
{
textBox.ForeColor = SelectedColor;
}
}
private void DrawToolsControlButtonDrawStyleClick(object sender, EventArgs e)
{
switch (DrawStyle)
{
case DrawStyle.Rectangle:
case DrawStyle.Ellipse:
case DrawStyle.Arrow:
case DrawStyle.Line:
colorSelector.Reset();
ShowColorSelector();
if (SizeGrip != SizeGrip.None)
{
SizeGrip = SizeGrip.None;
}
break;
case DrawStyle.Text:
colorSelector.ChangeToFontStyle();
ShowColorSelector();
if (SizeGrip != SizeGrip.None)
{
SizeGrip = SizeGrip.None;
}
break;
case DrawStyle.None:
HideColorSelector();
break;
}
}
private void DrawToolsControlButtonRedoClick(object sender, EventArgs e)
{
if (OperateManager.OperateCount > 0)
{
OperateManager.RedoOperate();
base.Invalidate();
}
else
{
if (SelectedImage)
{
ResetSelectImage();
base.Invalidate();
}
}
}
private void DrawToolsControlButtonSaveClick(object sender, EventArgs e)
{
if (SelectedImage)
{
//默认文件名
//saveFileDialog.FileName = "JD" DateTime.Now.ToString("yyyyMMddHHmmss") "_" new Random().Next(1000000, 9999999) "." saveFileDialog.DefaultExt;
saveFileDialog.FileName = "JD" DateTime.Now.ToString("yyyyMMddHHmmss") "." saveFileDialog.DefaultExt;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
DrawLastImage();
string fileName = saveFileDialog.FileName;
int index = fileName.LastIndexOf('.');
string extion = fileName.Substring(
index 1, fileName.Length - index - 1);
extion = extion.ToLower();
ImageFormat imageFormat = ImageFormat.Bmp;
switch (extion)
{
case "jpg":
case "jpeg":
imageFormat = ImageFormat.Jpeg;
break;
case "png":
imageFormat = ImageFormat.Png;
break;
case "gif":
imageFormat = ImageFormat.Gif;
break;
}
Image.Save(saveFileDialog.FileName, imageFormat);
DialogResult = DialogResult.Cancel;
this.Close();
}
}
else
{
MessageBox.Show("请先选择图像。", "截图", MessageBoxButtons.OK);
}
}
private void DrawToolsControlButtonAcceptClick(object sender, EventArgs e)
{
if (SelectedImage)
{
DrawLastImage();
DialogResult = DialogResult.OK;
}
else
{
DialogResult = DialogResult.Cancel;
}
}
private void DrawToolsControlButtonExitClick(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
private void MenuItemReselectClick(object sender, EventArgs e)
{
if (SelectedImage)
{
ResetSelectImage();
}
}
private void TextBoxExLostFocus(object sender, EventArgs e)
{
if (textBox.Visible)
{
string text = textBox.Text;
Font font = textBox.Font;
Color color = textBox.ForeColor;
HideTextBox();
if (OperateManager.OperateCount > 0)
{
OperateObject obj =
OperateManager.OperateList[OperateManager.OperateCount - 1];
if (obj.OperateType == OperateType.DrawText)
{
DrawTextData textData = obj.Data as DrawTextData;
if (!textData.Completed)
{
if (string.IsNullOrEmpty(text))
{
OperateManager.RedoOperate();
}
else
{
obj.Color = color;
textData.Font = font;
textData.Text = text;
textData.Completed = true;
}
}
}
}
base.Invalidate();
}
}
#endregion
#region Private Methods
private void Init()
{
SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
//双缓冲绘制,避免闪烁
//this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
drawToolsControl.Visible = false;
colorSelector.Visible = false;
textBox.Visible = false;
this.TopMost = true;
this.ShowInTaskbar = false;
this.FormBorderStyle = FormBorderStyle.None;
//Bounds = Screen.GetBounds(this);
this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
//保留当前屏
ScreenImage = GetDestopImage();
//复制当前屏
Image BackScreen = new Bitmap(ScreenImage);
Graphics g = Graphics.FromImage(BackScreen);
//画遮罩
g.FillRectangle(mask, 0, 0, BackScreen.Width, BackScreen.Height);
g.Dispose();
//将有遮罩的图像作为背景
this.BackgroundImage = BackScreen;
//BackgroundImage = GetDestopImage();
try
{
_selectCursor = new Cursor(Properties.Resources.Arrow_M.Handle);
}
catch{}
Cursor = SelectCursor;
contextMenuStrip.Renderer = new ToolStripRendererEx();
textBox.LostFocus = new EventHandler(TextBoxExLostFocus);
colorSelector.ColorChanged = new EventHandler(
ColorSelectorColorChanged);
drawToolsControl.ButtonExitClick = new EventHandler(
DrawToolsControlButtonExitClick);
drawToolsControl.ButtonAcceptClick = new EventHandler(
DrawToolsControlButtonAcceptClick);
drawToolsControl.ButtonSaveClick = new EventHandler(
DrawToolsControlButtonSaveClick);
drawToolsControl.ButtonRedoClick = new EventHandler(
DrawToolsControlButtonRedoClick);
drawToolsControl.ButtonDrawStyleClick = new EventHandler(
DrawToolsControlButtonDrawStyleClick);
menuItemExit.Click = new EventHandler(
DrawToolsControlButtonExitClick);
menuItemAccept.Click = new EventHandler(
DrawToolsControlButtonAcceptClick);
menuItemSave.Click = new EventHandler(
DrawToolsControlButtonSaveClick);
menuItemRedo.Click = new EventHandler(
DrawToolsControlButtonRedoClick);
menuItemReselect.Click = new EventHandler(
MenuItemReselectClick);
}
/// <summary>
/// 截取完整屏幕图片
/// </summary>
/// <returns></returns>
private Image GetDestopImage()
{
Rectangle rect = Screen.GetBounds(this);
Bitmap bmp = new Bitmap(
rect.Width, rect.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
IntPtr gHdc = g.GetHdc();
IntPtr deskHandle = NativeMethods.GetDesktopWindow();
IntPtr dHdc = NativeMethods.GetDC(deskHandle);
NativeMethods.BitBlt(
gHdc,
0,
0,
Width,
Height,
dHdc,
0,
0,
NativeMethods.TernaryRasterOperations.SRCCOPY);
NativeMethods.ReleaseDC(deskHandle, dHdc);
g.ReleaseHdc(gHdc);
return bmp;
}
private Rectangle GetSelectImageRect(Point endPoint)
{
_selectImageBounds = Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
endPoint.X,
endPoint.Y);
return ImageBoundsToRect(_selectImageBounds);
}
private void CalCulateSizeGripRect()
{
Rectangle rect = SelectImageRect;
int x = rect.X;
int y = rect.Y;
int centerX = x rect.Width / 2;
int centerY = y rect.Height / 2;
Dictionary<SizeGrip,Rectangle> list = SizeGripRectList;
list.Clear();
list.Add(
SizeGrip.TopLeft,
new Rectangle(x - 2, y - 2, 5, 5));
list.Add(
SizeGrip.TopRight,
new Rectangle(rect.Right - 2, y - 2, 5, 5));
list.Add(
SizeGrip.BottomLeft,
new Rectangle(x - 2, rect.Bottom - 2, 5, 5));
list.Add(
SizeGrip.BottomRight,
new Rectangle(rect.Right - 2, rect.Bottom - 2, 5, 5));
list.Add(
SizeGrip.Top,
new Rectangle(centerX - 2, y - 2, 5, 5));
list.Add(
SizeGrip.Bottom,
new Rectangle(centerX - 2, rect.Bottom - 2, 5, 5));
list.Add(
SizeGrip.Left,
new Rectangle(x - 2, centerY - 2, 5, 5));
list.Add(
SizeGrip.Right,
new Rectangle(rect.Right - 2, centerY - 2, 5, 5));
}
private void SetSizeGrip(Point point)
{
SizeGrip = SizeGrip.None;
foreach (SizeGrip sizeGrip in SizeGripRectList.Keys)
{
if (SizeGripRectList[sizeGrip].Contains(point))
{
SizeGrip = sizeGrip;
break;
}
}
if (SizeGrip == SizeGrip.None)
{
if (SelectImageRect.Contains(point))
{
SizeGrip = SizeGrip.All;
}
}
switch (SizeGrip)
{
case SizeGrip.TopLeft:
case SizeGrip.BottomRight:
Cursor = Cursors.SizeNWSE;
break;
case SizeGrip.TopRight:
case SizeGrip.BottomLeft:
Cursor = Cursors.SizeNESW;
break;
case SizeGrip.Top:
case SizeGrip.Bottom:
Cursor = Cursors.SizeNS;
break;
case SizeGrip.Left:
case SizeGrip.Right:
Cursor = Cursors.SizeWE;
break;
case SizeGrip.All:
Cursor = Cursors.SizeAll;
break;
default:
Cursor = SelectCursor;
break;
}
}
private void ChangeSelctImageRect(Point point)
{
Rectangle rect = _selectImageBounds;
int left = rect.Left;
int top = rect.Top;
int right = rect.Right;
int bottom = rect.Bottom;
bool sizeGripAll = false;
switch (SizeGrip)
{
case SizeGrip.All:
rect.Offset(
point.X - _mouseDownPoint.X, point.Y - _mouseDownPoint.Y);
sizeGripAll = true;
break;
case SizeGrip.TopLeft:
left = point.X;
top = point.Y;
break;
case SizeGrip.TopRight:
right = point.X;
top = point.Y;
break;
case SizeGrip.BottomLeft:
left = point.X;
bottom = point.Y;
break;
case SizeGrip.BottomRight:
right = point.X;
bottom = point.Y;
break;
case SizeGrip.Top:
top = point.Y;
break;
case SizeGrip.Bottom:
bottom = point.Y;
break;
case SizeGrip.Left:
left = point.X;
break;
case SizeGrip.Right:
right = point.X;
break;
}
//_selectImageBounds = rect;
if (!sizeGripAll)
{
rect.X = left;
rect.Y = top;
rect.Width = right - left;
rect.Height = bottom - top;
}
_mouseDownPoint = point;
_selectImageBounds = rect;
SelectImageRect = ImageBoundsToRect(rect); ;
}
private Rectangle ImageBoundsToRect(Rectangle bounds)
{
Rectangle rect = bounds;
int x = 0;
int y = 0;
x = Math.Min(rect.X, rect.Right);
y = Math.Min(rect.Y, rect.Bottom);
rect.X = x;
rect.Y = y;
rect.Width = Math.Max(1, Math.Abs(rect.Width));
rect.Height = Math.Max(1, Math.Abs(rect.Height));
return rect;
}
private void ResetSelectImage()
{
SelectedImage = false;
_selectImageBounds = Rectangle.Empty;
SelectImageRect = Rectangle.Empty;
SizeGrip = SizeGrip.None;
HideDrawToolsControl();
if (textBox.Visible)
{
HideTextBox();
}
OperateManager.Clear();
base.Invalidate();
}
private void ShowDrawToolsControl()
{
Rectangle rect = SelectImageRect;
Rectangle screenBounds = Screen.GetBounds(this);
int x = rect.Right - drawToolsControl.Width - 2;
int y = 0;
DrawToolsDockStyle dockStyle = DrawToolsDockStyle.None;
if (rect.Bottom drawToolsControl.Height 2 <= screenBounds.Bottom)
{
y = rect.Bottom 2;
dockStyle = DrawToolsDockStyle.Bottom;
}
else if (rect.Y - drawToolsControl.Height - 2 >= screenBounds.Top)
{
y = rect.Y - drawToolsControl.Height - 2;
dockStyle = DrawToolsDockStyle.Top;
}
else
{
y = rect.Bottom - drawToolsControl.Height - 2;
dockStyle = DrawToolsDockStyle.BottomUp;
}
drawToolsControl.DrawToolsDockStyle = dockStyle;
drawToolsControl.Location = new Point(x, y);
drawToolsControl.Visible = true;
}
private void HideDrawToolsControl()
{
drawToolsControl.Visible = false;
drawToolsControl.ResetDrawStyle();
HideColorSelector();
}
private void ShowColorSelector()
{
int x = 0;
int y = 0;
Rectangle rect = drawToolsControl.Bounds;
Rectangle screenBounds = Screen.GetBounds(this);
switch (drawToolsControl.DrawToolsDockStyle)
{
case DrawToolsDockStyle.Top:
case DrawToolsDockStyle.BottomUp:
x = rect.X;
y = rect.Y - colorSelector.Height - 2;
break;
case DrawToolsDockStyle.Bottom:
x = rect.X;
y = rect.Bottom 2;
break;
}
colorSelector.Location = new Point(x, y);
colorSelector.Visible = true;
}
private void HideColorSelector()
{
if (colorSelector.Visible)
{
colorSelector.Visible = false;
colorSelector.Reset();
}
}
/// <summary>
/// 显示添加文字的输入框
/// </summary>
private void ShowTextBox()
{
if (SelectImageRect.Contains(_mouseDownPoint))
{
Rectangle bounds = ImageBoundsToRect(
Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
_endPoint.X,
_endPoint.Y));
bounds.Inflate(-1, -1);
textBox.Bounds = bounds;
textBox.Text = "";
textBox.ForeColor = SelectedColor;
textBox.Font = new Font(
textBox.Font.FontFamily,
(float)FontSize);
textBox.Visible = true;
textBox.Focus();
}
}
/// <summary>
/// 隐藏添加文字的输入框
/// </summary>
private void HideTextBox()
{
textBox.Visible = false;
textBox.Text = string.Empty;
}
private void AddOperate(Point point)
{
if (!SelectImageRect.Contains(_mouseDownPoint))
{
return;
}
Color color = SelectedColor;
switch (DrawStyle)
{
case DrawStyle.Rectangle:
OperateManager.AddOperate(
OperateType.DrawRectangle,
color,
ImageBoundsToRect(Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
point.X,
point.Y)));
break;
case DrawStyle.Ellipse:
OperateManager.AddOperate(
OperateType.DrawEllipse,
color,
ImageBoundsToRect(Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
point.X,
point.Y)));
break;
case DrawStyle.Arrow:
Point[] points = new Point[] { _mouseDownPoint, point };
OperateManager.AddOperate(
OperateType.DrawArrow,
color,
points);
break;
case DrawStyle.Text:
ShowTextBox();
Rectangle textRect = ImageBoundsToRect(Rectangle.FromLTRB(
_mouseDownPoint.X,
_mouseDownPoint.Y,
point.X,
point.Y));
DrawTextData textData = new DrawTextData(
string.Empty,
base.Font,
textRect);
OperateManager.AddOperate(
OperateType.DrawText,
color,
textData);
break;
case DrawStyle.Line:
if (LinePointList.Count < 2)
{
return;
}
OperateManager.AddOperate(
OperateType.DrawLine,
color,
LinePointList.ToArray());
LinePointList.Clear();
break;
}
}
private void ClipCursor(bool reset)
{
Rectangle rect;
if (reset)
{
rect = Screen.GetBounds(this);
}
else
{
rect = SelectImageRect;
}
NativeMethods.RECT nativeRect = new NativeMethods.RECT(rect);
NativeMethods.ClipCursor(ref nativeRect);
}
#endregion
/// <summary>
/// 键盘事件响应
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CaptureImageTool_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
//按下ESC,首先退出右键菜单,再退出截图
if (contextMenuStripVisible)
{
contextMenuStrip.Hide();
contextMenuStripVisible = false;
}
else
{
DialogResult = DialogResult.Cancel;
this.Close();
}
}
}
/// <summary>
/// 右键菜单是否显示状态
/// </summary>
private bool contextMenuStripVisible = false;
}
}