Laden...

Transparenter Button?

Erstellt von CaptainIglo vor 17 Jahren Letzter Beitrag vor 16 Jahren 6.226 Views
C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren
Transparenter Button?

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

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo CaptainIglo,

Windows.Forms oder ASP.NET?

herbivore

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

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).

915 Beiträge seit 2006
vor 17 Jahren

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(

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

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


>

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...

187 Beiträge seit 2005
vor 17 Jahren

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

M
49 Beiträge seit 2006
vor 17 Jahren

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

4.506 Beiträge seit 2004
vor 17 Jahren

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!”

187 Beiträge seit 2005
vor 17 Jahren

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.

187 Beiträge seit 2005
vor 17 Jahren

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

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Genau so habe ich es jetzt auch hin gekriegt....

187 Beiträge seit 2005
vor 17 Jahren

Zumindest gibts ne lösung 😉

G
308 Beiträge seit 2006
vor 16 Jahren

@ Vassili

wo muss ich den Code einfügen?

187 Beiträge seit 2005
vor 16 Jahren

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.