Sto provando a creare un pulsante trasparente in C# (.NET 3.5 SP1) da utilizzare nella mia applicazione WinForms. Ho provato di tutto per rendere il pulsante trasparente (dovrebbe mostrare lo sfondo sfumato sotto il pulsante) ma non funziona.Disegno di un pulsante trasparente
Ecco il codice che sto utilizzando:
public class ImageButton : ButtonBase, IButtonControl
{
public ImageButton()
{
this.SetStyle(
ControlStyles.SupportsTransparentBackColor |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint, true);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs pevent)
{
Graphics g = pevent.Graphics;
g.FillRectangle(Brushes.Transparent, this.ClientRectangle);
g.DrawRectangle(Pens.Black, this.ClientRectangle);
}
// rest of class here...
}
Il problema è che il pulsante sembra afferrare la memoria UI caso da qualche parte e si riempire con un po 'di buffer dall'interfaccia utente di Visual Studio (quando è in modalità di progettazione). In fase di esecuzione sta acquisendo un po 'di buffer zero ed è completamente nero.
Il mio obiettivo finale è dipingere un'immagine su un pulsante invisibile anziché sul rettangolo. Il concetto dovrebbe rimanere lo stesso comunque. Quando l'utente passa sopra il pulsante, viene disegnata una forma di tipo pulsante.
Qualche idea?
EDIT: Grazie a tutti, i seguenti ha lavorato per me:
public class ImageButton : Control, IButtonControl
{
public ImageButton()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.ResizeRedraw, true);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs pevent)
{
Graphics g = pevent.Graphics;
g.DrawRectangle(Pens.Black, this.ClientRectangle);
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// don't call the base class
//base.OnPaintBackground(pevent);
}
protected override CreateParams CreateParams
{
get
{
const int WS_EX_TRANSPARENT = 0x20;
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}
// rest of class here...
}
sembra essere un duplicato di: http://stackoverflow.com/questions/201778/can-i-create-transparent-buttons-in-visual -studio-2005-with-c – Aamir
Ciò che è stato suggerito in quella discussione non ha funzionato per me. – rein
prova a dipingere con un nuovo colore con valore di opacità 0 invece di Color.Transparent – TheVillageIdiot