382 lines
14 KiB
C#
382 lines
14 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Drawing.Printing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Windows.Forms;
|
||
|
||
namespace Io.Github.Kerwinxu.LibShapes.Core.Paper
|
||
{
|
||
|
||
public partial class FrmPaperSetting : Form , IPaperSetting
|
||
{
|
||
|
||
/// <summary>
|
||
/// 修改的是这个变量
|
||
/// </summary>
|
||
private Paper paper = new Paper();
|
||
|
||
/// <summary>
|
||
/// 这个是要返回的
|
||
/// </summary>
|
||
private Paper result;
|
||
|
||
public FrmPaperSetting()
|
||
{
|
||
InitializeComponent();
|
||
init_printer();
|
||
}
|
||
|
||
public FrmPaperSetting(Paper paper):this()
|
||
{
|
||
this.paper = paper;
|
||
isOnlyOne = true;
|
||
paper_to_ui();
|
||
isOnlyOne = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始化打印机
|
||
/// </summary>
|
||
private void init_printer()
|
||
{
|
||
foreach (var item in PrinterSettings.InstalledPrinters)
|
||
{
|
||
comboPrinters.Items.Add(item);
|
||
}
|
||
|
||
}
|
||
|
||
public Paper GetPaper()
|
||
{
|
||
return this.result;
|
||
//throw new NotImplementedException();
|
||
}
|
||
|
||
|
||
private bool isOnlyOne;
|
||
|
||
/// <summary>
|
||
/// 界面上数据发生改变
|
||
/// </summary>
|
||
private void change()
|
||
{
|
||
// 有这个标志,表示当前只能有一个在修改。
|
||
if (isOnlyOne)
|
||
{
|
||
return;
|
||
}
|
||
|
||
isOnlyOne = true;
|
||
// 先更新数据
|
||
if (ui_to_paper() && compute())
|
||
{
|
||
paper_to_ui(); // 然后计算,最后更新到界面
|
||
this.pictureBox1.Refresh();
|
||
this.lblModelSize.Text = $"模板大小:{this.paper.ModelWidth} * {this.paper.ModelHeight}";
|
||
this.lblPaperSize.Text = $"纸张大小:{this.paper.PaperWidth} * {this.paper.PaperHeight}";
|
||
}
|
||
isOnlyOne = false;
|
||
}
|
||
|
||
|
||
|
||
private bool compute()
|
||
{
|
||
// 我这里简化一下,自定义模板尺寸和自定义模板的间距,两个得有一个是可以手动设置,而另一个是自动的
|
||
// 解方程 纸张的宽度 = 左边距 + 列数 * 模板的宽度 + (列数-1)*模板的间距 + 右边距
|
||
if (!chkCustomModelSize.Checked)
|
||
{
|
||
// 这个模板间距是手动设置的,那么我就要计算的是模板的大小了
|
||
this.paper.ModelWidth = (this.paper.PaperWidth - this.paper.Left - this.paper.Right - (this.paper.Cols - 1) * this.paper.HorizontalIntervalDistance) / this.paper.Cols;
|
||
this.paper.ModelHeight = (this.paper.PaperHeight - this.paper.Top - this.paper.Bottom - (this.paper.Rows - 1) * this.paper.VerticalIntervalDistance) / this.paper.Rows;
|
||
if (this.paper.ModelHeight < 0 || this.paper.ModelWidth < 0)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
}
|
||
// 这里暂时只支持是否手动更改模板的尺寸,不支持自动计算模板间距。
|
||
|
||
//else
|
||
//{
|
||
// // 自定义了模板,要求的是模板的边距了
|
||
// // 这里要判断是否是一行或者一列
|
||
// if(this.paper.Cols == 1)
|
||
// {
|
||
// this.paper.HorizontalIntervalDistance = 0;
|
||
// }
|
||
// else
|
||
// {
|
||
// this.paper.HorizontalIntervalDistance = (this.paper.PaperWidth - this.paper.Left - this.paper.Right - this.paper.Cols * this.paper.ModelWidth) / (this.paper.Cols - 1);
|
||
// }
|
||
// if (this.paper.Rows == 1)
|
||
// {
|
||
// this.paper.VerticalIntervalDistance = 0;
|
||
// }
|
||
// else
|
||
// {
|
||
// this.paper.VerticalIntervalDistance = (this.paper.PaperHeight - this.paper.Top - this.paper.Bottom - this.paper.Rows * this.paper.ModelHeight) / (this.paper.Rows - 1);
|
||
// }
|
||
|
||
// if (this.paper.HorizontalIntervalDistance < 0 || this.paper.VerticalIntervalDistance < 0)
|
||
// {
|
||
// return false;
|
||
// }
|
||
//}
|
||
|
||
|
||
return true;
|
||
}
|
||
|
||
private bool ui_to_paper()
|
||
{
|
||
// 这里将ui中的信息全部转到paper中
|
||
try
|
||
{
|
||
this.paper.PaperWidth = float.Parse(txt_paper_width.Text);
|
||
this.paper.PaperHeight = float.Parse(txt_paper_height.Text);
|
||
this.paper.Landscape = !radioButton1.Checked;// 纵向
|
||
this.paper.Rows = (int)UpDownNumberOfLine.Value;
|
||
this.paper.Cols = (int)UpDownNumberOfColumn.Value;
|
||
this.paper.Top = float.Parse(txtMaginsTop.Text);
|
||
this.paper.Bottom = float.Parse(txtMaginsBottom.Text);
|
||
this.paper.Left = float.Parse(txtMaginsLeft.Text);
|
||
this.paper.Right = float.Parse(txtMaginsRight.Text);
|
||
//
|
||
this.paper.ModelWidth = float.Parse(txtModelWidth.Text);
|
||
this.paper.ModelHeight = float.Parse(txtModelHeight.Text);
|
||
//
|
||
this.paper.HorizontalIntervalDistance = float.Parse(txtHorizontalInterval.Text);
|
||
this.paper.VerticalIntervalDistance = float.Parse(txtVerticalInterval.Text);
|
||
if (radioButtonRect.Checked)
|
||
{
|
||
this.paper.ModelShape = new Shape.ShapeRectangle(); // 矩形
|
||
|
||
}else if (radioButtonRoundRect.Checked)
|
||
{
|
||
this.paper.ModelShape = new Shape.ShapeRoundedRectangle(); // 圆角矩形
|
||
}
|
||
else
|
||
{
|
||
this.paper.ModelShape = new Shape.ShapeEllipse(); // 椭圆
|
||
}
|
||
// 设置填充白色
|
||
this.paper.ModelShape.IsFill = true;
|
||
this.paper.ModelShape.FillColor = Color.White;
|
||
// 设置这个纸张的宽和高
|
||
this.paper.ModelShape.Height = this.paper.ModelHeight;
|
||
this.paper.ModelShape.Width = this.paper.ModelWidth;
|
||
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("转换失败:" + ex.Message);
|
||
return false;
|
||
//throw;
|
||
}
|
||
}
|
||
|
||
private void paper_to_ui()
|
||
{
|
||
txt_paper_width.Text = this.paper.PaperWidth.ToString();
|
||
txt_paper_height.Text = this.paper.PaperHeight.ToString();
|
||
if (this.paper.Landscape) radioButton2.Checked = true; else radioButton1.Checked = true;
|
||
UpDownNumberOfLine.Value = this.paper.Rows;
|
||
UpDownNumberOfColumn.Value = this.paper.Cols;
|
||
txtMaginsTop.Text = this.paper.Top.ToString();
|
||
txtMaginsBottom.Text = this.paper.Bottom.ToString();
|
||
txtMaginsLeft.Text = this.paper.Left.ToString();
|
||
txtMaginsRight.Text = this.paper.Right.ToString();
|
||
txtModelWidth.Text = this.paper.ModelWidth.ToString();
|
||
txtModelHeight.Text = this.paper.ModelHeight.ToString();
|
||
txtHorizontalInterval.Text = this.paper.HorizontalIntervalDistance.ToString();
|
||
txtVerticalInterval.Text = this.paper.VerticalIntervalDistance.ToString();
|
||
|
||
if (this.paper.ModelShape is Shape.ShapeRectangle)
|
||
{
|
||
radioButtonRect.Checked = true;
|
||
}
|
||
else if (this.paper.ModelShape is Shape.ShapeRoundedRectangle)
|
||
{
|
||
radioButtonRoundRect.Checked = true;
|
||
}
|
||
else
|
||
{
|
||
radioButtonEllipse.Checked = true;
|
||
}
|
||
|
||
}
|
||
|
||
Dictionary<string, System.Drawing.Printing.PaperSize> dict_paperSize = new Dictionary<string, PaperSize>();
|
||
|
||
private void comboPrinters_SelectedIndexChanged(object sender, EventArgs e)
|
||
{
|
||
dict_paperSize.Clear();
|
||
// 打印机更改后需要更改有多少的纸张。
|
||
PrintDocument printDocument = new PrintDocument();
|
||
printDocument.PrinterSettings.PrinterName = comboPrinters.Text;// 打印机的名称
|
||
foreach (System.Drawing.Printing.PaperSize item in printDocument.PrinterSettings.PaperSizes)
|
||
{
|
||
dict_paperSize[item.ToString()] = item;
|
||
}
|
||
|
||
// 加载到组合框
|
||
string _old = comboPaperSizes.Text;
|
||
comboPaperSizes.Items.Clear();
|
||
comboPaperSizes.Items.AddRange(dict_paperSize.Keys.ToArray());
|
||
|
||
// 我这里看看是否有这个纸张
|
||
if (dict_paperSize.ContainsKey(_old))
|
||
{
|
||
//comboPaperSizes.Text = _old;
|
||
}
|
||
else
|
||
{
|
||
// 这里有新的纸张
|
||
comboPaperSizes.SelectedIndex = 0;
|
||
}
|
||
}
|
||
|
||
|
||
private void comboPaperSizes_SelectedValueChanged(object sender, EventArgs e)
|
||
{
|
||
if (dict_paperSize.ContainsKey(comboPaperSizes.Text))
|
||
{
|
||
var _papersize = dict_paperSize[comboPaperSizes.Text];
|
||
// 请注意,这里边的单位是以百分之一英寸为单位
|
||
txt_paper_height.Text = (_papersize.Height*0.254).ToString();
|
||
txt_paper_width.Text = (_papersize.Width*0.254).ToString();
|
||
change();
|
||
}
|
||
|
||
}
|
||
|
||
private void chkCustomInterval_CheckedChanged(object sender, EventArgs e)
|
||
{
|
||
txtHorizontalInterval.Enabled = chkCustomInterval.Checked;
|
||
txtVerticalInterval.Enabled = chkCustomInterval.Checked;
|
||
|
||
if (chkCustomInterval.Checked)
|
||
{
|
||
chkCustomModelSize.Checked = false;
|
||
}
|
||
|
||
}
|
||
|
||
private void chkCustomModelSize_CheckedChanged(object sender, EventArgs e)
|
||
{
|
||
// 这里要变成灰色的
|
||
txtModelHeight.Enabled = chkCustomModelSize.Checked;
|
||
txtModelWidth.Enabled = chkCustomModelSize.Checked;
|
||
|
||
if (chkCustomModelSize.Checked)
|
||
{
|
||
chkCustomInterval.Checked = false;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
private void btn_paper_ok_Click(object sender, EventArgs e)
|
||
{
|
||
change();
|
||
}
|
||
|
||
private void UpDownNumberOfLine_ValueChanged(object sender, EventArgs e)
|
||
{
|
||
change();
|
||
}
|
||
|
||
private void txtMaginsTop_TextChanged(object sender, EventArgs e)
|
||
{
|
||
change();
|
||
}
|
||
|
||
private void txtModelWidth_TextChanged(object sender, EventArgs e)
|
||
{
|
||
// 要判断是否是手动
|
||
if(chkCustomModelSize.Checked) change();
|
||
}
|
||
|
||
private void txtHorizontalInterval_TextChanged(object sender, EventArgs e)
|
||
{
|
||
// 要判断是否是手动
|
||
if (chkCustomInterval.Checked) change();
|
||
}
|
||
|
||
private void btnOk_Click(object sender, EventArgs e)
|
||
{
|
||
//
|
||
this.DialogResult = DialogResult.OK; // 返回ok
|
||
this.Close(); // 关闭
|
||
result = paper; // 设置这个要返回的。
|
||
}
|
||
|
||
private void radioButtonRect_CheckedChanged(object sender, EventArgs e)
|
||
{
|
||
change();
|
||
}
|
||
|
||
private void pictureBox1_Paint(object sender, PaintEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
// 做一个图形
|
||
Shapes shapes = new Shapes();
|
||
// 做一张纸
|
||
Shape.ShapeRectangle rect1 = new Shape.ShapeRectangle()
|
||
{
|
||
X = 0,
|
||
Y = 0,
|
||
Width = this.paper.PaperWidth, // todo 这里要注意横向
|
||
Height = this.paper.PaperHeight,
|
||
PenColor = Color.Red,
|
||
PenWidth = 1,
|
||
IsFill = true,
|
||
FillColor = Color.White,
|
||
};
|
||
shapes.lstShapes.Add(rect1);
|
||
////如下是绘制模板。
|
||
for (int i = 0; i < this.paper.Cols; i++)
|
||
{
|
||
for (int j = 0; j < this.paper.Rows; j++)
|
||
{
|
||
var tmp = this.paper.ModelShape.DeepClone();
|
||
tmp.X = this.paper.Left + i * (this.paper.ModelWidth + this.paper.HorizontalIntervalDistance);
|
||
tmp.Y = this.paper.Top + j * (this.paper.ModelHeight + this.paper.VerticalIntervalDistance);
|
||
tmp.Width = this.paper.ModelWidth;
|
||
tmp.Height = this.paper.ModelHeight;
|
||
tmp.PenColor = Color.Black;
|
||
tmp.PenWidth = 1;
|
||
tmp.IsFill = true;
|
||
tmp.FillColor = Color.AliceBlue;
|
||
shapes.lstShapes.Add(tmp);
|
||
}
|
||
|
||
}
|
||
// 这里做一个放大
|
||
shapes.zoomTo(e.Graphics.DpiX, e.Graphics.DpiY, this.pictureBox1.Width, this.pictureBox1.Height, 5);
|
||
// 显示
|
||
|
||
shapes.Draw(e.Graphics, shapes.GetMatrix(), false);
|
||
}
|
||
catch (Exception)
|
||
{
|
||
|
||
//throw;
|
||
}
|
||
|
||
}
|
||
|
||
private void btnCancel_Click(object sender, EventArgs e)
|
||
{
|
||
this.Close();
|
||
}
|
||
}
|
||
}
|