Контрол для отображения матрицы: кликабельный, с возможностью задания цвета каждой ячейки.
Код контрола:
| C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
| /// <summary>
/// Кликабельный контрол для отображения матриц
/// </summary>
public class MatrixGrid : UserControl
{
public Size GridSize { get; set; }
public Point HoveredCell = new Point(-1, -1);
public event EventHandler<CellNeededEventArgs> CellNeeded;
public event EventHandler<CellClickEventArgs> CellClick;
public MatrixGrid()
{
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
}
protected override void OnPaint(PaintEventArgs e)
{
var gr = e.Graphics;
gr.SmoothingMode = SmoothingMode.HighQuality;
if(CellNeeded == null)
return;
var cw = ClientSize.Width / GridSize.Width;
var ch = ClientSize.Height / GridSize.Height;
for(int j=0;j<GridSize.Height;j++)
for(int i=0;i<GridSize.Width;i++)
{
var cell = new Point(i, j);
//получаем значение ячейки от пользователя
var ea = new CellNeededEventArgs(cell);
CellNeeded(this, ea);
//рисуем ячейку
var rect = new Rectangle(cw*i, ch*j, cw, ch);
rect.Inflate(-1, -1);
if (cell == HoveredCell)
gr.DrawRectangle(Pens.Red, rect);
//фон
if(ea.BackColor != Color.Transparent)
using (var brush = new SolidBrush(ea.BackColor))
gr.FillRectangle(brush, rect);
//текст
if (!string.IsNullOrEmpty(ea.Value))
gr.DrawString(ea.Value, Font, Brushes.Black, rect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
var cell = PointToCell(e.Location);
HoveredCell = cell;
Invalidate();
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (e.Button == MouseButtons.Left)
{
var cell = PointToCell(e.Location);
OnCellClick(new CellClickEventArgs(cell));
HoveredCell = cell;
}
}
protected virtual void OnCellClick(CellClickEventArgs cellClickEventArgs)
{
if (CellClick != null)
CellClick(this, cellClickEventArgs);
}
Point PointToCell(Point p)
{
var cw = ClientSize.Width / GridSize.Width;
var ch = ClientSize.Height / GridSize.Height;
return new Point(p.X/cw, p.Y/ch);
}
public class CellNeededEventArgs : EventArgs
{
public Point Cell { get; private set; }
public string Value { get; set; }
public Color BackColor { get; set; }
public CellNeededEventArgs(Point cell)
{
Cell = cell;
}
}
public class CellClickEventArgs : EventArgs
{
public Point Cell { get; private set; }
public CellClickEventArgs(Point cell)
{
Cell = cell;
}
}
} |
|
Пример использования:
| C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace WindowsFormsApplication242
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//создаем матрицу
string[,] matrix = new string[20,20];
matrix[1, 4] = "AA";
matrix[2, 3] = "BB";
matrix[11, 12] = "CC";
//создаем грид
var grid = new MatrixGrid() {Parent = this, Dock = DockStyle.Fill};
//задаем размер грида
grid.GridSize = new Size(matrix.GetLength(0), matrix.GetLength(1));
//присваиваем событие в котором будем отдавать текст ячейки и ее цвет
grid.CellNeeded += (o, e) =>
{
e.Value = matrix[e.Cell.X, e.Cell.Y];
e.BackColor = Color.FromArgb(100, (e.Cell.X * 10) % 256, (e.Cell.Y * 10) % 256, (e.Cell.X * 10) % 256);
};
//обрабатываем событие клика по ячейке
grid.CellClick += (o, e) => MessageBox.Show(e.Cell.ToString());
}
}
} |
|
|