Laden...

Form teilweise transparent

Erstellt von dennisspohr vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.819 Views
dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren
Form teilweise transparent

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

4.506 Beiträge seit 2004
vor 16 Jahren

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

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

ja gut...aber der Schatten ist doch nicht einfarbig? Der besteht ja aus dunklen und hellen Tönen.

4.506 Beiträge seit 2004
vor 16 Jahren

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

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

Hallo Norman-Timo,

aber ich möchste einen etwas schöneren Schatten g
Ganz genau..fließend 🙂

Trotzdem Danke! 😉

lg Dennis

2.760 Beiträge seit 2006
vor 16 Jahren

evtl. einen LinearGradientBrush mit Farbe1-> Color.FromArgb(100, Farbe1) wobei die 100 der Alpha-Kanal ist. Danach ein Graphics.FillRectangle().

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

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

4.506 Beiträge seit 2004
vor 16 Jahren

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

2.760 Beiträge seit 2006
vor 16 Jahren

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


dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

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

2.760 Beiträge seit 2006
vor 16 Jahren

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.

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

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

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

Okay....den Fehler habe ich behoben..allerdings taucht nirgends ein Schatten oder etwas ähnliches auf... 🙁

2.760 Beiträge seit 2006
vor 16 Jahren

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.

2.760 Beiträge seit 2006
vor 16 Jahren

Ok 😉 shadowArea war falsch:


RectangleF shadowArea = new RectangleF(Bounds.Width - 15, 15, 15, Bounds.Height - 15);
dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

ja gut...den Schatten habe ich hinbekommen, aber transparent ist er nicht wirklich... 🙁

lg Dennis

2.760 Beiträge seit 2006
vor 16 Jahren

Das kommst jetzt darauf an was für Alpha-Werte du den Farben zuweist.

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

was sind Alpha-Werte, mal ganz blöd gefragt?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo dennisspohr,

bitte schlage unbekannte Begriffe selbst nach. Vielen Dank!

herbivore

2.760 Beiträge seit 2006
vor 16 Jahren

Color.FromArgb(100, Farbe1) wobei die 100 der Alpha-Kanal ist.

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

okay....aber wenn ich die 100 umändere... (habe ein wenig experimentiert) ändert sich lediglich der Farbverlauf, Transparenz ist nirgends zu entdecken.

2.760 Beiträge seit 2006
vor 16 Jahren

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)

2.760 Beiträge seit 2006
vor 16 Jahren

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)

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

Vielen vielen Dank für deine Hilfe und die Links! Ich werde sie mir nächste Woche mal anschauen....jetzt ist Feierabend 😉

lg Dennis

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

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

2.760 Beiträge seit 2006
vor 16 Jahren

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