颜色的秘密:
颜色Color是一个调色板,
所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*256=16777216种
Color=ARGB
A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色
Color
所属命名空间System.Drawing,是一种结构struct
//
// 摘要:
// 表示一种 ARGB 颜色(alpha、红色、绿色、蓝色)。
[DebuggerDisplay("{NameAndARGBValue}")]
[Editor("System.Drawing.Design.ColorEditor, System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
[TypeConverter(typeof(ColorConverter))]
public struct Color
颜色Color的四个关键属性ARGB
Alpha:代表透明度,有效值为 0 到 255.如果不指定,默认为255(完全不透明),0为透明,128为半透明
Red:红色组件值。 有效值为 0 到 255
Green:绿色组件值。 有效值为 0 到 255。
Blue:蓝色组件值。 有效值为 0 到 255
所有颜色都是有红Red,绿Green,蓝Blue调色混合而成
重载方法FromArgb()如下:
//
// 摘要:
// 基于指定的 8 位颜色值(红色、绿色和蓝色)创建 System.Drawing.Color 结构。 隐式的 alpha 值为 255(完全不透明)。 尽管此方法允许为每个颜色组件传递
// 32 位值,但每个组件的值仅限于 8 位。
//
// 参数:
// red:
// 新 System.Drawing.Color 的红色组件值。 有效值为 0 到 255。
//
// green:
// 新 System.Drawing.Color 的绿色组件值。 有效值为 0 到 255。
//
// blue:
// 新 System.Drawing.Color 的蓝色组件值。 有效值为 0 到 255。
//
// 返回结果:
// 此方法创建的 System.Drawing.Color。
//
// 异常:
// T:System.ArgumentException:
// red、green 或 blue 小于 0 或大于 255。
public static Color FromArgb(int red, int green, int blue);
//
// 摘要:
// 从指定的 System.Drawing.Color 结构创建 System.Drawing.Color 结构,但要使用新指定的 alpha 值。 尽管此方法允许为
// alpha 值传递 32 位值,但该值仅限于 8 位。
//
// 参数:
// alpha:
// 新 System.Drawing.Color 的 alpha 值。 有效值为 0 到 255。
//
// baseColor:
// 从中创建新 System.Drawing.Color 的 System.Drawing.Color。
//
// 返回结果:
// 此方法创建的 System.Drawing.Color。
//
// 异常:
// T:System.ArgumentException:
// alpha 小于 0 或大于 255。
public static Color FromArgb(int alpha, Color baseColor);
//
// 摘要:
// 基于四个 ARGB 组件(alpha、红色、绿色和蓝色)值创建 System.Drawing.Color 结构。 尽管此方法允许为每个组件传递 32 位值,但每个组件的值仅限于
// 8 位。
//
// 参数:
// alpha:
// Alpha 组件。 有效值为 0 到 255。
//
// red:
// 红色组件。 有效值为 0 到 255。
//
// green:
// 绿色组件。 有效值为 0 到 255。
//
// blue:
// 蓝色组件。 有效值为 0 到 255。
//
// 返回结果:
// 此方法创建的 System.Drawing.Color。
//
// 异常:
// T:System.ArgumentException:
// alpha、red、green 或 blue 小于 0 或大于 255。
public static Color FromArgb(int alpha, int red, int green, int blue);
//
// 摘要:
// 基于一个 32 位 ARGB 值创建 System.Drawing.Color 结构。
//
// 参数:
// argb:
// 用于指定 32 位 ARGB 值的值。
//
// 返回结果:
// 此方法创建的 System.Drawing.Color 结构。
public static Color FromArgb(int argb);
我们这里展示已知的系统颜色枚举KnownColor,并显示对应RGBA值.
新建窗体应用程序ColorDemo,将默认的Form1重命名为FormColor.
窗体FormColor设计器如下:
窗体设计器相关代码如下:
文件 FormColor.Designer.cs
namespace ColorDemo
{
partial class FormColor
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.dgvColor = new System.Windows.Forms.DataGridView();
this.btnColor = new System.Windows.Forms.Button();
this.dgvcKnowColor = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.dgvcRed = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.dgvcGreen = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.dgvcBlue = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.dgvcAlpha = new System.Windows.Forms.DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.dgvColor)).BeginInit();
this.SuspendLayout();
//
// dgvColor
//
this.dgvColor.AllowUserToAddRows = false;
this.dgvColor.AllowUserToDeleteRows = false;
this.dgvColor.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvColor.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dgvcKnowColor,
this.dgvcRed,
this.dgvcGreen,
this.dgvcBlue,
this.dgvcAlpha});
this.dgvColor.Location = new System.Drawing.Point(12, 85);
this.dgvColor.MultiSelect = false;
this.dgvColor.Name = "dgvColor";
this.dgvColor.ReadOnly = true;
this.dgvColor.RowTemplate.Height = 23;
this.dgvColor.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dgvColor.Size = new System.Drawing.Size(776, 426);
this.dgvColor.TabIndex = 0;
this.dgvColor.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvColor_CellContentClick);
this.dgvColor.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvColor_CellContentClick);
this.dgvColor.CellEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvColor_CellContentClick);
//
// btnColor
//
this.btnColor.Font = new System.Drawing.Font("宋体", 13F);
this.btnColor.Location = new System.Drawing.Point(45, 12);
this.btnColor.Name = "btnColor";
this.btnColor.Size = new System.Drawing.Size(452, 50);
this.btnColor.TabIndex = 2;
this.btnColor.Text = "Color";
this.btnColor.UseVisualStyleBackColor = true;
//
// dgvcKnowColor
//
this.dgvcKnowColor.HeaderText = "已知的系统颜色";
this.dgvcKnowColor.Name = "dgvcKnowColor";
this.dgvcKnowColor.ReadOnly = true;
this.dgvcKnowColor.Width = 180;
//
// dgvcRed
//
this.dgvcRed.HeaderText = "红色(Red)";
this.dgvcRed.Name = "dgvcRed";
this.dgvcRed.ReadOnly = true;
this.dgvcRed.Width = 120;
//
// dgvcGreen
//
this.dgvcGreen.HeaderText = "绿色(Green)";
this.dgvcGreen.Name = "dgvcGreen";
this.dgvcGreen.ReadOnly = true;
this.dgvcGreen.Width = 120;
//
// dgvcBlue
//
this.dgvcBlue.HeaderText = "蓝色(Blue)";
this.dgvcBlue.Name = "dgvcBlue";
this.dgvcBlue.ReadOnly = true;
this.dgvcBlue.Width = 120;
//
// dgvcAlpha
//
this.dgvcAlpha.HeaderText = "透明度(Alpha)";
this.dgvcAlpha.Name = "dgvcAlpha";
this.dgvcAlpha.ReadOnly = true;
this.dgvcAlpha.Width = 120;
//
// FormColor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 523);
this.Controls.Add(this.btnColor);
this.Controls.Add(this.dgvColor);
this.Name = "FormColor";
this.Text = "颜色的秘密ARGB【Alpha,Red,Green,Blue】";
this.Load += new System.EventHandler(this.FormColor_Load);
((System.ComponentModel.ISupportInitialize)(this.dgvColor)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView dgvColor;
private System.Windows.Forms.Button btnColor;
private System.Windows.Forms.DataGridViewTextBoxColumn dgvcKnowColor;
private System.Windows.Forms.DataGridViewTextBoxColumn dgvcRed;
private System.Windows.Forms.DataGridViewTextBoxColumn dgvcGreen;
private System.Windows.Forms.DataGridViewTextBoxColumn dgvcBlue;
private System.Windows.Forms.DataGridViewTextBoxColumn dgvcAlpha;
}
}
窗体相关程序代码如下:
文件FormColor.cs
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;
namespace ColorDemo
{
public partial class FormColor : Form
{
public FormColor()
{
InitializeComponent();
dgvColor.AutoGenerateColumns = false;
dgvcKnowColor.DataPropertyName = "KnowColorName";
dgvcRed.DataPropertyName = "Red";
dgvcGreen.DataPropertyName = "Green";
dgvcBlue.DataPropertyName = "Blue";
dgvcAlpha.DataPropertyName = "Alpha";
}
private void FormColor_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable("ColorTable");
dt.Columns.Add("KnowColorName", typeof(string));
dt.Columns.Add("Red", typeof(int));
dt.Columns.Add("Green", typeof(int));
dt.Columns.Add("Blue", typeof(int));
dt.Columns.Add("Alpha", typeof(int));
string[] knownColorArray = Enum.GetNames(typeof(KnownColor));
for (int i = 0; i < knownColorArray.Length; i++)
{
KnownColor knownColor;
Enum.TryParse(knownColorArray[i], true, out knownColor);
Color color = Color.FromKnownColor(knownColor);
dt.Rows.Add(color.Name, color.R, color.G, color.B, color.A);
}
dgvColor.DataSource = dt;
}
private void RefreshButtonColor(Color color)
{
if (!IsHandleCreated)
{
return;
}
this.Invoke(new Action(() =>
{
btnColor.BackColor = color;
btnColor.Text = $"{color.Name}(R:{color.R},G:{color.G},B:{color.B})";
}));
}
private void dgvColor_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0)
{
return;
}
KnownColor knownColor;
Enum.TryParse(Convert.ToString(dgvColor["dgvcKnowColor", e.RowIndex].Value), true, out knownColor);
Color color = Color.FromKnownColor(knownColor);
RefreshButtonColor(color);
}
}
}
颜色运行如图: