word中当用工具栏中的字体颜色按钮选择颜色后,按钮上“A”下面的一条颜色会随之改变,请问这个功能是怎么实现的?

解决方案 »

  1.   

            internal class ColorPopup
            {
                XtraTabControl tabControl;
                Color fResultColor;
                BarItem itemColor;
                PopupControlContainer container;
                public ColorPopup(BarButtonItem item, Color initColor)
                {
                    this.container = new PopupControlContainer();
                    item.DropDownControl = container;
                    this.itemColor = item;
                    this.fResultColor = initColor;
                    this.tabControl = CreateTabControl();
                    this.tabControl.TabStop = false;
                    this.tabControl.TabPages.AddRange(new XtraTabPage[] { new XtraTabPage(), new XtraTabPage(), new XtraTabPage() });
                    for (int i = 0; i < tabControl.TabPages.Count; i++) SetTabPageProperties(i);
                    tabControl.Dock = DockStyle.Fill;
                    this.container.Controls.AddRange(new System.Windows.Forms.Control[] { tabControl });
                    this.container.Size = CalcFormSize();
                    OnEnterColor(fResultColor);
                }
                private XtraTabControl CreateTabControl() { return new XtraTabControl(); }
                private ColorListBox CreateColorListBox() { return new ColorListBox(); }
                private void SetTabPageProperties(int pageIndex)
                {
                    XtraTabPage tabPage = this.tabControl.TabPages[pageIndex];
                    ColorListBox colorBox = null;
                    BaseControl control = null;
                    switch (pageIndex)
                    {
                        case 0:
                            tabPage.Text = Localizer.Active.GetLocalizedString(StringId.ColorTabCustom);
                            control = new ColorCellsControl(null);
                            DevExpress.XtraEditors.Repository.RepositoryItemColorEdit rItem = new DevExpress.XtraEditors.Repository.RepositoryItemColorEdit();
                            rItem.ShowColorDialog = false;
                            (control as ColorCellsControl).Properties = rItem;
                            (control as ColorCellsControl).EnterColor += new EnterColorEventHandler(OnEnterColor);
                            control.Size = ColorCellsControlViewInfo.BestSize;
                            break;
                        case 1:
                            tabPage.Text = Localizer.Active.GetLocalizedString(StringId.ColorTabWeb);
                            colorBox = CreateColorListBox();
                            colorBox.Items.AddRange(ColorListBoxViewInfo.WebColors);
                            colorBox.EnterColor += new EnterColorEventHandler(OnEnterColor);
                            control = colorBox;
                            break;
                        case 2:
                            tabPage.Text = Localizer.Active.GetLocalizedString(StringId.ColorTabSystem);
                            colorBox = CreateColorListBox();
                            colorBox.Items.AddRange(ColorListBoxViewInfo.SystemColors);
                            colorBox.EnterColor += new EnterColorEventHandler(OnEnterColor);
                            control = colorBox;
                            break;
                    }
                    control.Dock = DockStyle.Fill;
                    control.BorderStyle = BorderStyles.NoBorder;
                    control.LookAndFeel.ParentLookAndFeel = itemColor.Manager.GetController().LookAndFeel;
                    tabPage.Controls.Add(control);
                }
                private void OnEnterColor(object sender, EnterColorEventArgs e)
                {
                    fResultColor = e.Color;
                    container.HidePopup();
                    OnEnterColor(e.Color);
                }
                private void OnEnterColor(Color clr)
                {
                    container.HidePopup();
                    int imIndex = itemColor.ImageIndex;
                    ImageCollection iml = itemColor.Images as ImageCollection;
                    Image im = iml.Images[imIndex];
                    Graphics g = Graphics.FromImage(im);
                    Rectangle r = new Rectangle(0, 12, 16, 4);
                    g.FillRectangle(new SolidBrush(clr), r);
                    if (imIndex == iml.Images.Count - 1)
                        iml.Images.RemoveAt(imIndex);
                    g.Dispose();
                    iml.Images.Add(im);
                    itemColor.ImageIndex = iml.Images.Count - 1;
                    itemColor.PerformClick();
                }
                private ColorCellsControl CellsControl { get { return ((ColorCellsControl)tabControl.TabPages[0].Controls[0]); } }
                private string CustomColorsName { get { return "CustomColors"; } }
                public Color ResultColor { get { return fResultColor; } }            private Size CalcFormSize()
                {
                    Size size = ColorCellsControlViewInfo.BestSize;
                    size.Height = 113;
                    return tabControl.CalcSizeByPageClient(size);
                }
            }
    这个是Dev的,基本思路是点击下拉按钮(不知道自带的工具条有没有),弹出下拉颜色选择窗体,选择完毕后,修改对应的图标,在其下方画一条相应颜色条。
      

  2.   

    谢谢回复,不知道word是怎样实现这个功能的!
      

  3.   

    解决了,当选择颜色后根据选择的颜色在按钮的Paint事件里画一条颜色线段即可。不知道Word是不是这样做的!