By Conmajia
Originally posted in 2012
Introduction
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:
Features
Pick a color
You can access the color you pick via
e.Color
of theColorChanged
event.Set palette block size
Note that size of the whole palette will be changed.
Screenshots
Here I have several examples.
SRP is formed by a 6x36 color block matrix with variable block sizes.
Layers
Disassemble SRP into layers for graphic painting. (bottom to top)
- Canvas
- Color blocks
- Grids
- Border
- Cursor
Paint It
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; ?}}
Application
With some extra optimizations, you‘ll have your own palette.
The End. \(\Box\)
🎨 简易调色盘控件 for .NET(English)
原文地址:https://www.cnblogs.com/conmajia/p/simple-palette-control.html