Transparenter Button ohne Border

Hallo,

ich benötige in VB oder C# einen Button, Hintergrund soll ein transparentes Bild sein und er darf keine Border haben.
Das Button Control würde mir aus dem Grund zusagen, da ich mir dann um den Text und Font keine Gedanken machen muss.
Aber kann man das mit dem Button Control überhaupt machen?

Ansonsten müßte das doch mit der PictureBox möglich sein - vorrausgesetz man kümmert sich selber um Text und Font - oder?

Danke,

Andre

Hi Andre,

für VB6 habe ich für den Zweck ein eigenes OCX.
Falls keine bessere Antwort kommt genügt eine Mail. :smile:

Gruß, Rainer

Hallo!
Wenn es Dir nur um das Hintergrundbild geht, warum dann ein Button oder eine PictureBox? Wenn Du sonst wirklich nix anderes willst, kannst Du genausogut auch nur ein Control nehmen, auch das hat ein BackgroundImage Property (und die anderen „üblichen“ Sachen wie Font und Color).
Falls Du bezüglich der Darstellung doch noch irgendwelchen besonderen Voodoo treiben willst, kannst Du ganz leicht eine eigene Klasse von Control ableiten und dort die OnPaint() Methode überschreiben und das Zeichnen selbst erledigen.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hm, Voodoo nicht wirklich, halt nur die Funktionalität eines Button Controls (in diesem Fall MouseOver MouseDown) - also ich denke mal das ja generell alle eigenschaften da sind.
Danke für den Tip - auf ein einfaches Control wäre ich nicht gekommen.

Danke,
Andre

Hallo!
Wenn es Dir nur um das Hintergrundbild geht, warum dann ein
Button oder eine PictureBox? Wenn Du sonst wirklich nix
anderes willst, kannst Du genausogut auch nur ein
Control nehmen, auch das hat ein
BackgroundImage Property (und die anderen
„üblichen“ Sachen wie Font und Color).
Falls Du bezüglich der Darstellung doch noch irgendwelchen
besonderen Voodoo treiben willst, kannst Du ganz leicht eine
eigene Klasse von Control ableiten und dort die
OnPaint() Methode überschreiben und das
Zeichnen selbst erledigen.

Gruß,
Martin

Danke für das Angebot aber das soll selber mal ein Assembly werden.
Ich fürchte das muss ich selber stricken …

Danke,
Andre

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Noch mal zum Control:
Es existiert ja kein Property Text.
Wenn ich dieses Property nun anlegen will bekomme ich die Fehlermeldung, dass dieses Property bereits existiert und deswegen Overrides verwendet werden muss.

Aber das Control kennt Text doch gar nicht oder?
Im Eingenschaften Fenster ist zumindest nichts zu finden …

Gruß,

Andre

Hallo Andre,

Danke für das Angebot aber das soll selber mal ein Assembly
werden.

ach so, na wie wär’s dann mit dem Quellcode als Text? Für’s Brett ist es einfach zu viel.

Gruß, Rainer

Hallo!
Deine erste Informationsquelle, was für Eigenschaften/Methoden eine Klasse hat, sollte IMO nicht das Klicki-Bunti-Eigenschaftsfenster eines Designers sein :smile:, sondern die Framework-Dokumentation.
Dort steht klar und deutlich, dass die Klasse Control eine Eigenschaft Text hat.
Bezüglich dessen, was und wie im PropertyGrid angezeigt wird, kann man viel zu viel anstellen, um es als erschöpfende Informationsquelle zu benutzen.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ok, wieder was dazu gelernt.
Aber das ganze soll ja mal ein Custom Control werden.
Also habe ich die Eigenschaft Text mal überschrieben, damit es auch im PropertyGrid erscheint.
Hat bei allen anderen selbst angelegten Properties geklappt - nur bei Text nicht …

Gibt es da einen Trick?

Danke,
Andre

Hallo!
Deine erste Informationsquelle, was für Eigenschaften/Methoden
eine Klasse hat, sollte IMO nicht das
Klicki-Bunti-Eigenschaftsfenster eines Designers sein :smile:,
sondern die Framework-Dokumentation.
Dort steht klar und deutlich, dass die Klasse Control eine
Eigenschaft Text hat.
Bezüglich dessen, was und wie im PropertyGrid angezeigt wird,
kann man viel zu viel anstellen, um es als erschöpfende
Informationsquelle zu benutzen.

Gruß,
Martin

Ok, wieder was dazu gelernt.
Aber das ganze soll ja mal ein Custom Control werden.
Also habe ich die Eigenschaft Text mal überschrieben, damit es
auch im PropertyGrid erscheint.
Hat bei allen anderen selbst angelegten Properties geklappt -
nur bei Text nicht …

Gibt es da einen Trick?

Nö.
Text ist genau so ein Property von Control wie bspw. Font oder BackColor und steht damit genauso in einem von Control abgeleiteten Steuerelement zur Verfügung.
Über das Attribut [Browsable(false)] kann man zwar Properties für den Designer ausblenden, aber dieses Attribut ist bei keiner der oben erwähnten Eigenschaften gesetzt, daher müssten sie alle im PropertyGrid sichtbar sein (und sind es auch in meinem extra dafür angelegten Mini-Testprojekt).

Lass’ uns doch mal ein bisschen Code sehen (und ein paar Infos zur Umgebung), dann können wir vll. mehr sagen.

Gruß,
Martin

Danke,
Andre

Ok, nicht, daa ich was falsch verstehe:
Ich erzeuge ein neues Projekt, Windows-Steuerelementbibliothek.
Das UserControl sieht bei mir dann so aus http://it-bergmann.de/Control.jpg (VS 2005 Pro).
Es existiert bis hier her keinen Code, aber das Property erscheint nicht im Grid.
Aber wie Du sagst, dass Property selber ist da …

Nö.
Text ist genau so ein Property von Control
wie bspw. Font oder
BackColor und steht damit genauso in einem
von Control abgeleiteten Steuerelement zur
Verfügung.
Über das Attribut [Browsable(false)] kann
man zwar Properties für den Designer ausblenden, aber dieses
Attribut ist bei keiner der oben erwähnten Eigenschaften
gesetzt, daher müssten sie alle im PropertyGrid sichtbar sein
(und sind es auch in meinem extra dafür angelegten
Mini-Testprojekt).

Lass’ uns doch mal ein bisschen Code sehen (und ein paar Infos
zur Umgebung), dann können wir vll. mehr sagen.

Gruß,
Martin

Danke,
Andre

Ah, da haben wir es schon. Ich hatte gemeint, dass Du eine Klasse von Control ableitest, nicht von UserControl.
Letzteres wird häufig dafür benutzt, um mehrere Einzelelemente zu einem Gesamt-Steuerelement zusammenzufassen, vielleicht hat sich MS deswegen entschlossen, beim UserControl das Property Text tatsächlich zu überschreiben…

Wenn Du also nicht ein „Benutzersteuerelement“ in Dein Projekt einfügst, sondern ein „Benutzerdefiniertes Steuerelement“ (die dt. Übersetzungen unterscheiden sich leider so gut wie nicht), dann hast Du das Gerüst für Dein Steuerelement und das Text Property wird auch im Designer angezeigt.

Gruß,
Martin

Klasse, hat etwas gedauert - aber nun ist fast alles gut.
Sprich Image und Text funktionieren soweit - Danke!

Funktioniert es nun noch, dass Image (PNG mit Alpha Channel), welches als Hintergrundbild verwendet wird Transparent erscheinen zu lassen?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!
Prima, dass es soweit schon mal geklappt hat.
Das mit der Transparenz ist allerdings ein komplett anderes Kaliber als das, was Du bisher gemacht hast.
Jedes Control ist normalerweise rechteckig, hat aber auch eine Region , über die man festlegen kann, welchen Bereich innerhalb des Rechtecks das Control tatsächlich belegt (bspw. ein Button mit abgerundeten Ecken).
Die Region aus einem beliebigen PNG mit Alphakanal zu berechnen ist nicht ganz trivial, kann aber funktionieren.
Was Du allerdings damit nicht hinbekommen wirst, sind halbtransparente Bereiche. Hierzu müsstest Du mit sog. Layered Windows arbeiten, die nativ von .NET (noch?) nicht unterstützt werden, es ist also einiges an P/Invoke-Aufrufen nötig.

Gruß,
Martin

Hi,

Finde ich toll, wie einem hier geholfen wird - Danke noch mal.
Also war die Idee, den Hintergrund zu kopieren und das Image darüber zu legen nicht nur eine Tat meiner Verzweiflung, sondern tatsächlich auch die einzige Lösung wenn ich Dich richtig verstehe?
Ich habe mit diesem Ansatz ein wenig gearbeitet:
Dim rect As Rectangle
rect.X = picResult.Left ’ Hier liegt das Ziel Control
rect.Y = picResult.Top
rect.Width = picResult.Width
rect.Height = picResult.Height
Dim bm_src1 As Bitmap = picSource1.Image.Clone ’ Das PNG Image
Dim bm_src2 As Bitmap = CopyBitmap(Me.BackgroundImage, rect) ’ Der Bereich unter dem Ziel Control
Dim bm_out As New Bitmap(bm_src1.Width, bm_src1.Height)
Dim gr As Graphics = Graphics.FromImage(bm_out)

’ Give the images alpha gradients.
'Dim alpha As Integer
For x As Integer = 0 To bm_src1.Width - 1
'alpha = (255 * x) \ bm_src1.Width
For y As Integer = 0 To bm_src1.Height - 1
Dim clr As Color = bm_src1.GetPixel(x, y)
clr = Color.FromArgb(clr.A, clr.R, clr.G, clr.B)
bm_src1.SetPixel(x, y, clr)

clr = bm_src2.GetPixel(x, y)
clr = Color.FromArgb(clr.A, clr.R, clr.G, clr.B)
bm_src2.SetPixel(x, y, clr)
Next y
Next x

’ Draw the images onto the result.
gr.DrawImage(bm_src1, 0, 0)
gr.DrawImage(bm_src2, 0, 0)

’ Display the result.
picResult.Image = bm_out

Aber das bringt zwei Probleme mit sich:
Erstens ist die Hintergrundgrafik ein wenig nach unten verschoben, die Koordinaten des Ziel Controls scheinen also nicht den tatsächlichen Koordinaten zu entsprechen.
Vielleicht durch die Border der Form?

Und zweitens wird das PNG so wie oben gar nicht angezeigt.
Nehme ich aber statt clr.A den berechneten Wert alpha (im Quelltext auskommentiert= dann geht es, sieht halt nur nicht mehr so aus, wie dass Original.

Gruß,

Andre

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Tip: Transparenter Button ohne Border
Hi zusammen,

isch hab jetzt gar nicht alles durchgelesen (schande über mich) aber einen Tip in sachen Buttons:

Es gibt eine CS Datei die ins Projekt eingebunden werden muss. Danach steht ein neues Steuerelement zur Verfügung und zwar ein Button. Diese läßt sich mit allen dingen anpassen. Er ist im Vista Style und sieht echt bombig aus. Kein Rahmen oder ä.

Link habe ich gerade nicht. Aber schau mal bei google.de unter c# vista Button style

bye
Markus