gpt4 book ai didi

c# - 如何更改 ComboBox 下拉按钮颜色

转载 作者:行者123 更新时间:2023-12-03 20:01:39 26 4
gpt4 key购买 nike

enter image description here
如何更改滑动按钮颜色?
不是边框颜色,也不是幻灯片项目颜色。
我已经更改了幻灯片项目的颜色
enter image description here
有什么办法可以改变颜色吗?

最佳答案

Flat ComboBox - 更改边框颜色和下拉按钮颜色
您需要办理WM_PAINT自己绘制边框和下拉矩形。这是内部 ComboBox.FlatComboAdapter 的方式.Net Framework 类的作品。
在这篇文章中,我创建了一个 FlatComboBox ,它以平面样式绘制边框和下拉列表,具有以下附加属性:

  • BorderColor:用于边框和下拉箭头
  • ButtonColor:用于下拉区域颜色。

  • enter image description here
    enter image description here
    这是代码:
    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    public class FlatComboBox : ComboBox
    {
    private Color borderColor = Color.Gray;
    [DefaultValue(typeof(Color), "Gray")]
    public Color BorderColor
    {
    get { return borderColor; }
    set
    {
    if (borderColor != value)
    {
    borderColor = value;
    Invalidate();
    }
    }
    }
    private Color buttonColor = Color.LightGray;
    [DefaultValue(typeof(Color), "LightGray")]
    public Color ButtonColor
    {
    get { return buttonColor; }
    set
    {
    if (buttonColor != value)
    {
    buttonColor = value;
    Invalidate();
    }
    }
    }
    protected override void WndProc(ref Message m)
    {
    if (m.Msg == WM_PAINT && DropDownStyle != ComboBoxStyle.Simple)
    {
    var clientRect = ClientRectangle;
    var dropDownButtonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    var outerBorder = new Rectangle(clientRect.Location,
    new Size(clientRect.Width - 1, clientRect.Height - 1));
    var innerBorder = new Rectangle(outerBorder.X + 1, outerBorder.Y + 1,
    outerBorder.Width - dropDownButtonWidth - 2, outerBorder.Height - 2);
    var innerInnerBorder = new Rectangle(innerBorder.X + 1, innerBorder.Y + 1,
    innerBorder.Width - 2, innerBorder.Height - 2);
    var dropDownRect = new Rectangle(innerBorder.Right + 1, innerBorder.Y,
    dropDownButtonWidth, innerBorder.Height + 1);
    if (RightToLeft == RightToLeft.Yes)
    {
    innerBorder.X = clientRect.Width - innerBorder.Right;
    innerInnerBorder.X = clientRect.Width - innerInnerBorder.Right;
    dropDownRect.X = clientRect.Width - dropDownRect.Right;
    dropDownRect.Width += 1;
    }
    var innerBorderColor = Enabled ? BackColor : SystemColors.Control;
    var outerBorderColor = Enabled ? BorderColor : SystemColors.ControlDark;
    var buttonColor = Enabled ? ButtonColor : SystemColors.Control;
    var middle = new Point(dropDownRect.Left + dropDownRect.Width / 2,
    dropDownRect.Top + dropDownRect.Height / 2);
    var arrow = new Point[]
    {
    new Point(middle.X - 3, middle.Y - 2),
    new Point(middle.X + 4, middle.Y - 2),
    new Point(middle.X, middle.Y + 2)
    };
    var ps = new PAINTSTRUCT();
    bool shoulEndPaint = false;
    IntPtr dc;
    if (m.WParam == IntPtr.Zero)
    {
    dc = BeginPaint(Handle, ref ps);
    m.WParam = dc;
    shoulEndPaint = true;
    }
    else
    {
    dc = m.WParam;
    }
    var rgn = CreateRectRgn(innerInnerBorder.Left, innerInnerBorder.Top,
    innerInnerBorder.Right, innerInnerBorder.Bottom);
    SelectClipRgn(dc, rgn);
    DefWndProc(ref m);
    DeleteObject(rgn);
    rgn = CreateRectRgn(clientRect.Left, clientRect.Top,
    clientRect.Right, clientRect.Bottom);
    SelectClipRgn(dc, rgn);
    using (var g = Graphics.FromHdc(dc))
    {
    using (var b = new SolidBrush(buttonColor))
    {
    g.FillRectangle(b, dropDownRect);
    }
    using (var b = new SolidBrush(outerBorderColor))
    {
    g.FillPolygon(b, arrow);
    }
    using (var p = new Pen(innerBorderColor))
    {
    g.DrawRectangle(p, innerBorder);
    g.DrawRectangle(p, innerInnerBorder);
    }
    using (var p = new Pen(outerBorderColor))
    {
    g.DrawRectangle(p, outerBorder);
    }
    }
    if (shoulEndPaint)
    EndPaint(Handle, ref ps);
    DeleteObject(rgn);
    }
    else
    base.WndProc(ref m);
    }

    private const int WM_PAINT = 0xF;
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
    public int L, T, R, B;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct PAINTSTRUCT
    {
    public IntPtr hdc;
    public bool fErase;
    public int rcPaint_left;
    public int rcPaint_top;
    public int rcPaint_right;
    public int rcPaint_bottom;
    public bool fRestore;
    public bool fIncUpdate;
    public int reserved1;
    public int reserved2;
    public int reserved3;
    public int reserved4;
    public int reserved5;
    public int reserved6;
    public int reserved7;
    public int reserved8;
    }
    [DllImport("user32.dll")]
    private static extern IntPtr BeginPaint(IntPtr hWnd,
    [In, Out] ref PAINTSTRUCT lpPaint);

    [DllImport("user32.dll")]
    private static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT lpPaint);

    [DllImport("gdi32.dll")]
    public static extern int SelectClipRgn(IntPtr hDC, IntPtr hRgn);

    [DllImport("user32.dll")]
    public static extern int GetUpdateRgn(IntPtr hwnd, IntPtr hrgn, bool fErase);
    public enum RegionFlags
    {
    ERROR = 0,
    NULLREGION = 1,
    SIMPLEREGION = 2,
    COMPLEXREGION = 3,
    }
    [DllImport("gdi32.dll")]
    internal static extern bool DeleteObject(IntPtr hObject);

    [DllImport("gdi32.dll")]
    private static extern IntPtr CreateRectRgn(int x1, int y1, int x2, int y2);
    }

    关于c# - 如何更改 ComboBox 下拉按钮颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65976232/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com