vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Grafik und Font · Grafische Effekte   |   VB-Versionen: VB202207.12.24
Ein Schatten für ein gezeichnetes Rechteck

Es wird eine Funktion veröffentlicht, die das Zeichnen eines Schattens um ein Rechteck realisiert.

Autor:   Dietrich HerrmannBewertung:  Views:  938 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein Beispielprojekt 

Grundlage: Man zeichnet mit DrawRectangle ein Rechteck auf ein Graphics-Objekt.

Zu diesem Rechteck erstellt man das Rechteck für den Schatten derart, dass es rundum in der Größe der Schattenbreite größer ist, ein sogenanntes umschließendes Rechteck. Heißt: das originale Rechteck hat dann gewissermaßen einen Rand der Schattenbreite.

Beispiel:

Dim origRect As Rectangle = New Rectangle(100, 100, 200, 200)
Dim sw As Short = 20	' Schattenbreite
Dim shadowRect As Rectangle = New Rectangle(100 - sw, 100 - sw, 200 + sw, 200 + sw)

Angenommen das origRect ist auf Form gezeichnet worden.

Dim g As Graphics = Me.CreateGraphics Den Schatten definiert man weiter mit Dim sColor As Color = Color.Gray ' die Schattenfarbe Dim opac As Short = 164 ' die Anfangstransparenz des Schattens

Dann kann man die unten gezeigte Funktion folgendermaßen anwenden:

' Schatten rundum zeichnen
RectangleDropShadow(g, shadowRect, sColor, sw, opac, PositionOfShadow.AllCorners)

Es ist möglich, durch Angabe von PositionOfShadow verschiedene Schattenformen zu definieren.

Hier die Definitionen und die Funktion:

''' <summary>
''' Rechteck mit Schatten versehen
''' </summary>
''' <param name="tg">das Graphics-Element</param>
''' <param name="rc">das betreffende Rechteck</param>
''' <param name="shadowColor">die Schattenfarbe</param>
''' <param name="si">die Breite des Schattens</param>
''' <param name="maxOpacity">die höchste Transparenz</param>
''' <param name="art">die Art des Schattens</param>
Public Sub RectangleDropShadow(tg As Graphics, rc As Rectangle,
  shadowColor As Color, si As Short,
  maxOpacity As Short,
  Optional art As PositionOfShadow = PositionOfShadow.AllCorners)
 
  Dim i As Short
 
  ' calculate the opacities
  Dim darkShadow As Color = Color.FromArgb(maxOpacity, shadowColor)
  Dim lightShadow As Color = Color.FromArgb(0, shadowColor)
 
  ' Create a brush that will create a softshadow circle
  Dim gp As GraphicsPath = New GraphicsPath()
  gp.AddEllipse(0, 0, 2 * si, 2 * si)
 
  Dim pgb As PathGradientBrush = New PathGradientBrush(gp)
  pgb.CenterColor = darkShadow
  pgb.SurroundColors = New Color() {lightShadow}
 
  ' generate a softshadow pattern that can be used to paint the shadow
  Dim bm As Bitmap = New Bitmap(2 * si, 2 * si)
  Dim g As Graphics = Graphics.FromImage(bm)
  g.FillEllipse(pgb, 0, 0, 2 * si, 2 * si)
  g.Dispose()
  pgb.Dispose()
 
  ' top side
  If art = PositionOfShadow.UpperRightCorner Or art = PositionOfShadow.UpperleftCorner _
    Or art = PositionOfShadow.AllCorners _
    Then tg.DrawImage(bm, New Rectangle(rc.Left + si, rc.Top, rc.Width - 2 * si, si),
                            si, 0, 1, si, GraphicsUnit.Pixel)
  ' right side
  If art = PositionOfShadow.UpperRightCorner Or art = PositionOfShadow.BottomRightCorner _
    Or art = PositionOfShadow.AllCorners Then _
    tg.DrawImage(bm, New Rectangle(rc.Right - si, rc.Top + si, si, rc.Height - 2 * si),
                             si, si, si, 1, GraphicsUnit.Pixel)
  ' left side
  If art = PositionOfShadow.UpperleftCorner Or art = PositionOfShadow.BottomLeftCorner _
    Or art = PositionOfShadow.AllCorners Then _
    tg.DrawImage(bm, New Rectangle(rc.Left, rc.Top + si, si, rc.Height - 2 * si),
                             0, si, si, 1, GraphicsUnit.Pixel)
  ' bottom side
  If art = PositionOfShadow.BottomRightCorner Or art = PositionOfShadow.BottomLeftCorner _
    Or art = PositionOfShadow.AllCorners Then _
    tg.DrawImage(bm, New Rectangle(rc.Left + si, rc.Bottom - si, rc.Width - 2 * si, si),
                             si, si, 1, si, GraphicsUnit.Pixel)
 
  ' top left corner
  If art = PositionOfShadow.UpperleftCorner Or art = PositionOfShadow.AllCorners Then _
    tg.DrawImage(bm, New Rectangle(rc.Left, rc.Top, si, si),
                             0, 0, si, si, GraphicsUnit.Pixel)
  ' top right corner
  If art = PositionOfShadow.UpperRightCorner Or art = PositionOfShadow.AllCorners Then _
            tg.DrawImage(bm, New Rectangle(rc.Right - si, rc.Top, si, si),
                             si, 0, si, si, GraphicsUnit.Pixel)
  ' bottom right corner
  If art = PositionOfShadow.BottomRightCorner Or art = PositionOfShadow.AllCorners Then _
    tg.DrawImage(bm, New Rectangle(rc.Right - si, rc.Bottom - si, si, si),
                             si, si, si, si, GraphicsUnit.Pixel)
  ' bottom left corner
  If art = PositionOfShadow.BottomLeftCorner Or art = PositionOfShadow.AllCorners Then _
    tg.DrawImage(bm, New Rectangle(rc.Left, rc.Bottom - si, si, si),
                             0, si, si, si, GraphicsUnit.Pixel)
  bm.Dispose()
End Sub



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2025 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.