У меня есть следующий простой код, который должен нарисовать кнопку градиента, добавленную как gradbtn.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace CustomControls.GradientControls
{
public class Gradbtns : Button
{
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
pevent.Graphics.FillRectangle(new LinearGradientBrush(
new PointF(0, this.Height / 2), new PointF(this.Width, this.Height / 2),
Color.AliceBlue, Color.BurlyWood), this.ClientRectangle);
}
}
}
Проблема с рисованием с помощью приведенного выше кода заключается в том, что он не включает действие нажатия кнопки «Кнопка» в форме, а выглядит так, как если бы он был нарисован в форме. Но использование события «OnPaintBackground» активирует кнопку, но цвета не отображаются, см. изображение ниже.
Но если срабатывает событие OnPaintBackground, оно работает... так в чем же разница?
Вам необходимо использовать метод OnClick для реализации функции нажатия кнопки. Ниже приведен проверенный пример кода, в котором выполнена некоторая оптимизация реализации градиентного фона и настроек внешнего вида элемента управления, это должно удовлетворить ваши потребности:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace CustomControlsLibrary
{
public class GradientButton : Button
{
public Color GradientColor1 { get; set; } = Color.AliceBlue;
public Color GradientColor2 { get; set; } = Color.BurlyWood;
public Color TextColor { get; set; } = Color.DarkBlue;
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
// Get the graphical object of the control
Graphics graphics = pevent.Graphics;
// Create brush for the background gradient
using (LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, GradientColor1, GradientColor2, LinearGradientMode.Horizontal))
{
graphics.FillRectangle(brush, this.ClientRectangle);
}
// Draw text
using (SolidBrush textBrush = new SolidBrush(TextColor))
{
SizeF textSize = graphics.MeasureString(this.Text, this.Font);
PointF locationToDraw = new PointF();
locationToDraw.X = (this.Width / 2) - (textSize.Width / 2);
locationToDraw.Y = (this.Height / 2) - (textSize.Height / 2);
graphics.DrawString(this.Text, this.Font, textBrush, locationToDraw);
}
// Process control border
ControlPaint.DrawBorder(graphics, this.ClientRectangle, Color.Black, ButtonBorderStyle.Solid);
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
MessageBox.Show("Gradient Button Clicked!");
}
}
}
Добавьте такой код, чтобы включить анимацию щелчка:
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
this.GradientColor1 = Color.DarkBlue;
this.GradientColor2 = Color.LightBlue;
this.TextColor = Color.White;
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
this.GradientColor1 = Color.LightBlue;
this.GradientColor2 = Color.DarkBlue;
this.TextColor = Color.DarkBlue;
}
да, теперь это работает, но в отличие от обычных кнопок в Visual Studio я не вижу анимацию щелчка на кнопке, например, если она наведена на кнопку, она мерцает, а если нажать, то мерцает... как это включить
Смотрите последнюю отредактированную часть моего ответа. @CrazyFirewall
Да, здорово, это работает... Спасибо... Но также требуется событие onMouseHover, которое я уже сделал...
Вам необходимо реализовать события мыши и фокуса, чтобы определить состояние кнопки (горячая, нажатая, нормальная...) и принять это во внимание при рисовании кнопки. Посмотрите, например, это Вопросы и ответы.