У нас есть проект Windows Forms с довольно несколькими кнопками FlatStyle.
Когда мы выключаем кнопки, цвета кнопок меняются автоматически Frown |: (
Можно ли как-то переопределить это, чтобы мы могли сами контролировать цвета?
У нас есть проект Windows Forms с довольно несколькими кнопками FlatStyle.
Когда мы выключаем кнопки, цвета кнопок меняются автоматически Frown |: (
Можно ли как-то переопределить это, чтобы мы могли сами контролировать цвета?
Для установки нужного цвета необходимо использовать событие EnabledChanged. Вот пример.
private void Button1_EnabledChanged(object sender, System.EventArgs e)
{
Button1.ForeColor = sender.enabled == false ? Color.Blue : Color.Red;
Button1.BackColor = Color.AliceBlue;
}
Используйте нужные цвета в соответствии с вашими требованиями.
Также вам нужно использовать событие paint.
private void Button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
dynamic btn = (Button)sender;
dynamic drawBrush = new SolidBrush(btn.ForeColor);
dynamic sf = new StringFormat {
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center };
Button1.Text = string.Empty;
e.Graphics.DrawString("Button1", btn.Font, drawBrush, e.ClipRectangle, sf);
drawBrush.Dispose();
sf.Dispose();
}
Чтобы получить менее-нечеткий текст, вместо этого используйте класс TextRenderer:
private void Button1_Paint(object sender, PaintEventArgs e)
{
Button btn = (Button)sender;
// make sure Text is not also written on button
btn.Text = string.Empty;
// set flags to center text on button
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak; // center the text
// render the text onto the button
TextRenderer.DrawText(e.Graphics, "Hello", btn.Font, e.ClipRectangle, btn.ForeColor, flags);
}
И метод Button1_EnabledChanged, как в суровом ответе.
Я следовал следующему подходу: - Событием Click() кнопки можно управлять с помощью пользовательской переменной.
private bool btnDisabled;
private void btnClick(object sender, EventArgs e){
if(!btnDisabled) return;}
Таким образом, кнопки даже не нужно отключать. У кнопки все еще есть ощущение щелчка, но никаких действий не будет. Необходимо использовать правильные цвета, чтобы сообщить, что кнопка отключена.
Я использую ClientRectangle вместо e.ClipRectangle, чтобы избежать эффекта клипа, когда кнопка частично перерисовывается:
e.Graphics.Clear(BackColor);
using (var drawBrush = new SolidBrush(ForeColor))
using (var sf = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
})
{
e.Graphics.DrawString(Text, Font, drawBrush, ClientRectangle, sf);
}
Никогда не поздно для предложения:
public class BlackButton : Button
{
#region #Private Members
private bool m_BasePaint = false;
#endregion #Private Members
#region #Ctor
public BlackButton() : base()
{
base.ForeColor = Color.White;
base.BackColor = Color.Black;
this.DisabledForeColor = Color.FromArgb(0x6D, 0x6D, 0x6D);
}
#endregion #Ctor
#region #Public Interface
public Color DisabledForeColor
{
get;
set;
}
#endregion #Public Interface
#region #Overrides
public override string Text
{
get
{
if (m_BasePaint)
return "";
return base.Text;
}
set
{
base.Text = value;
}
}
protected override void OnPaint(PaintEventArgs pevent)
{
m_BasePaint = true;
base.OnPaint(pevent);
m_BasePaint = false;
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;
TextRenderer.DrawText(pevent.Graphics,
Text,
base.Font,
pevent.ClipRectangle,
base.Enabled ? base.ForeColor : this.DisabledForeColor,
flags);
}
#endregion #Overrides
}