如何给下拉按钮绘上颜色

解决方案 »

  1.   

    重绘.  需要调用Win32API里面的user32.dll
      

  2.   

    做个组件继承ComboBox
    //首先设置
     DrawMode = DrawMode.OwnerDrawFixed;
    /// <summary>
    /// 默认画刷
    /// </summary>
    SolidBrush brushDefaultSb; /// <summary>
    /// 选中时画刷
    /// </summary>
    SolidBrush brushSelectSb; /// <summary>
    /// 默认字体画刷 
    /// </summary>
    SolidBrush  brushDefaultFont; /// <summary>
    /// 默认画笔
    /// </summary>
    Pen penDefault=new Pen(Color.Green);//(Color.FromArgb(0,45,150),1f); /// <summary>
    /// 选择时矩形边框
    /// </summary>
    Rectangle recSelect;
    /// <summary>
    /// 获取或设置背景色
    /// </summary>
    public  override Color BackColor
    {
    get
    {
    return  Color.FromArgb(246,246,246);
    }
    set
    {
    base.BackColor = value;
    }
    }
    /// <summary>
    /// 获取或设置字体
    /// </summary>
    public override Font Font
    {
    get
    {
    return new Font("宋体",9f);
    }
    set
    {
    base.Font = value;
    }
    }protected override void OnDrawItem(DrawItemEventArgs e)
    {// e.DrawBackground();
    // e.DrawFocusRectangle();
    brushDefaultSb=new SolidBrush((Color.FromArgb(246,246,246)));
    brushSelectSb =new SolidBrush(Color.FromArgb(255,238,194));
    // penDefault =new Pen(Color.FromArgb(0,45,150),1f);
    brushDefaultFont=new SolidBrush(Color.Black);
    recSelect =new Rectangle(e.Bounds.X+1,e.Bounds.Y+1,e.Bounds.Width-2,e.Bounds.Height-2);
    base.OnDrawItem(e);
    //填充背景
    e.Graphics.FillRectangle(this.brushDefaultSb,e.Bounds);
    //选择
    if( ( e.State & DrawItemState.Selected) !=0 )
    {
    e.Graphics.FillRectangle(this.brushSelectSb,this.recSelect);
    //矩形边框
    e.Graphics.DrawRectangle(this.penDefault,recSelect);
    } if( ( e.State & DrawItemState.NoFocusRect)!=0 && (e.State & DrawItemState.NoAccelerator)!=0)
    e.Graphics.DrawRectangle(this.penDefault,e.Bounds); //字
    if( e.Index >-1)
    e.Graphics.DrawString(this.Items[e.Index].ToString(),this.Font,this.brushDefaultFont,e.Bounds.X+2,e.Bounds.Y+2);
    #region
    // imageComboBoxItem item=new imageComboBoxItem();
    // Size imageSize = _imageList.ImageSize;
    // Rectangle bounds = e.Bounds;
    //
    // try
    // {
    // /*关于imageComboBoxItem的定义在下面论述*,这一步也是关键/
    // item = (imageComboBoxItem)Items[e.Index];
    // /*在此处用了一个小技巧。因为组合框列表项中的索引从0开始,对于那些没有图标的项(用于不知道属性哪一个年级的学生)把其索引设置为-1,即只要其索引值不为-1,表明有图像;否则没有图像*/
    // if (item.ImageIndex != -1)//即有图像又有文本
    // {
    // //画图像
    // _imageList.Draw(e.Graphics, bounds.Left, bounds.Top, item.ImageIndex);
    // //绘制文本
    // e.Graphics.DrawString(item.Text, e.Font, new
    // SolidBrush(e.ForeColor), bounds.Left+imageSize.Width, bounds.Top);
    // }
    // else//只有文本,没有图像
    // {
    //  //写文本
    // e.Graphics.DrawString(item.Text, e.Font, new
    // SolidBrush(e.ForeColor), bounds.Left, bounds.Top);
    // }
    // }
    // //一定要有
    // catch
    // {
    // if (e.Index != -1)
    // {
    // e.Graphics.DrawString(Items[e.Index].ToString(), e.Font, new
    // SolidBrush(e.ForeColor), bounds.Left, bounds.Top);
    // }
    // else
    // {
    // e.Graphics.DrawString(Text, e.Font, new
    // SolidBrush(e.ForeColor), bounds.Left, bounds.Top);
    // }
    //
    // }
    #endregion
    }