Hallo @ all!
ich habe folgendes vor:
in der Form ist als Hintergrund ein Ringblock angegeben. Dieser Ringblock hatten um sich herum einen Schatten...dieses Teil der Bildes, also den Schatten, muss ich transparent machen, damits nach was aussieht ,-)
Wiss ihr vielleicht wie ich das am besten hinkriege?
Danke für alle Atnworten!
lg Dennis
Hallo dennisspohr,
am besten geht das so, dass Du am einfachsten den Schatten mit einem Bildbearbeitungsprogramm auf die Farbe Pink setzt. Dann kann man hergehen und in der Win-Form die Farbe Pink als Transparent auswählen, und fertig.
Grüße
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
ja gut...aber der Schatten ist doch nicht einfarbig? Der besteht ja aus dunklen und hellen Tönen.
Hallo dennisspohr,
das ist ja nicht immer der Fall. Einfachste Schatten sind uni-farbig.
Ich glaube jetzt aber Dein Problem richtig zu verstehen. Du möchtest das Transparentverhalten fließend gestalten, oder?
Da muss ich dann passen, das sollte jemand beantworten, der sehr gute Grafikkenntnisse hat.
Grüße
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Hallo Norman-Timo,
aber ich möchste einen etwas schöneren Schatten g
Ganz genau..fließend 🙂
Trotzdem Danke! 😉
lg Dennis
evtl. einen LinearGradientBrush mit Farbe1-> Color.FromArgb(100, Farbe1) wobei die 100 der Alpha-Kanal ist. Danach ein Graphics.FillRectangle().
Erstmal danke für deine Antwort...aber ich komme damit nicht "ganz klar", kannst du mir mal ein kleines Beispiel posten oder deine Antwort näher beschreiben?
lg Dennis
Hallo nochmal,
ich erinnere mich mal dünkel, dass ich das selbst mal realisiert habe und auch hier gepostet peinlichsein:
Bild mit Beispiel:
Rectangle Schatten zeichnen
und hier passender Code dazu:
Rectangle Schatten zeichnen
Allerdings solltest Du dann den Schatten Deines Bildes vorher komplett wegschneiden, und das Ganze funktioniert nur mit Schatten in einer rechteckigen Fläche.
Grüße
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Wenn du deinen Hintergrund z.B. in einer Picturebox hast:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Text;
namespace WindowsApplication1
{
public class GradientPictureBox : PictureBox
{
#region Protected overridden functions
//Dieses Beispiel sollte am rechten Rand der pictureBox etwas schattenähnliches über das Bild zeichnen.
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
//Schattenbereich
RectangleF shadowArea = new RectangleF(Bounds.X + Bounds.Width - 15, Bounds.Y + 15, 15, Bounds.Height - 15);
//Verwendete Farben
Color transparent = Color.Transparent;
Color shadowEnd = Color.FromArgb(100, Color.DimGray);
using (LinearGradientBrush lgbShadow = new LinearGradientBrush(shadowArea, transparent, shadowEnd, LinearGradientMode.Horizontal))
{
pe.Graphics.FillRectangle(lgbShadow, lgbShadow);
}
}
#endregion
}
}
Aaalso.. Ich habe deinen Quellcode mal ein das OnPain-Event von meiner Form hineinkopiert:
//Dieses Beispiel sollte am rechten Rand der pictureBox etwas schattenähnliches über das Bild zeichnen.
base.OnPaint(pe);
//Schattenbereich
RectangleF shadowArea = new RectangleF(Bounds.X + Bounds.Width - 15, Bounds.Y + 15, 15, Bounds.Height - 15);
//Verwendete Farben
Color transparent = Color.Transparent;
Color shadowEnd = Color.FromArgb(100, Color.DimGray);
using (LinearGradientBrush lgbShadow = new LinearGradientBrush(shadowArea, transparent, shadowEnd, LinearGradientMode.Horizontal))
{
pe.Graphics.FillRectangle(lgbShadow, shadowArea);
}
Beim Aufruf der Form kommt folgender Fehler:
An unhandled exception of type 'System.StackOverflowException' occurred in Client.exe
Hinzu kommt, dass das Bild, auf das der Schatten angewendet werden soll, als Hintergrund in der Form ist. In einer PictureBox nützt mir die Grafik nichts, da ich dann meine Labels nicht transparent bekomme.
lg Dennis
Den Code kannst du auch auf eine Form anwenden.
Ich habe den Code nicht getestet sonder einfach mal reingehackt, aber schau doch mal ob die "shadowArea" variable irgendwo (beim erstellen des Brushes) eine Height oder Width von "0" hat.
Ich verstehe den Code nicht komplett, wie wende ich ihn denn auf die Form an? Es gibt ja auch nirgends einen Verweis auf eine PictureBox...oder seh ich da was falsch?
lg Dennis
Okay....den Fehler habe ich behoben..allerdings taucht nirgends ein Schatten oder etwas ähnliches auf... 🙁
Naja, der Code den ich gepostet habe ist eine abgeleitete PictureBox. Sie hat keinen Constructor (wie schlampig 😉 und somit auch keinen InitializeComponent() aufruf daher könnte z.B. kommen das Bounds.Width und Bounds.Height leer (0) sind.
Da wenn du eine neue Form erstellst diese immer von Form abgeleitet ist kannst du auch einfach die OnPaint-methode überschreiben und den Code dort verwenden (Die EventArgs heissen dort nur anders z.B. anstelle von pe.Graphics e.Graphics).
Als erstes wird der Bereich ermittelt in den der Schatten (oder das Schattenähnliche 😉 gezeichnet erden soll (shadowArea). Diesen Berich musst du natürlich von der Grösse deines Bildes und des Schattens bzw. deiner Form abhängig machen.
Danach wird ein LinearGradientBrush mit den gewünschten Farben erstellt (im using(){} damit er nachher automatisch wieder freigegeben wird, muss aber nicht sein).
Dann nehme ich das Graphics objekt aus den EventArgs und fülle die shadowArea mit dem erstellten Brush.
Zum verfeinern:
Man könnte natürlich auch mehrere GradientBrushes oder einen PathGradientBrush usw. nutzen aber da du scheinbar noch nicht viel mit dem Drawing namespace gearbeitet hast solltest du das ertmal einfach halten und dann nach und nach ausbauen.
Ok 😉 shadowArea war falsch:
RectangleF shadowArea = new RectangleF(Bounds.Width - 15, 15, 15, Bounds.Height - 15);
ja gut...den Schatten habe ich hinbekommen, aber transparent ist er nicht wirklich... 🙁
lg Dennis
Das kommst jetzt darauf an was für Alpha-Werte du den Farben zuweist.
was sind Alpha-Werte, mal ganz blöd gefragt?
Hallo dennisspohr,
bitte schlage unbekannte Begriffe selbst nach. Vielen Dank!
herbivore
Color.FromArgb(100, Farbe1) wobei die 100 der Alpha-Kanal ist.
okay....aber wenn ich die 100 umändere... (habe ein wenig experimentiert) ändert sich lediglich der Farbverlauf, Transparenz ist nirgends zu entdecken.
Form teilweise transparent
Hmm mir ist gerade aufgefallen das wir evtl. aneinander vorbeireden.
Meintest du vielleicht sowas?
http://www.codeproject.com/useritems/How_to_make_VistaForm.asp
Du willst quasi einen Teil der Form transparent haben, das geht mit Regions und dem GraphicsPath, ich kram mal nach einem Artikel.
Suchen musst du für sowas nach runde Form oder ähnlichem (warscheinlich schonmal im Froum gewesen)
http://www.codeproject.com/cs/miscctrl/customcsforms.asp
http://www.codegod.de/WebAppCodeGod/gdi-custom-shape-for-forms-AID133.aspx
[Nachtrag]
Bei diesen Varianten muss der Schatten in deinem Image transparent sein (z.B. PNG mit Alpha Kanal oder ähnlich)
Vielen vielen Dank für deine Hilfe und die Links! Ich werde sie mir nächste Woche mal anschauen....jetzt ist Feierabend 😉
lg Dennis
So...also wie ich die Form transparent kriege ist im Prinzip kein Problem, einfach folgendes einfügen:
public Form1()
{
InitializeComponent();
base.Opacity = 0.5;
}
Das Problem ist nur, bisher sind alle meine Versuche gescheitert, die Form nur an bestimmten Stellen, also z.B. am Rand, transparemt zu kriegen.
Vielleicht ist es ja auch möglich, nur bestimme Kompenten, z.B. eine PictureBox transparent zu kriegen.
lg Dennis
Vielleicht hilft dir auch der hier weiter:
http://www.codeproject.com/cs/media/CsTranspTutorial3.asp
Oder auf blöd reicht auch schon der TransparencyKey der Form (Musst allerdings wieder an deinem Bild rumbasteln).