winforms 如何在WindowsForm中创建一个带有文本“ok”的按钮,但将其拆分为2个背景色?

hivapdat  于 2022-12-14  发布在  Windows
关注(0)|答案(2)|浏览(133)

我想用C#在WindowsForm中创建一个按钮,按钮的一半填充红色(背景色),另一半填充蓝色(背景色),并将文本“ok”居中。
我不知道如何开始,所以我用了一个计时器来填充,10毫秒过去了,颜色。
但请注意,计时器不是什么是要求,只是一个按钮分为2种颜色。
但计时器的问题是图形的事情发生在按钮后面,但我需要它发生在按钮上,所以像按钮应该在背景而不是在前面。
所以我移动了按钮上方的计时器填充,这样你就能明白我的意思了。
因此:
1.如何修复下面与计时器想法相关的代码?(又名如何将按钮放在后台?)
1.还有其他办法吗?
这就是我目前所尝试的:

public Form1()
    {
        InitializeComponent();
    }
    Graphics g;
    int y = 0; int x = 0;

private void Form1_Load(object sender, EventArgs e)
    {
        g = this.CreateGraphics();
    }

private void button1_Click(object sender, EventArgs e)
    {

        timer1.Enabled = true;
  
    }

 private void timer1_Tick(object sender, EventArgs e)
    {
        this.Refresh();

        g.FillRectangle(Brushes.Red, new Rectangle(new Point(button1.Location.X, button1.Location.Y-100), new Size(y,button1.Size.Height)));
        if (y < (button1.Size.Width / 2))
            y++;
        else
        {
            
            g.FillRectangle(Brushes.Blue, new Rectangle(new Point(button1.Location.X+button1.Size.Width/2, button1.Location.Y - 100), new Size(x, button1.Size.Height)));
            if (x < (button1.Size.Width/2))
                x++;
        }

    }
ijnw1ujt

ijnw1ujt1#

这似乎是一个太复杂的方式来着色按钮。它总是一个坏主意,覆盖任何上面的控件。它可以干扰您的点击/事件等。
我也可以选择使用两种颜色的图像背景,如here所述

public Form1()
{
    // Assign an image to the button.
    button1.Image = Image.FromFile("C:\\Graphics\\MyBitmap.bmp");
    // Align the image and text on the button.
    button1.ImageAlign = ContentAlignment.MiddleRight;    
    button1.TextAlign = ContentAlignment.MiddleLeft;
    // Give the button a flat appearance.
    button1.FlatStyle = FlatStyle.Flat;
}

不幸的是,没有办法创建一个带有渐变值的System.Drawing.Color来解决您的问题,并将其分配给按钮的背景颜色属性,因此您最好的选择是图像背景。

np8igboo

np8igboo2#

使用位图作为背景可能是最简单的方法。
您可以生成一个自定义控件,该控件生成一个用指定颜色填充的位图,并将其分配给Button的BackGroundImage属性。
您还可以添加一个公共属性(这里是一个名为Colors的数组)来更改填充位图的颜色,该属性可以在设计时或运行时设置
要使用此自定义控件,请向项目中添加一个类,将其命名为ButtonBicolor,用此代码替换所有内容,生成项目,在工具箱中找到新控件并将其放到窗体上

注意Colors属性(或设计工具)没有附加自订编辑器,因此您无法在PropertyGrid中设定单一值,您必须开启对话方块并确认变更,才能看到套用的新色彩

using System.Drawing;
using System.Windows.Forms;

public class ButtonBicolor : Button {

    private Color[] m_Colors = { Color.Red, Color.Blue };
    private Bitmap background = null;
    public ButtonBicolor() {
        base.BackgroundImageLayout = ImageLayout.None;
        BuildBackgroundImage();
    }

    protected override void OnResize(EventArgs e) {
        base.OnResize(e);
        BuildBackgroundImage();
    }

    public Color[] Colors {
        get => m_Colors;
        set {
            m_Colors = value;
            BuildBackgroundImage();
        }
    }

    public new Image BackgroundImage => null;
    public new ImageLayout BackgroundImageLayout => ImageLayout.None;

    private void BuildBackgroundImage()
    {
        if (Colors is null || Colors.Length < 2) return;
        background?.Dispose();
        background = new Bitmap(ClientSize.Width, ClientSize.Height);

        using (var g = Graphics.FromImage(background))
        using (var brushLeft = new SolidBrush(Colors[0]))
        using (var brushRight = new SolidBrush(Colors[1])) {
            g.FillRectangle(brushLeft, new RectangleF(0, 0, background.Width / 2, background.Height));
            g.FillRectangle(brushRight, new RectangleF(background.Width / 2, 0, background.Width / 2, background.Height));
        }
        base.BackgroundImage = background;
    }
}

相关问题