65.9K
CodeProject 正在变化。 阅读更多。
Home

工具栏颜色选择器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.61/5 (6投票s)

2007年9月21日

CPOL

2分钟阅读

viewsIcon

41543

downloadIcon

867

一个工具栏颜色选择器

Screenshot - img1.jpg

这个网站上有很多颜色选择器,但我没有找到基于MenuItem的颜色选择器。因此,我编写了一个基于MenuItem的颜色选择器。

背景

在 Visual Studio .NET 2003 中,MenuItem 类包含一个 Break 属性。Break 属性用于创建一个新的 menuitem,其中每个菜单项水平排列,而不是垂直列表。

Break 属性用于创建菜单,其中每个菜单项水平排列,而不是垂直列表。

我使用这个属性来制作这个选择器。

Screenshot - img2.jpg

使用选择器

首先将 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;
            }
        }
    }
}

问题

我发现了两个问题

  1. 源代码项目格式是 VS.NET 2005,但控件和类是 VS.NET 2003 格式。我使用 MenuItem 类是因为 VS.NET 2005 的 MenuItemStrip 不包含 Break 属性。
  2. 我添加了一个名为“更多颜色...”的 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日:初始发布
© . All rights reserved.