Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Transparenter Button?
CaptainIglo
myCSharp.de - Member



Dabei seit:
Beiträge: 366
Herkunft: Feldkirch - Österreich

Themenstarter:

Transparenter Button?

beantworten | zitieren | melden

Hi,

ich suche eine einfache Möglichkeit, einen (teilweise) transparenten Button zu erstellen (siehe Anhang).
Habe schon einiges Ausprobiert, aber entweder hats nicht funktioniert oder es war sehr kompliziert.

Kann mir jemand eine (einfache) Möglichkeit sagen?

mfg
Capt.Iglo
Attachments
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo CaptainIglo,

Windows.Forms oder ASP.NET?

herbivore
private Nachricht | Beiträge des Benutzers
CaptainIglo
myCSharp.de - Member



Dabei seit:
Beiträge: 366
Herkunft: Feldkirch - Österreich

Themenstarter:

beantworten | zitieren | melden

Hi,

Hab ich vergessen zu erwähnen :
Windows.Forms
Soll etwa das selbe werden, wie myHTPC nur mit Netzwerkstreaming (Server zur Aufbereitung und ein/mehrer Clienten zum Anzeigen).
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Schau dir mal den Thread dazu an

Zeichenroutine der Basisklasse komplett ausblenden
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
CaptainIglo
myCSharp.de - Member



Dabei seit:
Beiträge: 366
Herkunft: Feldkirch - Österreich

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von Andreas.May
Schau dir mal den Thread dazu an

Zeichenroutine der Basisklasse komplett ausblenden

Ist irenwie nicht das was ich will, oder ich checks nur nicht.
Aber auf jeden Fall sehe ich da mein Hintergrundbild NICHT hinter meinem Button...
private Nachricht | Beiträge des Benutzers
Vassili
myCSharp.de - Member

Avatar #avatar-2291.jpg


Dabei seit:
Beiträge: 187
Herkunft: Essen

beantworten | zitieren | melden

Transparentes zeichnen ist einfach. Dafür gibts den Alpha Wert einer Color. Aber bevor du diese verwenden kann, musst du folgendes beachten. Du musst vorher ermitteln, wie das Formular hinter deinem Steuerelement aussieht. Das hab ich noch nicht ganz raus bekommen, es funktioniert aber für die Methode DrawToBitmap in der Form Klasse. Nungut, hier haste ne kurze Beschreibung, wie du transparent zeichnen kannst.


public class TransparentButton : Button
{
	public TransparentButton()
		: base()
	{

	}
	protected override void OnPaint(PaintEventArgs pevent) 
	{
		//Hier muss du ermitteln und zeichnen, wie der Hintergrund von deinem Button aussieht. DrawToBitmap könnte dir weiterhelfen.

		//ansonsten
		Color c = Color.FromArgb(128, Color.White);
		pevent.Graphics.FillRectangle(new SolidBrush(c), ClientRectangle);
	}
}

Fast ganz unten siehst du Color.FromArgb(128, Color.White);
diese Zahl 128 ist der Alphawert der Farbe, sprich, wie transparent die Farbe sein soll. 0 absolut transparten, 255 vom Hintergrund ist nichts mehr sichtbar.

Wie du den Hintergrund herausfindest schreib ich dir sobald ich es gefunden hab. leider kann ich dir kein erfolg garantieren. wenn du es finden solltest, dann poste es. ist interessant zu wissen, wie das geht.

btw. ich hab schonmal ein eigenen button erstellt auf basis des .net buttons. du kannst mit 500 bis 2000 Zeilen für das Zeichnen einrechnen, wenn du es richtig genau machen möchtest und du musst dich mit drawing auskennen, sonst wird das nichts mit einfach und unkompliziert
private Nachricht | Beiträge des Benutzers
MacReeg
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

Hallo CaptainIglo !

Einfachheitshalber würde ich alle Buttons als Grafik auf jeweils eine PictureBox in einer Form (Button_Form) legen. In Verbindung mit der GIF-Transparenz sowie dem TransparencyKey der Form und der Opacity-Eigenschaft dieser bis Du in der Lage Deine Buttons so darzustellen wie es Deine künstlerischen Fähigkeiten hergeben.

Aus der Hintergrund-Form instanzierst Du dann Deine Button_Form und positionierst diese wohin Du sie möchtest. Über die Events MouseHover und MouseLeave der PictureBox kannst Du eine Farbanimation verwirklichen. Über den Event MouseClick der PictureBox weist Du einer öffentlichen (public) Variable (ButtonNumber) einen Wert zu, die die jeweilige PictureBox außerhalb der eigenen Form identifiziert.

Hier ein kleiner Code dazu :

namespace Button_Form
{
    public partial class Form1 : Form
    {
        public int ButtonNumber = 0;

        public Form1()
        {
            InitializeComponent();

            pictureBox1.Image = imageList1.Images[0];
            pictureBox2.Image = imageList1.Images[0];
        }

        private void pictureBox1_MouseHover(object sender, EventArgs e)
        {
            pictureBox1.Image = imageList1.Images[1];
        }

        private void pictureBox1_MouseLeave(object sender, EventArgs e)
        {
            pictureBox1.Image = imageList1.Images[0];
        }

        private void pictureBox2_MouseHover(object sender, EventArgs e)
        {
            pictureBox2.Image = imageList1.Images[1];
        }

        private void pictureBox2_MouseLeave(object sender, EventArgs e)
        {
            pictureBox2.Image = imageList1.Images[0];
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            ButtonNumber = 1;
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            ButtonNumber = 2;
        }
    }
}

Hier ein kleiner Beispielscreen der verdeutlicht, wie es etwa aussehen könnte :



Gruß Ernst
E-Mail : info@inc-x.de
Website : www.inc-x.de
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

Hallo zusammen,

ein sehr einfacher Trick im Zusammenhang mit Transparenz, ist im Paint-Teil des Buttons die Hintergrundgrafik mitzeichnen zu lassen. Das macht man dann so:


base.InvokePaintBackground(this, p_event);

So wird zunächst der Hintergrund gezeichnet, und alles was Du in Deinem OnPaint danach zeichnest, wird drübergezeichnet.

Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
private Nachricht | Beiträge des Benutzers
Vassili
myCSharp.de - Member

Avatar #avatar-2291.jpg


Dabei seit:
Beiträge: 187
Herkunft: Essen

beantworten | zitieren | melden

sofort mal ausprobieren

5 minuten vergehen

Mein erstellter Button hat nun diese eine Zeile am anfang der onpaint methode. Diese Methode verwendet die Hintergrundfarbe der Form. Wenn ich der Form ein BackgroundImage verpasse wird nicht das Bild verwendet sonder noch immer die BackColor.
private Nachricht | Beiträge des Benutzers
Vassili
myCSharp.de - Member

Avatar #avatar-2291.jpg


Dabei seit:
Beiträge: 187
Herkunft: Essen

beantworten | zitieren | melden

Alles Klar.

Ich hab ne kleine Lösung diesbezüglich gefunden. Ich glaube, das funktioniert auch nur unter VS 2005


public partial class UserControl1 : Button
{
	public UserControl1()
	{
		InitializeComponent();
		base.BackColor = Color.Transparent;
	}
	[Browsable(false)]
	[EditorBrowsable(EditorBrowsableState.Never)]
	public override Color BackColor
	{
		get { return Color.Transparent; }
	}
	protected override void OnPaint(PaintEventArgs pevent)
	{
		base.InvokePaintBackground(this, pevent);
		pevent.Graphics.FillRectangle(new System.Drawing.SolidBrush(Color.FromArgb(128, Color.White)), ClientRectangle); 
	}
}


Ich hab das mal mit einpaar anderen Steuerelementen ausprobiert und so funktioniert es. Da die Steuerelemente immer Transparent sein sollen habe ich die BackColor überschrieben, war aber jetzt zu faul ne Designerklasse zu schreiben. Deshalb ist die eigenschaft jetzt nur schreibgeschützt. Pflicht ist das nicht, das einzig wichtige ist, dass du irgendwo die BackColor = Color.Transparent setzt.

Der Rest erledigt der SolidBrush mit dem Alpha Wert 128. Dies funktioniert auch mit einem Bild im Hintergrund
private Nachricht | Beiträge des Benutzers
CaptainIglo
myCSharp.de - Member



Dabei seit:
Beiträge: 366
Herkunft: Feldkirch - Österreich

Themenstarter:

beantworten | zitieren | melden

Genau so habe ich es jetzt auch hin gekriegt....
private Nachricht | Beiträge des Benutzers
Vassili
myCSharp.de - Member

Avatar #avatar-2291.jpg


Dabei seit:
Beiträge: 187
Herkunft: Essen

beantworten | zitieren | melden

Zumindest gibts ne lösung
private Nachricht | Beiträge des Benutzers
Grimmbizkit
myCSharp.de - Member



Dabei seit:
Beiträge: 308
Herkunft: Niederrhein

beantworten | zitieren | melden

@ Vassili

wo muss ich den Code einfügen?
private Nachricht | Beiträge des Benutzers
Vassili
myCSharp.de - Member

Avatar #avatar-2291.jpg


Dabei seit:
Beiträge: 187
Herkunft: Essen

beantworten | zitieren | melden

Der Code ist ein Ausschnitt aus einer Klasse.

So an sich, kannst du den kompletten Code in dein Projekt hinzufügen und es sollte funktionieren. Da das aber nicht aussreicht um einen ganzen Button darzustellen musst du die Klasse erweitern.

Am besten fügst du zu deinem Projekt ne neue leere KLasse hinzu und schnibbelst dir die einzelnen notwendigen parts aus dem codebeispiel hier raus und fügst die in deine leere klasse hinzu.
private Nachricht | Beiträge des Benutzers