简易截图工具(求散分)
下午做了建议截图工具,想弄的好看点,结果你懂得。
疑点如下:
1.进行截图时候如何显示截图的框框(就像QQ截图那样,截图时显示外框)
2.如何对鼠标箭头进行重绘
截图小工具中本想用于显示截图时候的框框的代码代码如下
private void Form2_MouseMove(object sender, MouseEventArgs e){ if (ismousedomn) { int width = Math.Abs(MousePosition.X - x); int height = Math.Abs(MousePosition.Y - y); Graphics g = this.CreateGraphics(); g = CreateGraphics(); g.DrawRectangle(new Pen(Color.Red,8),x<MousePosition.X?x:MousePosition.X,y<MousePosition.Y?y:MousePosition.Y,width+1,height+1); } }
}
public void AddOperate(
OperateType operateType,
Color color,
object data)
...{
OperateObject obj = new OperateObject(
operateType, color, data);
if (OperateList.Count > MaxOperateCount)
...{
OperateList.RemoveAt(0);
}
OperateList.Add(obj);
}
public bool RedoOperate()
...{
if (OperateList.Count > 0)
...{
OperateList.RemoveAt(OperateList.Count - 1);
return true;
}
return false;
}
public void Clear()
...{
OperateList.Clear();
}
IDisposable 成员#region IDisposable 成员
public void Dispose()
...{
if (_operateList != null)
...{
_operateList.Clear();
_operateList = null;
}
}
#endregion
}6、完成和保存截图。双击截图选择区域或者通过绘图工具栏的完成按钮和快捷菜单的完成项。当完成截图时,把选择的图形和所进行的画图操作全部绘制到一个新的Image中,把这个Image返回给用户。绘制通过下面这个函数实现:
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(
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;
}
}
}
7、取消截图。实现了跟QQ截图类似的取消截图方法,鼠标右键双击非选择的截图区域,或者点击绘图工具栏的退出按钮和快捷菜单的退出项。
8、改变颜色风格。实现了一个颜色表类CaptureImageToolColorTable,只需要继承这个类,相应的改变颜色,然后把CaptureImageTool的ColorTable设为它,就可以得到自己的不同的颜色风格了。看看颜色表类:
public class CaptureImageToolColorTable
...{
private static readonly Color _borderColor = Color.FromArgb(65, 173, 236);
private static readonly Color _backColorNormal = Color.FromArgb(229, 243, 251);
private static readonly Color _backColorHover = Color.FromArgb(65, 173, 236);
private static readonly Color _backColorPressed = Color.FromArgb(24, 142, 206);
private static readonly Color _foreColor = Color.FromArgb(12, 83, 124);
public CaptureImageToolColorTable() ...{ }
public virtual Color BorderColor
...{
get ...{ return _borderColor; }
}
public virtual Color BackColorNormal
...{
get ...{ return _backColorNormal; }
}
public virtual Color BackColorHover
...{
get ...{ return _backColorHover; }
}
public virtual Color BackColorPressed
...{
get ...{ return _backColorPressed; }
}
public virtual Color ForeColor
...{
get ...{ return _foreColor; }
}
}
9、改变鼠标样式。通过设置CaptureImageTool的SelectCursor和DrawCursor属性,可以改变截图和绘图时的鼠标样式,程序还提供了一个鼠标管理类CursorManager,你可以用它来设置自己的不同的鼠标,看看源代码:
internal class CursorManager
...{
public static readonly Cursor Arrow =
CreateCursor("Cursors//Arrow.cur");
public static readonly Cursor Cross =
CreateCursor("Cursors//Cross.cur");
public static readonly Cursor ArrowNew =
CreateCursor("Cursors//ArrowNew.cur");
public static readonly Cursor CrossNew =
CreateCursor("Cursors//CrossNew.cur");
private CursorManager() ...{ }
public Cursor CreateCursor(Bitmap cursor, Point hotPoint)
...{
int hotX = hotPoint.X;
int hotY = hotPoint.Y;
using (Bitmap cursorBmp = new Bitmap(
cursor.Width * 2 - hotX,
cursor.Height * 2 - hotY,
PixelFormat.Format32bppArgb))
...{
using (Graphics g = Graphics.FromImage(cursorBmp))
...{
g.Clear(Color.FromArgb(0, 0, 0, 0));
g.DrawImage(
cursor,
cursor.Width - hotX,
cursor.Height - hotY,
cursor.Width,
cursor.Height);
g.Flush();
}
return new Cursor(cursorBmp.GetHicon());
}
}
public static Cursor CreateCursor(string fileName)
...{
IntPtr cursorHandle = LoadCursorFromFile(fileName);
return new Cursor(cursorHandle);
}
[DllImport("user32.dll")]
private static extern IntPtr LoadCursorFromFile(string fileName);
[DllImport("user32.dll")]
private static extern uint DestroyCursor(IntPtr cursorHandle);
}