工具栏颜色选择器
一个工具栏颜色选择器

这个网站上有很多颜色选择器,但我没有找到基于MenuItem
的颜色选择器。因此,我编写了一个基于MenuItem
的颜色选择器。
背景
在 Visual Studio .NET 2003 中,MenuItem
类包含一个 Break
属性。Break
属性用于创建一个新的 menuitem
,其中每个菜单项水平排列,而不是垂直列表。
Break
属性用于创建菜单,其中每个菜单项水平排列,而不是垂直列表。
我使用这个属性来制作这个选择器。

使用选择器
首先将 CtxCol
类复制到你的项目中。
声明一个 CtxCol
变量。
在 Load
事件中,创建一个新的实例,并将 ToolbarButton
的上下文菜单或 DropDownMenu
设置为声明的变量。
private CtxCol ccol;
private void Form1_Load(object sender, System.EventArgs e)
{
ccol = new CtxCol(rtf);
tbcol.DropDownMenu = ccol; // the toolbar button
rtf.ContextMenu = ccol;
}
就是这样。
CtxCol.cs 代码
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace TlbColPic
{ /// <summary>
/// Summary description for CtxColl.
/// </summary>
public class CtxCol :ContextMenu
{
#region Declares
private RichTextBox rtf;
private MenuItemC m1 = new MenuItemC(Color.FromArgb(0,0,0),"Black");
private MenuItemC m2 = new MenuItemC(Color.FromArgb(128,0,0),"DarkRed");
private MenuItemC m3 = new MenuItemC(Color.FromArgb(255,0,0),"Red");
private MenuItemC m4 = new MenuItemC(Color.FromArgb(255,0,255),"Pink");
private MenuItemC m5 = new MenuItemC(Color.FromArgb(255,153,204),"Rose");
private MenuItemC m6 = new MenuItemC(Color.FromArgb(153,51,0),"Brown");
private MenuItemC m7 = new MenuItemC(Color.FromArgb(255,102,0),"Orange");
private MenuItemC m8 = new MenuItemC(Color.FromArgb(255,153,0),"LightOrange");
private MenuItemC m9 = new MenuItemC(Color.FromArgb(255,204,0),"Gold");
private MenuItemC m10 = new MenuItemC(Color.FromArgb(255,204,153),"Tan");
private MenuItemC m11 = new MenuItemC( Color.FromArgb(51,51,0),"Ollive Green");
private MenuItemC m12 = new MenuItemC(Color.FromArgb(128,128,0),"DarkYellow");
private MenuItemC m13 = new MenuItemC(Color.FromArgb(153,204,0),"Lime");
private MenuItemC m14 = new MenuItemC( Color.FromArgb(255,255,0),"Yellow");
private MenuItemC m15 = new MenuItemC(Color.FromArgb(255,255,153),"LightYellow");
private MenuItemC m16 = new MenuItemC( Color.FromArgb(0,51,0),"DarkGreen");
private MenuItemC m17 = new MenuItemC(Color.FromArgb(0,128,0),"Green");
private MenuItemC m18 = new MenuItemC( Color.FromArgb(51,153,102),"SeaGreen");
private MenuItemC m19 = new MenuItemC( Color.FromArgb(0,255,0),"BrightGreen");
private MenuItemC m20 = new MenuItemC(Color.FromArgb(204,255,204),"LightGreen");
private MenuItemC m21 = new MenuItemC(Color.FromArgb(0,51,102),"Dark Teal");
private MenuItemC m22 = new MenuItemC(Color.FromArgb(128,0,0),"Teal");
private MenuItemC m23 = new MenuItemC(Color.FromArgb(51,204,204),"Aqua");
private MenuItemC m24 = new MenuItemC(Color.FromArgb(0,255,255),"Turquoise");
private MenuItemC m25 =
new MenuItemC(Color.FromArgb(204,255,255),"Light Turquoise");
private MenuItemC m26 = new MenuItemC(Color.FromArgb(0,0,128),"Dark Blue");
private MenuItemC m27 = new MenuItemC(Color.FromArgb(0,0,225),"Blue");
private MenuItemC m28 = new MenuItemC(Color.FromArgb(51,102,255),"Light Blue");
private MenuItemC m29 = new MenuItemC(Color.FromArgb(0,204,255),"Sky Blue");
private MenuItemC m30 = new MenuItemC(Color.FromArgb(153,204,255),"Pale Blue");
private MenuItemC m31 = new MenuItemC( Color.FromArgb(51,51,153),"Indigo");
private MenuItemC m32 = new MenuItemC(Color.FromArgb(102,102,153),"Blue-Gray");
private MenuItemC m33 = new MenuItemC(Color.FromArgb(128,0,128),"Violet");
private MenuItemC m34 = new MenuItemC( Color.FromArgb(153,51,102),"Plum");
private MenuItemC m35 = new MenuItemC(Color.FromArgb(204,153,255),"Lavender");
private MenuItemC m36 = new MenuItemC( Color.FromArgb(51,51,51),"Gray-80%");
private MenuItemC m37 = new MenuItemC(Color.FromArgb(128,128,128),"Gray-50%");
private MenuItemC m38 = new MenuItemC( Color.FromArgb(153,153,153),"Gray-40%");
private MenuItemC m39 = new MenuItemC( Color.FromArgb(192,192,192),"Gray-25%");
private MenuItemC m40 = new MenuItemC(Color.FromArgb(255,255,255),"White");
private MenuItemC mt = new MenuItemC(Color.Black,"More Colors..");
#endregion
private Pen border=new Pen(Color.FromArgb(0,0,128));
public CtxCol(RichTextBox _rtf)
{
LoadCtx();
rtf = _rtf;
}
private void LoadCtx()
{
MenuItems.AddRange(new MenuItemC[]{m1,m2,m3,m4,m5,m6,m7,
m8,m9,m10,m11,m12,m13,
m14,m15,m16,m17,m18,m19,m20 ,
m21,m22,m23,m24,m25,m26,m27,
m28,m29,m30,m31,m32,m33,
m34,m35,m36,m37,m38,m39,m40
});
m6.Break = true;
m11.Break = true;
m16.Break = true;
m21.Break = true;
m26.Break = true;
m31.Break = true;
m36.Break = true;
for(int i = 0; i < MenuItems.Count; i ++)
{
MenuItem m = MenuItems[i];
m.OwnerDraw = true;
m.Click +=new EventHandler(m_Click);
m.DrawItem +=new DrawItemEventHandler(m_DrawItem);
m.MeasureItem +=new MeasureItemEventHandler(m_MeasureItem);
}
}
private void m_Click(object sender, EventArgs e)
{
MenuItemC mi = (MenuItemC)sender;
Color c = mi.Color;
if(mi.ColorName != "More Colors..")
{
if(rtf != null)
rtf.SelectionColor = c;
}
else
{
ColorDialog coldlg = new ColorDialog();
coldlg.Color = rtf.SelectionColor;
if(coldlg.ShowDialog() == DialogResult.OK)
{
if(rtf != null)
rtf.SelectionColor = coldlg.Color;
}
}
}
private void m_DrawItem(object sender, DrawItemEventArgs e)
{
MenuItemC mi = (MenuItemC)sender;
Color c = mi.Color;
Rectangle rct = e.Bounds;
if(mi.ColorName != "More Colors..")
{
e.Graphics.FillRectangle(new SolidBrush(Color.White),rct);
rct.Inflate(-3,-3);
e.Graphics.FillRectangle(new SolidBrush(c),rct);
e.Graphics.DrawRectangle
(new Pen(new SolidBrush(SystemColors.ControlDark),1),rct);
}
else
{
rct.Inflate(-3,-3);
e.Graphics.FillRectangle(new SolidBrush(Color.White),e.Bounds);
DrawText(e.Graphics,rct,mi.ColorName);
}
if ( (e.State & DrawItemState.Selected) == DrawItemState.Selected )
{
if(mi.ColorName == "More Colors..")
{
try
{
Rectangle r = e.Bounds;
r.Inflate(-1,-1);
e.Graphics.FillRectangle
(new SolidBrush(Color.FromArgb(255,244,204)),r);
e.Graphics.DrawRectangle(border,r);
DrawText(e.Graphics,rct,mi.ColorName);
}
catch(Exception ex)
{
rtf.Text = ex.ToString();
return;
}
}
else
{
rct.Inflate(2,2);
e.Graphics.DrawRectangle(new Pen
(new SolidBrush(Color.Blue),1),rct);
}
}
else
{
}
e.Graphics.Dispose();
}
private void m_MeasureItem(object sender, MeasureItemEventArgs e)
{
MenuItemC mi = (MenuItemC)sender;
if(mi.ColorName != "More Colors..")
{
e.ItemWidth = 5;
e.ItemHeight = 15;
}
else
{
SizeF f = e.Graphics.MeasureString
(mi.ColorName,SystemInformation.MenuFont);
e.ItemWidth = (int)f.Width +8;
e.ItemHeight = (int)f.Height + 12;
}
}
private void DrawText(Graphics g,Rectangle rec,string text)
{
string st = text;
StringFormat str = new StringFormat();
str.Alignment = StringAlignment.Center;
str.LineAlignment = StringAlignment.Center;
g.DrawString(st, SystemInformation.MenuFont,
new SolidBrush(Color.Black),rec,
str);
g.Dispose();
}
}
public class MenuItemC: MenuItem
{
private string colname;
private Color col;
public MenuItemC(Color _col, string cname)
{
col = _col;
colname = cname;
Text = colname;
}
public Color Color
{
get
{
return col;
}
set
{
col = value;
}
}
public string ColorName
{
get
{
return colname;
}
set
{
colname = value;
}
}
}
}
问题
我发现了两个问题
- 源代码项目格式是 VS.NET 2005,但控件和类是 VS.NET 2003 格式。我使用
MenuItem
类是因为 VS.NET 2005 的MenuItemStrip
不包含Break
属性。 - 我添加了一个名为“更多颜色...”的
MenuItem
。如果你点击这个项目,将会打开一个颜色对话框来选择更多颜色。但发现的问题是在选择状态时出现错误。所以我没有将这个项目添加到类中。我花了大量时间试图纠正这个问题,但没有成功。如果你能解决这个问题,请在下面的留言板中发布解决方案。要添加menuitem
,请打开 CtxCol.cs,并在MenuItems.AddRange
方法的末尾添加mt
。或者复制LoadCtx()
方法中的代码。
MenuItems.AddRange(new MenuItemC[]{m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,
m14,m15,m16,m17,m18,m19,m20 ,
m21,m22,m23,m24,m25,m26,m27,m28,m29,m30,m31,m32,m33,
m34,m35,m36,m37,m38,m39,m40,mt});
结论
我的家乡不是美国或任何其他英语国家。请原谅我蹩脚的英语。而且我也不是一个优秀的开发者。我提交这篇文章是为了解决我所描述的问题。
祝你身体健康。
历史
- 2007年9月21日:初始发布