在开发WinForm应用程序时,实现一个支持缩放、滚动、居中和调整大小的2D绘图组件并不常见。虽然CodeProject上有大量相关主题的文章,但它们通常都是针对特定项目编写的,并且大多数是使用WPF或C++编写的。许多文章专注于图片的缩放和调整大小,但很少有关于简单的WinForm 2D绘图的文章。本文介绍的项目使用了一个简单的PictureBox来管理绘图,因此不需要大量的后端代码。
DrawingWindow组件是一个简单的UserControl,里面包含了一个PictureBox。PictureBox包含了一个位图,该位图通过用户绘图回调事件填充。位图的大小、背景颜色、缩放、缩放因子和边距都是控件的属性。坐标系统以左下角为参考,并考虑了边距。位图根据缩放、缩放因子和滚动位置在控件中定位。
要使用DrawingWindow UserControl,只需将其放入Form或另一个UserControl中,设置属性并连接事件即可。
在本示例中,DrawingSize设置为A4格式,210毫米x297毫米。初始ZoomFactor设置为2。要放大或缩小,只需将ZoomFactor设置为另一个值,如下所示:
/// Zoom In
drawingWindow.ZoomFactor *= 2;
/// Zoom Out
drawingWindow.ZoomFactor /= 2;
DrawClientCenterPoint属性仅用于调试!
以下是事件的回调,用于绘制:
/// 这是用于绘制绘图的回调
public EventHandler<PaintEventArgs> DrawingPaint;
/// 当鼠标在绘图上移动时调用
public EventHandler<MouseEventArgs> DrawingMouseMove;
DrawingPaint事件是绘制的回调。PaintEventArgs与标准绘制事件相同。它包含一个Graphics对象,根据定义的矩形(例如,本例中的(210;297))进行矩阵平移。
以下是一些方法:
/// 重新绘制绘图
public void Redraw();
/// 将绘图居中到客户矩形
public void Center();
/// 根据客户矩形调整绘图的大小
public void ResizeDrawing(bool resize);
/// 获取定义了缩放因子的图像(用于保存或打印)
public Image GetImage(float zoomFactor, Rectangle bounce);