Windows窗体组合框自定义窗体颜色 [英] Windows form combobox custom form color

查看:88
本文介绍了Windows窗体组合框自定义窗体颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在自定义WinForm组合框...到目前为止,我有以下内容:

I have been playing around with customizing the WinForm combobox...So far I have the following:

使用此代码:

public class ComboBoxWithBorder : ComboBox
{
    private Color _borderColor = Color.Black;
    private ButtonBorderStyle _borderStyle = ButtonBorderStyle.Solid;
    private static int WM_PAINT = 0x000F;

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg == WM_PAINT)
        {
            Graphics g = Graphics.FromHwnd(Handle);
            Rectangle bounds = new Rectangle(0, 0, Width, Height);
            ControlPaint.DrawBorder(g, bounds, _borderColor, _borderStyle);
        }
    }

    [Category("Appearance")]
    public Color BorderColor
    {
        get { return _borderColor; }
        set
        {
            _borderColor = value;
            Invalidate(); // causes control to be redrawn
        }
    }

    [Category("Appearance")]
    public ButtonBorderStyle BorderStyle
    {
        get { return _borderStyle; }
        set
        {
            _borderStyle = value;
            Invalidate();
        }
    }
}

但是,我正在尝试实现以下目标:

However, I am trying to achieve something similar to this:

是否可以将白色下拉框的背景颜色更改为较深的颜色?

Is it possible to change the background color of the white dropdown box to a darker color?

是否可以将下拉列表边框从白色更改为其他颜色?

Is it possible to change the dropdown list border from white to a different color?

推荐答案

尝试此类

参考

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class FlatCombo : ComboBox
{

    private Brush BorderBrush = new SolidBrush(SystemColors.Window);
    private Brush ArrowBrush = new SolidBrush(SystemColors.ControlText);
    private Brush DropButtonBrush = new SolidBrush(SystemColors.Control);

    private Color _ButtonColor = SystemColors.Control;
    public Color ButtonColor {
        get { return _ButtonColor; }
        set {
            _ButtonColor = value;
            DropButtonBrush = new SolidBrush(this.ButtonColor);
            this.Invalidate();
        }
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(m);

        switch (m.Msg) {
            case 0xf:
                //Paint the background. Only the borders
                //will show up because the edit
                //box will be overlayed
                Graphics g = this.CreateGraphics;
                Pen p = new Pen(Color.White, 2);
                g.FillRectangle(BorderBrush, this.ClientRectangle);

                //Draw the background of the dropdown button
                Rectangle rect = new Rectangle(this.Width - 15, 3, 12, this.Height - 6);
                g.FillRectangle(DropButtonBrush, rect);

                //Create the path for the arrow
                Drawing2D.GraphicsPath pth = new Drawing2D.GraphicsPath();
                PointF TopLeft = new PointF(this.Width - 13, (this.Height - 5) / 2);
                PointF TopRight = new PointF(this.Width - 6, (this.Height - 5) / 2);
                PointF Bottom = new PointF(this.Width - 9, (this.Height + 2) / 2);
                pth.AddLine(TopLeft, TopRight);
                pth.AddLine(TopRight, Bottom);

                g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality;

                //Determine the arrow's color.
                if (this.DroppedDown) {
                    ArrowBrush = new SolidBrush(SystemColors.HighlightText);
                } else {
                    ArrowBrush = new SolidBrush(SystemColors.ControlText);
                }

                //Draw the arrow
                g.FillPath(ArrowBrush, pth);

                break;
            default:
                break; // TODO: might not be correct. Was : Exit Select

                break;
        }
    }

    //Override mouse and focus events to draw
    //proper borders. Basically, set the color and Invalidate(),
    //In general, Invalidate causes a control to redraw itself.
    #region "Mouse and focus Overrides"
    protected override void OnMouseEnter(System.EventArgs e)
    {
        base.OnMouseEnter(e);
        BorderBrush = new SolidBrush(SystemColors.Highlight);
        this.Invalidate();
    }

    protected override void OnMouseLeave(System.EventArgs e)
    {
        base.OnMouseLeave(e);
        if (this.Focused)
            return;
        BorderBrush = new SolidBrush(SystemColors.Window);
        this.Invalidate();
    }

    protected override void OnLostFocus(System.EventArgs e)
    {
        base.OnLostFocus(e);
        BorderBrush = new SolidBrush(SystemColors.Window);
        this.Invalidate();
    }

    protected override void OnGotFocus(System.EventArgs e)
    {
        base.OnGotFocus(e);
        BorderBrush = new SolidBrush(SystemColors.Highlight);
        this.Invalidate();
    }

    protected override void OnMouseHover(System.EventArgs e)
    {
        base.OnMouseHover(e);
        BorderBrush = new SolidBrush(SystemColors.Highlight);
        this.Invalidate();
    }
    #endregion
}

这篇关于Windows窗体组合框自定义窗体颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆