By Conmajia
Originally posted in 2012
Simple & fast implementation of a rectangular RGB palette control for .NET Fx 2.0. Old-school shit.
Name it as SRP.
Project download… Nah...
(ancient project, where on earth can I retrieve those antiques?)
The palette looks like:
▲ The look of SRP
Pick a color
You can access the color you pick via e.Color
of the ColorChanged
event.
Set palette block size
Note that size of the whole palette will be changed.
Here I have several examples.
▲ Block 5
▲ Block 10
▲ Block 15
SRP is formed by a 6x36 color block matrix with variable block sizes.
Disassemble SRP into layers for graphic painting. (bottom to top)
Paint these layer sequentially.
protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; drawPalette(g); drawGrid(g); drawBorder(g); drawCursor(g);}
A modern Flat UI hello from 7 yrs. ago.
void drawGrid(Graphics g) { for(int i = 0; i < rows; i++) { g.DrawLine(Pens.Black, 0, blockWidth * (i + 1), blockWidth * cols, blockWidth * (i + 1)); } for(int i = 0; i < cols; i++) { g.DrawLine(Pens.Black, blockWidth * (i + 1), 0, blockWidth * (i + 1), blockWidth * rows); }}
Calculate coordinates of a color, fill blocks, proceed on. Here’s my algorithm of generating RGB colors, you can generate your own shits.
Color getColor(int row, int col) { byte r = 0, g = 0, b = 0; int step = 0xff / (rows - 1); r = (byte)(row * step); g = (byte)(step * (col / rows)); b = (byte)(step * (col % rows)); return Color.FromArgb(r, g, b);}
Instead of storing preset colors, all colors shown were automatically generated during run-time.
current = getColor(pt.Y / blockWidth, pt.X / blockWidth);
Draw mouse cursor. Refresh only dirty parts on canvas.
void updateCursor(Point pt) { lastCursor.X = cursor.X; lastCursor.Y = cursor.Y; cursor.X = pt.X - pt.X % blockWidth; cursor.Y = pt.Y - pt.Y % blockWidth; current = getColor(pt.Y / blockWidth, pt.X / blockWidth);}
Redraw dirty.
protected override void OnMouseMove(MouseEventArgs e) { updateCursor(e.Location); // redraw larger spaces Invalidate(new Rectangle(lastCursor.X - 1, lastCursor.Y - 1, lastCursor.Width + 2, lastCursor.Height + 2)); Invalidate(new Rectangle(cursor.X - 1, cursor.Y - 1, cursor.Width + 2, cursor.Height + 2)); // fire event OnColorChanged();}
Trigger OnColorChanged()
event which happens after color is changed.
// -- custom eventspublic delegate void ColorChangedEventHandler(object sender, ColorChangedEventArgs e);[Description("Fires every time when color changed.")]public event ColorChangedEventHandler ColorChanged;protected virtual void OnColorChanged() { if(ColorChanged != null) ColorChanged(this, new ColorChangedEventArgs(current));}// custom event argspublic class ColorChangedEventArgs: EventArgs { Color color = Color.Black; public Color Color { get { return color; } set { color = value; } } public ColorChangedEventArgs(Color color): base() { this.color = color; }}
With some extra optimizations, you‘ll have your own palette.
▲ SRP in use
The End. \(\Box\)