using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinformImg
{
public partial class RulerForm : Form
{
int zoom = 2;//缩放比例
int _pxwidth = 0;//每毫米包含多少个像素,这是一个粗略的估算值,用于在不同的分辨率下,画布的大小基本一致
public int Pxwidth
{
get { return _pxwidth * zoom; }
set { _pxwidth = value; }
}
int _canvasWidth = 210;//画布的宽度
public int CanvasWidth
{
get { return _canvasWidth; }
set { _canvasWidth = value; }
}
int _canvasHeight = 148;//画布的高度
public int CanvasHeight
{
get { return _canvasHeight; }
set { _canvasHeight = value; }
}
Panel canvas = new Panel();//画布
TextBox lineX = new TextBox();//横坐标游标
TextBox lineY = new TextBox();//纵坐标游标
public RulerForm()
{
InitializeComponent();
this.CanvasHeight = 148;//设置画布的高度
this.CanvasWidth = 210;//设置画布的宽度
Calcsale();//计算每毫米的像素数量
}
/// <summary>
/// 加载画布和游标卡尺
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RulerForm_Load(object sender, EventArgs e)
{
canvas.Width = this.CanvasWidth * this.Pxwidth;//将毫米宽度转换为像素宽度
canvas.Height = this.CanvasHeight * this.Pxwidth;//将毫米高度转换为像素高度
canvas.Top = 20;
canvas.Left = 20;
canvas.BackColor = Color.White;
canvas.Paint += Canvas_Paint;
canvas.MouseMove += Canvas_MouseMove;
this.Controls.Add(canvas);
//标尺
lineX.Width = 1;
lineX.Height = 14;
lineX.Top = 6;
lineX.BackColor = Color.Red;
lineX.Multiline = true;
lineX.Visible = false;
this.Controls.Add(lineX);
//标尺
lineY.Width = 14;
lineY.Height = 1;
lineY.Left = 6;
lineY.BackColor = Color.Red;
lineY.Multiline = true;
lineY.Visible = false;
this.Controls.Add(lineY);
this.Width = canvas.Width + 40;
this.Height = canvas.Height + 40;
}
/// <summary>
/// 画作标尺
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RulerForm_Paint(object sender, PaintEventArgs e)
{
var grap = e.Graphics;
//画布区域
Rectangle rect = new Rectangle(20, 20, this.CanvasWidth * this.Pxwidth, this.CanvasHeight * this.Pxwidth);
grap.DrawRectangle(new Pen(Color.Black, 1), rect);
SetXRuler(ref grap);//画横坐标
SetYRuler(ref grap);//画纵坐标
}
/// <summary>
/// 画网格线
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Canvas_Paint(object sender, PaintEventArgs e)
{
Graphics grap = e.Graphics;
//画布区域
Rectangle rect = new Rectangle(0, 0, this.CanvasWidth * this.Pxwidth, this.CanvasHeight * this.Pxwidth);
grap.DrawRectangle(new Pen(Color.Black, 1), rect);
//画网格,每5mm一个点
Pen pen = new Pen(Color.Gray, 1);
pen.DashStyle = DashStyle.Dot;
pen.DashPattern = new float[] { 1, 5 * this.Pxwidth - 1 };//点长度1px,点间空白4mm
for (var i = 0; i < this.CanvasWidth; i = i + 5)
{
grap.DrawLine(pen, i * this.Pxwidth, 0, i * this.Pxwidth, this.CanvasHeight * this.Pxwidth);
}
}
/// <summary>
/// 鼠标移动事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
lineX.Visible = true;
lineY.Visible = true;
lineX.Location = new Point(20 + e.X, 6);
lineY.Location = new Point(6, 20 + e.Y);
}
#region 私有方法
[DllImport("gdi32.dll")]
public static extern int GetDeviceCaps(IntPtr hdc, int Index);
/// <summary>
/// 计算精度 确保在不同分辨率的机子上刻度的准确性
/// </summary>
private void Calcsale()
{
PictureBox p = new PictureBox();
Graphics g = Graphics.FromHwnd(p.Handle);
IntPtr hdc = g.GetHdc();
//GetDeviceCaps(hdc, 4)方法中,第二个参数意义:4毫米为单位屏幕宽度,6毫米为单位屏幕高度,8像素为单位的屏幕宽度10像素为单位的屏幕高度
int width = GetDeviceCaps(hdc, 4);
int pix = GetDeviceCaps(hdc, 8);
this.Pxwidth = pix / width;
}
/// <summary>
/// 画横坐标
/// </summary>
/// <param name="grap"></param>
private void SetXRuler(ref Graphics grap)
{
Pen pen = new Pen(Color.Black, 1);
int count = 0;
//一个单位画一格
for (int i = 0; i <= this.CanvasWidth; i++)
{
if (count % 10 == 0)
{
grap.DrawLine(pen, 20 + i * this.Pxwidth, 5, 20 + i * this.Pxwidth, 20);
grap.DrawString(count.ToString(), new Font("宋体", 8), new SolidBrush(Color.Black), 20 + i * this.Pxwidth + 2, 2, new StringFormat());
}
else if (count % 5 == 0)
{
grap.DrawLine(pen, 20 + i * this.Pxwidth, 12, 20 + i * this.Pxwidth, 20);
}
else
{
grap.DrawLine(pen, 20 + i * this.Pxwidth, 15, 20 + i * this.Pxwidth, 20);
}
count++;
}
}
/// <summary>
/// 画纵坐标
/// </summary>
/// <param name="grap"></param>
private void SetYRuler(ref Graphics grap)
{
Pen pen = new Pen(Color.Black, 1);
int count = 0;
//设置刻度上面显示数字垂直显示
StringFormat stringFormat = new StringFormat();
stringFormat.FormatFlags = StringFormatFlags.DirectionVertical;
//一个单位画一格
for (int i = 0; i <= this.CanvasHeight; i++)
{
if (count % 10 == 0)
{
grap.DrawLine(pen, 5, 20 + i * this.Pxwidth, 20, 20 + i * this.Pxwidth);
grap.DrawString(count.ToString(), new Font("宋体", 8), new SolidBrush(Color.Black), 2, 20 + i * this.Pxwidth + 2, stringFormat);
}
else if (count % 5 == 0)
{
grap.DrawLine(pen, 12, 20 + i * this.Pxwidth, 20, 20 + i * this.Pxwidth);
}
else
{
grap.DrawLine(pen, 15, 20 + i * this.Pxwidth, 20, 20 + i * this.Pxwidth);
}
count++;
}
}
#endregion
}
}