c# 顏色選擇控件的實現(xiàn)代碼
參考ColorComboBox做修改,并對顏色名做些修正,用于CR MVMixer產(chǎn)品中,聊作備忘~
效果圖:

代碼:
//顏色拾取框
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace CRMVMixer
{
//event handler delegate
public delegate void ColorChangedHandler(object sender, ColorChangeArgs e);
[ToolboxBitmap(typeof(ComboBox))]
public class ColorComboBox : ComboBox
{
private PopupWindow popupWnd;
private ColorPopup colors = new ColorPopup();
private Color selectedColor = Color.Black;
private Timer timer = new Timer();
public event ColorChangedHandler ColorChanged;
//constructor...
public ColorComboBox()
: this(Color.Black)
{
}
public ColorComboBox(Color selectedColor)
{
this.SuspendLayout();
//
// ColorCombo
//
this.AutoSize = false;
this.Size = new Size(92, 22);
this.Text = string.Empty;
this.DrawMode = DrawMode.OwnerDrawFixed;
this.DropDownStyle = ComboBoxStyle.DropDownList;
this.ItemHeight = 16;
timer.Tick += new EventHandler(OnCheckStatus);
timer.Interval = 50;
timer.Start();
colors.SelectedColor = this.selectedColor = selectedColor;
this.ResumeLayout(false);
}
[DefaultValue(typeof(Color), "Black")]
public Color SelectedColor
{
get { return selectedColor; }
set
{
selectedColor = value;
colors.SelectedColor = value;
Invalidate();
}
}
protected override void WndProc(ref Message m)
{
//256: WM_KEYDOWN, 513: WM_LBUTTONDOWN, 515: WM_LBUTTONDBLCLK
if (m.Msg == 256 || m.Msg == 513 || m.Msg == 515)
{
if (m.Msg == 513)
PopupColorPalette();
return;
}
base.WndProc(ref m);
}
private void PopupColorPalette()
{
//create a popup window
popupWnd = new PopupWindow(colors);
//calculate its position in screen coordinates
Rectangle rect = Bounds;
rect = this.Parent.RectangleToScreen(rect);
Point pt = new Point(rect.Left, rect.Bottom);
//tell it that we want the ColorChanged event
popupWnd.ColorChanged += new ColorChangedHandler(OnColorChanged);
//show the popup
popupWnd.Show(pt);
//disable the button so that the user can't click it
//while the popup is being displayed
this.Enabled = false;
this.timer.Start();
}
//event handler for the color change event from the popup window
//simply relay the event to the parent control
protected void OnColorChanged(object sender, ColorChangeArgs e)
{
//if a someone wants the event, and the color has actually changed
//call the event handler
if (ColorChanged != null && e.color != this.selectedColor)
{
this.selectedColor = e.color;
ColorChanged(this, e);
}
else //otherwise simply make note of the new color
this.selectedColor = e.color;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
var g = e.Graphics;
e.DrawBackground();
var brush = new SolidBrush(this.selectedColor);
var rect = e.Bounds;
rect.Width -= 1;
rect.Height -= 1;
g.FillRectangle(brush, rect);
g.DrawRectangle(Pens.Black, rect);
e.DrawFocusRectangle();
}
//This is the timer call back function. It checks to see
//if the popup went from a visible state to an close state
//if so then it will uncheck and enable the button
private void OnCheckStatus(object sender, EventArgs e)
{
if (popupWnd != null && !popupWnd.Visible)
{
this.timer.Stop();
this.Enabled = true;
}
}
/// <summary>
/// a button style radio button that shows a color
/// </summary>
private class ColorRadioButton : RadioButton
{
public ColorRadioButton(Color color, Color backColor)
{
this.ClientSize = new Size(21, 21);
this.Appearance = Appearance.Button;
this.Name = "button";
this.Visible = true;
this.ForeColor = color;
this.FlatAppearance.BorderColor = backColor;
this.FlatAppearance.BorderSize = 0;
this.FlatStyle = FlatStyle.Flat;
this.Paint += new PaintEventHandler(OnPaintButton);
}
private void OnPaintButton(object sender, PaintEventArgs e)
{
//paint a square on the face of the button using the controls foreground color
Rectangle colorRect = new Rectangle(ClientRectangle.Left + 5, ClientRectangle.Top + 5, ClientRectangle.Width - 9, ClientRectangle.Height - 9);
e.Graphics.FillRectangle(new SolidBrush(this.ForeColor), colorRect);
e.Graphics.DrawRectangle(Pens.DarkGray, colorRect);
}
}
///<summary>
///this is the popup window. This window will be the parent of the
///window with the color controls on it
///</summary>
private class PopupWindow : ToolStripDropDown
{
public event ColorChangedHandler ColorChanged;
private ToolStripControlHost host;
private ColorPopup content;
public Color SelectedColor
{
get { return content.SelectedColor; }
}
public PopupWindow(ColorPopup content)
{
if (content == null)
throw new ArgumentNullException("content");
this.content = content;
this.AutoSize = false;
this.DoubleBuffered = true;
this.ResizeRedraw = true;
//create a host that will host the content
host = new ToolStripControlHost(content);
this.Padding = Margin = host.Padding = host.Margin = Padding.Empty;
this.MinimumSize = content.MinimumSize;
content.MinimumSize = content.Size;
MaximumSize = new Size(content.Size.Width + 1, content.Size.Height + 1);
content.MaximumSize = new Size(content.Size.Width + 1, content.Size.Height + 1);
Size = new Size(content.Size.Width + 1, content.Size.Height + 1);
content.Location = Point.Empty;
//add the host to the list
Items.Add(host);
}
protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
{
//when the window close tell the parent that the color changed
if (ColorChanged != null)
ColorChanged(this, new ColorChangeArgs(this.SelectedColor));
}
}
///<summary>
///this class represends the control that has all the color radio buttons.
///this control gets embedded into the PopupWindow class.
///</summary>
private class ColorPopup : UserControl
{
//private Color[] colors = { Color.Black, Color.Gray, Color.Maroon, Color.Olive, Color.Green, Color.Teal, Color.Navy, Color.Purple, Color.White, Color.Silver, Color.Red, Color.Yellow, Color.Lime, Color.Aqua, Color.Blue, Color.Fuchsia };
private Color[] colors = {
Color.Black, Color.Navy, Color.DarkGreen, Color.DarkCyan, Color.DarkRed, Color.DarkMagenta, Color.Olive,
Color.LightGray, Color.DarkGray, Color.Blue, Color.Lime, Color.Cyan, Color.Red, Color.Fuchsia,
Color.Yellow, Color.White, Color.RoyalBlue, Color.MediumBlue, Color.LightGreen, Color.MediumSpringGreen, Color.Chocolate,
Color.Pink, Color.Khaki, Color.WhiteSmoke, Color.BlueViolet, Color.DeepSkyBlue, Color.OliveDrab, Color.SteelBlue,
Color.DarkOrange, Color.Tomato, Color.HotPink, Color.DimGray,
};
private string[] colorNames = {
"黑色", "藏青", "深綠", "深青", "紅褐", "洋紅", "褐綠",
"淺灰", "灰色", "藍(lán)色", "綠色", "青色", "紅色", "紫紅",
"黃色", "白色", "藍(lán)灰", "藏藍(lán)", "淡綠", "青綠", "黃褐",
"粉紅", "嫩黃", "銀白", "紫色", "天藍(lán)", "灰綠", "青藍(lán)",
"橙黃", "桃紅", "英紅", "深灰"
};
private ToolTip toolTip = new ToolTip();
private ColorRadioButton[] buttons;
private Button moreColorsBtn;
private Color selectedColor = Color.Black;
///<summary>
///get or set the selected color
///</summary>
public Color SelectedColor
{
get { return selectedColor; }
set
{
selectedColor = value;
Color[] colors = this.colors;
for (int i = 0; i < colors.Length; i++)
buttons[i].Checked = selectedColor == colors[i];
}
}
private void InitializeComponent()
{
this.SuspendLayout();
this.Name = "Color Popup";
this.Text = string.Empty;
this.ResumeLayout(false);
}
public ColorPopup()
{
InitializeComponent();
SetupButtons();
this.Paint += new PaintEventHandler(OnPaintBorder);
}
//place the buttons on the window.
private void SetupButtons()
{
Controls.Clear();
int x = 1;
int y = 2;
int breakCount = 7;
Color[] colors = this.colors;
this.buttons = new ColorRadioButton[colors.Length];
this.ClientSize = new Size(139, 137);
//color buttons
for (int i = 0; i < colors.Length; i++)
{
if (i > 0 && i % breakCount == 0)
{
y += 19;
x = 1;
}
buttons[i] = new ColorRadioButton(colors[i], this.BackColor);
buttons[i].Location = new Point(x, y);
toolTip.SetToolTip(buttons[i], colorNames[i]);
Controls.Add(buttons[i]);
buttons[i].Click += new EventHandler(BtnClicked);
if (selectedColor == colors[i])
buttons[i].Checked = true;
x += 19;
}
//line...
y += 24;
var label = new Label();
label.AutoSize = false;
label.Text = string.Empty;
label.Width = this.Width - 5;
label.Height = 2;
label.BorderStyle = BorderStyle.Fixed3D;
label.Location = new Point(4, y);
Controls.Add(label);
//button
y += 7;
moreColorsBtn = new Button();
moreColorsBtn.FlatStyle = FlatStyle.Popup;
moreColorsBtn.Text = "其它顏色...";
moreColorsBtn.Location = new Point(6, y);
moreColorsBtn.ClientSize = new Size(127, 23);
moreColorsBtn.Click += new EventHandler(OnMoreClicked);
Controls.Add(moreColorsBtn);
}
private void OnPaintBorder(object sender, PaintEventArgs e)
{
var rect = this.ClientRectangle;
rect.Width -= 1;
rect.Height -= 1;
e.Graphics.DrawRectangle(new Pen(SystemColors.WindowFrame), rect);
}
public void BtnClicked(object sender, EventArgs e)
{
selectedColor = ((ColorRadioButton)sender).ForeColor;
((ToolStripDropDown)Parent).Close();
}
public void OnMoreClicked(object sender, EventArgs e)
{
ColorDialog dlg = new ColorDialog();
dlg.Color = SelectedColor;
if (dlg.ShowDialog(this) == DialogResult.OK)
selectedColor = dlg.Color;
((ToolStripDropDown)Parent).Close();
}
}
}
//define the color changed event argument
public class ColorChangeArgs : System.EventArgs
{
//the selected color
public Color color;
public ColorChangeArgs(Color color)
{
this.color = color;
}
}
}
以上就是c# 顏色選擇控件的實現(xiàn)代碼的詳細(xì)內(nèi)容,更多關(guān)于c# 顏色選擇控件的資料請關(guān)注腳本之家其它相關(guān)文章!
- C# 實現(xiàn)顏色漸變窗體控件詳細(xì)講解
- C# 實現(xiàn)顏色的梯度漸變案例
- C# Color.FromArgb()及系統(tǒng)顏色對照表一覽
- C# 如何設(shè)置label(標(biāo)簽)控件的背景顏色為透明
- C#使用RichTextBox實現(xiàn)替換文字及改變字體顏色功能示例
- C#利用Label標(biāo)簽控件模擬窗體標(biāo)題的移動及窗體顏色不斷變換效果
- C# 根據(jù)表格偶數(shù)、奇數(shù)加載不同顏色
- C#更改tabControl選項卡顏色的方法
- C#及WPF獲取本機(jī)所有字體和顏色的方法
- C#實現(xiàn)更改MDI窗體背景顏色的方法
相關(guān)文章
c# 兩個數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實現(xiàn)
下面小編就為大家?guī)硪黄猚# 兩個數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C# Windows API應(yīng)用之基于FlashWindowEx實現(xiàn)窗口閃爍的方法
這篇文章主要介紹了C# Windows API應(yīng)用之基于FlashWindowEx實現(xiàn)窗口閃爍的方法,結(jié)合實例形式分析了Windows API函數(shù)FlashWindowEx的功能、定義及實現(xiàn)窗口閃爍的相關(guān)技巧,需要的朋友可以參考下2016-08-08
C#學(xué)習(xí)筆記整理_變量等基礎(chǔ)語法(必看篇)
下面小編就為大家?guī)硪黄狢#學(xué)習(xí)筆記整理_變量等基礎(chǔ)語法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
C#實現(xiàn)Winform鼠標(biāo)拖動窗口大小時設(shè)定窗口最小尺寸的方法
這篇文章主要介紹了C#實現(xiàn)Winform鼠標(biāo)拖動窗口大小時設(shè)定窗口最小尺寸的方法,涉及WinForm改變窗口大小時動態(tài)判斷當(dāng)前窗口尺寸的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下2015-11-11
WPF+ASP.NET SignalR實現(xiàn)后臺通知功能的示例代碼
本文以一個簡單示例,簡述如何通過WPF+ASP.NET SignalR實現(xiàn)消息后臺通知以及數(shù)據(jù)的實時刷新,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正2022-09-09

