先来个整体效果
点击线条之后
鼠标放中间蓝色小块上改变位置,放两侧红块上随鼠标改变线的方向和长度
以及画四边框时的选定和改变样式
饭一口一口吃
先来实现个简单的 ,实现画布和主控大脑以及鼠标标识
先实现画布接口 IMyCanvas,主控大脑接口 IParents
/// <summary>
/// 画布接口
/// </summary>
public interface IMyCanvas
{
// 画布宽
double width { get; }
// 画布高
double height { get; }
Point HideFouce(Point poi);
/// <summary>
/// 设置Presenter
/// </summary>
void SetPresenter(IParents controller);
/// <summary>
/// 添加子元素
/// </summary>
void AddChild(object child);
/// <summary>
/// 删除子元素
/// </summary>
void RemoveChild(object child);
/// <summary>
/// 重绘
/// </summary>
void Repaint();
void Repaint(double x, double y, double width, double height);
}
/// <summary>
/// 大脑接口
/// </summary>
public interface IParents
{
IMyCanvas canvas { get; }
void OnPaintCanvas(PaintEventArgs e);
void OnResize(EventArgs e);
void OnMouseDown(MouseEventArgs e);
void OnMouseUp(MouseEventArgs e);
void OnMouseMove(MouseEventArgs e);
void OnMouseDoubleClick(MouseEventArgs e);
void OnMouseWheel(MouseEventArgs e);
void OnKeyDown(KeyEventArgs e);
void OnKeyUp(KeyEventArgs e);
}
添加鼠标类 MousePoint,负责大部分后续与鼠标的交互功能
class MousePoint
{
private Bitmap _bitmap = null;
private Presenter _presenter = null;
private PointF _point = new PointF();
internal MousePoint(Presenter presenter)
{
_presenter = presenter;
UpdateBitmap();
}
private void UpdateBitmap()//鼠标标识
{
_bitmap = new Bitmap(50, 50);
Graphics graphics = Graphics.FromImage(_bitmap);
Pen pen = new Pen(Color.Red);
graphics.DrawLine(pen,
_bitmap.Width / 2, 0,
_bitmap.Width / 2, _bitmap.Height);
graphics.DrawLine(pen,
0, _bitmap.Height / 2,
_bitmap.Width, _bitmap.Height / 2);
}
internal void OnPaint(Graphics graphics)
{
//图像为一个十字架,画图位置为图像左上角的位置,让点击的点成为十字架的中心
graphics.DrawImage(_bitmap, (float)(_point.X - _bitmap.Width / 2), (float)(_point.Y - _bitmap.Height / 2));
}
internal void OnMouseMove(MouseEventArgs e)
{
_point = e.Location;
_presenter.RepaintCanvas();
}
}
添加主控大脑类 Presenter(重要)
class Presenter : IParents
{
/// <summary>
/// 画布
/// </summary>
private IMyCanvas _canvas = null;
/// <summary>
/// 鼠标标识
/// </summary>
private MousePoint _point = null;
public Presenter(IMyCanvas canvas)
{
_canvas = canvas;
_point = new MousePoint(this);
}
public IMyCanvas canvas
{
get
{
return _canvas;
}
}
/// <summary>
/// 鼠标在画布上按下时,调用主导的按下方法
/// </summary>
/// <param name="e"></param>
public void OnMouseDown(MouseEventArgs e)
{
}
/// <summary>
/// 鼠标在画布上挪动时,触发主导的鼠标移动事件
/// </summary>
/// <param name="e"></param>
public void OnMouseMove(MouseEventArgs e)
{
_point.OnMouseMove(e);
}
public void OnMouseUp(MouseEventArgs e)
{
}
public void OnKeyDown(KeyEventArgs e)
{
}
public void OnKeyUp(KeyEventArgs e)
{
}
public void OnMouseDoubleClick(MouseEventArgs e)
{
}
public void OnResize(EventArgs e)
{
RepaintCanvas(true);
}
public void OnMouseWheel(MouseEventArgs e)
{
}
internal void RepaintCanvas(bool bufferBitmapToRedraw = false)
{
_canvas.Repaint();
}
/// <summary>
/// 主要绘图的方法
/// </summary>
/// <param name="e"></param>
public void OnPaintCanvas(PaintEventArgs e)
{
//画出鼠标点
_point.OnPaint(e.Graphics);
}
}
添加画布自定义控件 CanavsControl
public partial class CanavsControl : UserControl, IMyCanvas
{
private IParents _presenter = null;
// 画布宽
public double width
{
get { return this.ClientRectangle.Width; }
}
// 画布高
public double height
{
get { return this.ClientRectangle.Height; }
}
public CanavsControl()
{
InitializeComponent();
//防止界面闪烁
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}
/// <summary>
/// 设置画布的主导对象
/// </summary>
/// <param name="presenter"></param>
public void SetPresenter(IParents presenter)
{
_presenter = presenter;
}
/// <summary>
/// 在画布中添加控件
/// </summary>
/// <param name="child"></param>
public void AddChild(object child)
{
this.Controls.Add((Control)child);
Control thiscontrol = (Control)child;
thiscontrol.Focus();
}
/// <summary>
/// 在画布中删除控件
/// </summary>
/// <param name="child"></param>
public void RemoveChild(object child)
{
this.Controls.Remove((Control)child);
}
public Point HideFouce(Point poi)
{
return this.PointToClient(poi);
}
/// <summary>
/// 画布重绘图形
/// </summary>
public void Repaint()
{
Invalidate();
}
public void Repaint(double x, double y, double width, double height)
{
Invalidate(new Rectangle((int)x, (int)y, (int)width, (int)height));
}
#region 画布上的鼠标事件,调用主导的事件
protected override void OnPaint(PaintEventArgs e)
{
_presenter.OnPaintCanvas(e);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
if (_presenter != null)
{
_presenter.OnResize(e);
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
_presenter.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
_presenter.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
_presenter.OnMouseMove(e);
}
protected override void OnMouseDoubleClick(MouseEventArgs e)
{
base.OnMouseDoubleClick(e);
_presenter.OnMouseDoubleClick(e);
}
protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
_presenter.OnMouseWheel(e);
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
_presenter.OnKeyDown(e);
}
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
_presenter.OnKeyUp(e);
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
Cursor.Hide();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
Cursor.Show();
}
#endregion
}
添加个窗体Form1
public partial class Form1 : Form
{
private Presenter _presenter = null;
private CanavsControl _canvas = null;//画布
public Form1()
{
InitializeComponent();
_canvas = new CanavsControl();
_presenter = new Presenter(_canvas);
_canvas.Dock = DockStyle.Fill;
_canvas.SetPresenter(_presenter);
this.Controls.Add(_canvas);
}
}
运行
初步OK。