服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# 颜色选择控件的实现代码

c# 颜色选择控件的实现代码

2022-11-14 12:28楚人无衣 C#

这篇文章主要介绍了c# 颜色选择控件的实现代码,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

参考ColorComboBox做修改,并对颜色名做些修正,用于CR MVMixer产品中,聊作备忘~

效果图:

#ad11d0664be35ec8944d0ad54a1eb1cc#

代码:

?
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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
//颜色拾取框
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 = {
                "黑色", "藏青", "深绿", "深青", "红褐", "洋红", "褐绿",
                "浅灰", "灰色", "蓝色", "绿色", "青色", "红色", "紫红",
                "黄色", "白色", "蓝灰", "藏蓝", "淡绿", "青绿", "黄褐",
                "粉红", "嫩黄", "银白", "紫色", "天蓝", "灰绿", "青蓝",
                "橙黄", "桃红", "英红", "深灰"
            };
            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# 颜色选择控件的实现代码的详细内容,更多关于c# 颜色选择控件的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/crwy/p/14673041.html

延伸 · 阅读

精彩推荐
  • C#C#窗体间常用的几种传值方式及委托与事件详解

    C#窗体间常用的几种传值方式及委托与事件详解

    这篇文章主要给大家介绍了关于C#窗体间常用的几种传值方式及委托与事件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用小程序具...

    陈彦斌6502022-07-27
  • C#C#搜索TreeView子节点,保留父节点的方法

    C#搜索TreeView子节点,保留父节点的方法

    这篇文章主要介绍了C#搜索TreeView子节点,保留父节点的方法,实例分析了C#操作TreeView节点的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    C#教程网10682021-10-26
  • C#C#实现打字小游戏

    C#实现打字小游戏

    这篇文章主要为大家详细介绍了C#实现打字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Cocksuck4882022-09-07
  • C#详解如何在C#中使用投影(Projection)

    详解如何在C#中使用投影(Projection)

    这篇文章主要介绍了详解如何在C#中使用投影(Projection),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    一线码农5772022-10-31
  • C#在winform下实现左右布局多窗口界面的方法

    在winform下实现左右布局多窗口界面的方法

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform、WPF中实现其实也很容易,通过本文给大家介绍在winform下实...

    梦在旅途5602021-11-14
  • C#C#时间操作类分享

    C#时间操作类分享

    这篇文章主要为大家分享了C#时间操作类,秒转换成分钟,获得两个日期的间隔等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    孤者自清6672022-01-11
  • C#学习Winform分组类控件(Panel、groupBox、TabControl)

    学习Winform分组类控件(Panel、groupBox、TabControl)

    这篇文章主要和大家一起学习Winform分组类控件,包括容器控件(Panel),分组框控件(groupBox)和选项卡控件(TabControl)等控件,感兴趣的小伙伴们可以参考一下...

    丿木呈广予口贝4742021-11-22
  • C#C#对Windows服务组的启动与停止操作

    C#对Windows服务组的启动与停止操作

    这篇文章主要为大家详细介绍了C#对Windows服务组的启动与停止操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    马洪彪10432022-02-21