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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
| #region Références
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
#endregion
namespace TilePainter
{
/// <summary>
/// Cette classe représente un PictureBox qui affiche en plus une grille par dessus l'image.
/// </summary>
public class GridPictureBox
: PictureBox
{
#region Variables locales
private Color _GridColor;
private int _GridWidth;
private int _GridHeight;
private int _GridSize;
private int _GridZoom; // facteur de zoom
private bool _GridLines; // indique si on veut ou pas le quadriage
private bool _GridHighlightSelected;
private int _GridHighlightSize;
private Color _GridHighlightColor;
private Rectangle _GridRectangleTemp; // variable temporaire pour l'élément sélectionné
#endregion
#region Propriétés
/// <summary>
/// Obtient ou définit si on souhaite mettre l'élément sélectionné en surbrillance
/// </summary>
[Category("Apparence"), Description("True si on souhaite mettre l'élément sélectionné en surbrillance."), DefaultValue(true)]
public bool GridHighlightSelected
{
get { return _GridHighlightSelected; }
set
{
_GridHighlightSelected = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit la taille de la bordule de l'élément sélectionné
/// </summary>
[Category("Apparence"), Description("La taille de la bordure de l'élément sélectionné."), DefaultValue(4)]
public int GridHighlightSize
{
get { return _GridHighlightSize; }
set
{
_GridHighlightSize = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit la couleur de la bordule de l'élément sélectionné
/// </summary>
[Category("Apparence"), Description("La couleur de l'élément sélectionné.")]
public Color GridHighlightColor
{
get { return _GridHighlightColor; }
set
{
_GridHighlightColor = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit le valeur du zoom de la grille
/// </summary>
[Category("Apparence"), Description("Le zoom de la grille.")]
public int GridZoom
{
get { return _GridZoom; }
set
{
_GridZoom = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit si la quadriage de la grille est visible ou pas.
/// </summary>
[Category("Apparence"), Description("Le quadriage de la grille.")]
public bool GridLines
{
get { return _GridLines; }
set
{
_GridLines = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit la couleur de la grille.
/// </summary>
[Category("Apparence"), Description("La couleur de la grille.")]
public Color GridColor
{
get { return _GridColor; }
set
{
_GridColor = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit l'espacement vertical de la grille.
/// </summary>
[Category("Apparence"), Description("L'espacement vertical de la grille."), DefaultValue(1)]
public int GridWidth
{
get { return _GridWidth; }
set
{
if (value < 1) throw new ArgumentException("L'espacement vertical de la grille ne peut être inférieur à 1.");
_GridWidth = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit l'espacement horizontal de la grille.
/// </summary>
[Category("Apparence"), Description("L'espacement horizontal de la grille."), DefaultValue(1)]
public int GridHeight
{
get { return _GridHeight; }
set
{
if (value < 1) throw new ArgumentException("L'espacement horizontal de la grille ne peut être inférieur à 1.");
_GridHeight = value;
Invalidate();
}
}
/// <summary>
/// Obtient ou définit l'épaisseur des traits de la grille.
/// </summary>
[Category("Apparence"), Description("L'épaisseur de la grille."), DefaultValue(16)]
public int GridSize
{
get { return _GridSize; }
set
{
// La taille de la grille est un minimum 1
if (value < 1) throw new ArgumentException("L'épaisseur de la grille ne peut être inférieure à 1.");
_GridSize = value;
Invalidate();
}
}
#endregion
#region Constructeur
/// <summary>
/// Construit une GridPictureBox.
/// </summary>
public GridPictureBox()
{
_GridColor = Color.Black;
_GridWidth = 16;
_GridHeight = 16;
_GridSize = 1;
_GridLines = true;
_GridZoom = 1;
_GridHighlightSelected = true;
_GridHighlightSize = 4;
_GridHighlightColor = Color.Red;
}
#endregion
#region Méthodes
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
if (this.Image != null)
{
// Obtient la position du click
Point MousePosOnClick = this.PointToClient(Control.MousePosition);
// Si le click est dans l'image
if (MousePosOnClick.X < this.Image.Width && MousePosOnClick.Y < this.Image.Height)
{
// Calcul le rectangle du tile cliqué
int x = MousePosOnClick.X - (MousePosOnClick.X % this.GridWidth);
int y = MousePosOnClick.Y - (MousePosOnClick.Y % this.GridHeight);
Console.WriteLine(x);
Console.WriteLine(y);
_GridRectangleTemp = new Rectangle(x, y, this.GridWidth, this.GridHeight);
Invalidate(_GridRectangleTemp); // redessine le tile sélectionné
}
}
}
protected override void OnPaint(PaintEventArgs pe)
{
// Dessine normale
base.OnPaint(pe);
// Maintenant que l'image est dessinée, on dessine la grille (a condition qu'une image soit affichée)
if(this.Image != null && _GridLines)
{
using (Pen p = new Pen(_GridColor, _GridSize))
{
// Dessine les lignes verticales
for(int i = 0; i < Image.Width; i += _GridWidth)
{
pe.Graphics.DrawLine(p, new Point(i, 0), new Point(i, Image.Height));
}
// Dessine les lignes horizontales
for (int j = 0; j < Image.Height; j += _GridHeight)
{
pe.Graphics.DrawLine(p, new Point(0, j), new Point(Image.Width ,j));
}
// Dessine le bord droit
pe.Graphics.DrawLine(p, new Point(Image.Width, 0), new Point(Image.Width, Image.Height));
// Dessine le bord du bas
pe.Graphics.DrawLine(p, new Point(0, Image.Height), new Point(Image.Width, Image.Height));
}
// dessine enfin le tile en surbrillance si demandé
if (_GridHighlightSelected)
{
using (Pen p = new Pen(_GridHighlightColor, _GridHighlightSize))
{
pe.Graphics.DrawRectangle(p, _GridRectangleTemp);
Console.WriteLine("rectangle dessine");
}
}
}
}
#endregion
}
} |
Partager