using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Serialization; namespace Rs.Controls { public enum ESortDir { Horizontal, Vertical } public enum ESlotStatus { Have, NotHave, Ok, Ng } public partial class RsTray : UserControl { public ESortDir SortDir { get; set; } = ESortDir.Horizontal; public event Action SlotClickEvent; public RsTray() { InitializeComponent(); DoubleBuffered = true; InitSlot(InitSlotStatus); this.SizeChanged += (s, e) => { UpdateSlotPos(); }; } private ESlotStatus _InitSlotStatus = ESlotStatus.Have; public ESlotStatus InitSlotStatus { get { return _InitSlotStatus; } set { _InitSlotStatus = value; InitSlot(InitSlotStatus); Invalidate(); } } public bool CanDraw { get; set; } = true; private List traySlots = new List(); private Dictionary traySlotsDic = new Dictionary(); private string _HeadText; public string HeadText { get { return _HeadText; } set { _HeadText = value; this.label1.Text = value; } } private int _RowNum = 26; /// /// 行数 /// public int RowNum { get { return _RowNum; } set { _RowNum = value; InitSlot(InitSlotStatus); Invalidate(); } } private int _ColumnNum = 10; /// /// 列数量 /// public int ColumnNum { get { return _ColumnNum; } set { _ColumnNum = value; InitSlot(InitSlotStatus); Invalidate(); } } private int _TopSpaceHeight = 20; /// /// 料盘上部留白高度 /// public int TopSpaceHeight { get { return _TopSpaceHeight; } set { _TopSpaceHeight = value; } } private int _LeftSpaceWidth = 20; /// /// 料盘左边留白宽度 /// public int LeftSpaceWidth { get { return _LeftSpaceWidth; } set { _LeftSpaceWidth = value; } } private int _RowSpace = 3; public int RowSpace { get { return _RowSpace; } set { _RowSpace = value; } } private int _ColSpace = 5; public int ColSpace { get { return _ColSpace; } set { _ColSpace = value; } } private bool _ShowText; public bool ShowText { get { return _ShowText; } set { _ShowText = value; } } private Bitmap drawImage; private void InitSlot(ESlotStatus status) { int index = 0; traySlots.Clear(); traySlotsDic.Clear(); if(SortDir== ESortDir.Vertical) { for (int c = 0; c < ColumnNum; c++) { for (int r = 0; r < RowNum; r++) { index++; TraySlot slot = new TraySlot(); slot.Index = index; slot.Row = r; slot.Column = c; slot.SlotStatus = status; //slot.Bound = new RectangleF((LeftSpaceWidth + widthPer * c), (TopSpaceHeight + heightPer * r), (int)widthPer - 5, (int)heightPer - 5); //slot.Draw(g2); traySlots.Add(slot); traySlotsDic.Add(index, slot); } } } else { for (int r = 0; r < RowNum; r++) { for (int c = 0; c < ColumnNum; c++) { index++; TraySlot slot = new TraySlot(); slot.Index = index; slot.Row = r; slot.Column = c; slot.SlotStatus = status; //slot.Bound = new RectangleF((LeftSpaceWidth + widthPer * c), (TopSpaceHeight + heightPer * r), (int)widthPer - 5, (int)heightPer - 5); //slot.Draw(g2); traySlots.Add(slot); traySlotsDic.Add(index, slot); } } } UpdateSlotPos(); } public void Fill() { foreach (TraySlot item in traySlots) { ChangeStatus(item.Index, ESlotStatus.Have); } } public void Clear() { foreach (TraySlot item in traySlots) { ChangeStatus(item.Index, ESlotStatus.NotHave); } } public void ChangeStatus(int index,ESlotStatus status) { if(traySlotsDic.ContainsKey(index)) { traySlotsDic[index].SlotStatus = status; traySlotsDic[index].Refresh(this.panel2.CreateGraphics(), ShowText); } //panel2_Paint(null, null); } private void UpdateSlotPos() { float slotWidth = (this.panel2.Width - LeftSpaceWidth) / ColumnNum; float slotHeight = (this.panel2.Height - TopSpaceHeight) / RowNum; int index = 0; if(SortDir== ESortDir.Vertical) { for (int c = 0; c < ColumnNum; c++) { for (int r = 0; r < RowNum; r++) { index++; if (traySlotsDic.ContainsKey(index)) { traySlotsDic[index].Bound = new RectangleF((LeftSpaceWidth + slotWidth * c), (TopSpaceHeight + slotHeight * r), (int)slotWidth - ColSpace, (int)slotHeight - RowSpace); } } } } else { for (int r = 0; r < RowNum; r++) { for (int c = 0; c < ColumnNum; c++) { index++; if (traySlotsDic.ContainsKey(index)) { traySlotsDic[index].Bound = new RectangleF((LeftSpaceWidth + slotWidth * c), (TopSpaceHeight + slotHeight * r), (int)slotWidth - ColSpace, (int)slotHeight - RowSpace); } } } } panel2.Refresh(); } private void panel2_Paint(object sender, PaintEventArgs e) { this.DoubleBuffered = true; Graphics g = this.panel2.CreateGraphics(); drawImage = new Bitmap(this.panel2.Width, this.panel2.Height); Graphics g2 = Graphics.FromImage(drawImage); g2.Clear(BackColor); //先计算出每一个料仓中穴位占用的宽度和高度 float widthPer = (this.panel2.Width - LeftSpaceWidth) / ColumnNum; float heightPer = (this.panel2.Height - TopSpaceHeight) / RowNum; //先画列,再画行 int index = 0; for (int c = 0; c < ColumnNum; c++) { for (int r = 0; r < RowNum; r++) { index++; if (r == 0) { //画料盘的列号 g2.DrawString((c + 1).ToString(), new Font("宋体", 7.0F), new SolidBrush(Color.White), new PointF(LeftSpaceWidth + (widthPer * c) + 5, 5)); } if (c == 0) { //画料盘的行号 g2.DrawString((r + 1).ToString(), new Font("宋体", 7.0F), new SolidBrush(Color.White), new PointF(5, TopSpaceHeight + (heightPer * r))); } //Rectangle rect = new Rectangle((int)(LeftSpaceWidth + widthPer * c), (int)(TopSpaceHeight + heightPer * r), (int)widthPer - 5, (int)heightPer - 5); //g2.DrawRectangle(Pens.Red, (LeftSpaceWidth + widthPer * c), (TopSpaceHeight + heightPer * r), (int)widthPer - 5, (int)heightPer - 5); //TraySlot slot = new TraySlot(); //slot.Row = r; //slot.Column = c; //slot.Bound = new RectangleF((LeftSpaceWidth + widthPer * c), (TopSpaceHeight + heightPer * r), (int)widthPer - 5, (int)heightPer - 5); //slot.Draw(g2); if (traySlotsDic.ContainsKey(index)) { traySlotsDic[index].Draw(g2, ShowText); } } } g2.Flush(); g.DrawImage(drawImage, 0, 0, drawImage.Width, drawImage.Height); if (drawRegion) { //drawRect.Width = 20; //drawRect.Height = 20; //g.DrawRectangle(Pens.Green, drawRect); g.FillRectangle(new SolidBrush(Color.FromArgb(200, Color.Pink)), drawRect); } g.Flush(); g.Dispose(); g2.Dispose(); } bool drawRegion = false; Rectangle drawRect = new Rectangle(); private void panel2_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && drawRegion == false) { if(CanDraw) { drawRegion = true; drawRect.X = e.X; drawRect.Y = e.Y; } } } private void panel2_MouseMove(object sender, MouseEventArgs e) { if (drawRegion) { drawRect.Width = e.X - drawRect.X; drawRect.Height = e.Y - drawRect.Y; panel2_Paint(null, null); } } private void panel2_MouseUp(object sender, MouseEventArgs e) { drawRegion = false; } public TraySlot SelectSlot { get; set; } private void panel2_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { if (!drawRect.IsEmpty && drawRect.Contains(e.Location)) { contextMenuStrip1.Show(panel2, e.Location); } else { SelectSlot = null; bool find = false; foreach (TraySlot slot in this.traySlots) { if(slot.Bound.Contains(e.Location)) { find = true; SelectSlot = slot; break; } } if(find) { if (SlotClickEvent != null) SlotClickEvent(SelectSlot,e); } } } } } /// /// 料盘槽位 /// public class TraySlot { public ESlotStatus SlotStatus { get; set; } = ESlotStatus.Have; private PointF _Position; public PointF Position { get { return _Position; } set { _Position = value; } } private int _Index; public int Index { get { return _Index; } set { _Index = value; } } private int _Row; public int Row { get { return _Row; } set { _Row = value; } } private int _Column; public int Column { get { return _Column; } set { _Column = value; } } private RectangleF _Bound; [XmlIgnore] public RectangleF Bound { get { return _Bound; } set { _Bound = value; } } public void Refresh(Graphics g,bool isShowText) { Draw(g, isShowText); } public void Draw(Graphics g, bool isShowText) { if (_Bound != null) { StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; switch (SlotStatus) { case ESlotStatus.Have: g.FillRectangle(new SolidBrush(Color.Red), Bound.X, Bound.Y, Bound.Width - 1, Bound.Height - 1); break; case ESlotStatus.NotHave: g.FillRectangle(new SolidBrush(Color.FromArgb(11, 16, 36)), Bound.X, Bound.Y, Bound.Width - 1, Bound.Height - 1); break; case ESlotStatus.Ok: g.FillRectangle(new SolidBrush(Color.Green), Bound.X, Bound.Y, Bound.Width - 1, Bound.Height - 1); break; case ESlotStatus.Ng: g.FillRectangle(new SolidBrush(Color.Gray), Bound.X, Bound.Y, Bound.Width - 1, Bound.Height - 1); break; default: break; } //if(Status==1) //{ // g.FillRectangle(new SolidBrush(Color.Red), Bound.X, Bound.Y, Bound.Width - 1, Bound.Height - 1); //} //else if(Status==0) //{ // g.FillRectangle(new SolidBrush(Color.FromArgb(11, 16, 36)), Bound.X, Bound.Y, Bound.Width-1, Bound.Height-1); // // g.FillRectangle(new SolidBrush(Color.Red), Bound.X, Bound.Y, Bound.Width , Bound.Height ); //} g.DrawRectangle(Pens.White, Bound.X, Bound.Y, Bound.Width, Bound.Height); if (isShowText) { g.DrawString((Row + 1) + "-" + (Column + 1), new Font("宋体", 9), new SolidBrush(Color.Yellow), _Bound, sf); } } } } }