Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  VBasic / vb.net / vbs / wsh
  Zeichnen über allen Controls der Form

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Zeichnen über allen Controls der Form (593 mal gelesen)
KMassler
Ehrenmitglied V.I.P. h.c.
CAD Admin + Mädchen für Alles...



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2657
Registriert: 06.11.2000

erstellt am: 02. Feb. 2021 12:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


VB-Hinweispfeilproblem.mp4

 
Hallo Experten,

ich hätte da mal wieder eine Denksportaufgabe:

Ich habe eine Form mit diversen Controls (Panels, Textboxen, alles mögliche...).

Nun möchte ich in bestimmten Fällen, z.B. wenn eine Textbox nicht ausgefüllt ist, einen dicken Hinweispfeil einblenden, der auf diese Textbox zeigt.

Nach einigem Hin und her habe ich es geschafft, dass es grundsätzlich funktioniert.

Einfach auf die Form zeichnen klappt nicht, sonst wird der Pfeil immer von den Controls überlagert.

Also wird

  • eine neues Bitmap-Objekt erzeugt,
  • da drin gezeichnet,
  • Eine PictureBox erzeugt mit dem Bitmap als Image
  • PictureBox an der richtigen Stelle positioniert
  • PictureBox zur Form hinzugefügt
  • und mit BringToFront ganz nach oben geschoben, damit es die anderen Controls überdeckt. 

So weit, so gut. Nur hätte ich noch gerne einen tranparenten Hintergrund rund um die gezeichnete Figur (hier: Pfeil), damit es eben richtig aussieht, siehe Anhang.

Mein Code soweit:

Code:

'...
Public Class Mainform
    '...
    Dim pbArrow As PictureBox = Nothing
    '...

  Private Sub Mainform_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '...     
        DrawArrow2()
    End Sub

Sub DrawArrow2()
        If pbArrow IsNot Nothing Then Exit Sub 'Ist PFeil schon da? Dann nicht nochmal ausführen

        Const Awidth = 250 'Pfeil-Gesamtlänge
        Const Aheight = 76 'Pfeil-Höhe und Länge der Pfeilspitze
        Dim Bmp = New Bitmap(Awidth, Aheight)

        Dim Point0 As New Point(10, Aheight \ 2 - 8) 'Pos. für Text

        'Eckpunkte für Pfeil
        Dim Point1 As New Point(Awidth, Aheight \ 2)
        Dim Point2 As New Point(Point1.X - Aheight, Point1.Y + Aheight \ 2 - 5)
        Dim Point3 As New Point(Point2.X, Point1.Y + Aheight \ 4)
        Dim Point4 As New Point(0, Point3.Y)
        Dim Point5 As New Point(0, Point1.Y - Aheight \ 4)
        Dim Point6 As New Point(Point2.X, Point5.Y)
        Dim Point7 As New Point(Point2.X, 5)
        Dim curvePoints As PointF() = {Point1, Point2, Point3, Point4, Point5, Point6, Point7}

        'PictureBox für PFeil
        pbArrow = New PictureBox With {
            .Size = New Size(Awidth, Aheight)
        }
        pbArrow.Location = New Point(Panel1.Location.X + TB1.Location.X - Awidth, Panel1.Location.Y + TB1.Location.Y + TB1.Height \ 2 - pbArrow.Height \ 2)

        Dim rect As New Rectangle(pbArrow.Location.X, pbArrow.Location.Y, pbArrow.Location.X + Awidth, pbArrow.Location.Y + Aheight)

        Me.DrawToBitmap(Bmp, rect)
       
        Dim g As Graphics = Graphics.FromImage(Bmp)

        'pens
        Dim penBlue As New Pen(Color.Blue)
        Dim penwhite As New Pen(Color.White)
        penBlue.Width = 5
        penwhite.Width = 7

        'font
        Dim drawFont As New Font("Arial", 11)
        Dim drawFormat As New StringFormat

        'brushes
        Dim brushRed As New SolidBrush(Color.Red)
        Dim brushBlue As New SolidBrush(Color.Blue)
        Dim brushYellow As New SolidBrush(Color.Yellow)


        g.Clear(Color.Transparent)

        g.FillPolygon(brushRed, curvePoints)
        g.DrawPolygon(penwhite, curvePoints)
        g.DrawPolygon(penBlue, curvePoints)

        g.DrawString("Bitte Text eingeben:", drawFont, brushYellow, Point0, drawFormat)


        pbArrow.BackColor = Nothing
        pbArrow.Image = Bmp
        Me.Controls.Add(pbArrow)
        pbArrow.BringToFront()
        'pbArrow.Dispose() --> passiert in TextChanged, wenn Text nicht leer ist
    End Sub

  Private Sub TB1_TextChanged(sender As Object, e As EventArgs) Handles TB1.TextChanged, TextBox1.TextChanged
        If TB1.Text = "" Then
            DrawArrow2()
        Else
            If pbArrow IsNot Nothing Then pbArrow.Dispose()
            pbArrow = Nothing
        End If

    End Sub


Hat mir jemand eine Idee, wie ich das machen kann?

Vielen Dank im Voraus!

------------------
Klaus

http://www.alko-tech.com | mein Gästebuch

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Lueghi
Mitglied



Sehen Sie sich das Profil von Lueghi an!   Senden Sie eine Private Message an Lueghi  Schreiben Sie einen Gästebucheintrag für Lueghi

Beiträge: 382
Registriert: 01.07.2005

CAD...: SWX2020 SP4, ACAD 2019, Tacton / LINO
PDM...: PRO.FILE 8.6
ERP...: proAlpha 6.2e
BS....: Win10, HP ZBook G5

erstellt am: 02. Feb. 2021 17:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich

Wenn das Bitmap den Hintergrund transparent hat dann sollte es doch so sein wie Du willst, oder?

------------------
Gruß Stefan

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KMassler
Ehrenmitglied V.I.P. h.c.
CAD Admin + Mädchen für Alles...



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2657
Registriert: 06.11.2000

erstellt am: 03. Feb. 2021 08:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Stefan,

ich lade hier kein Bitmap ein, sondern zeichne direkt.
Aber ich habe es jetzt auch mit einer png-Datei mit transparentem Hintergrund getestet, das Problem bleibt.
pbArrow.Image = Image.FromFile(Filename)

Die Einstellung BackColor = Color.Transparent macht den Hintergrund nicht wirklich transparent, er bekommt nur die Hintergrundfarbe des Elternelements, hier also der Form. Das ist genau der Effekt, den man hier sieht.

------------------
Klaus

http://www.alko-tech.com | mein Gästebuch

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

HenryV
Mitglied
Konstrukteur, Engineering


Sehen Sie sich das Profil von HenryV an!   Senden Sie eine Private Message an HenryV  Schreiben Sie einen Gästebucheintrag für HenryV

Beiträge: 778
Registriert: 18.05.2005

SolidWorks 2020 x64 SP3.0
Dell Precision 5820
Intel Xeon W-2125 4x4GHz
NVIDIA Quadro P2000 5GB
32GB RAM
2x Dell U2412M, 24" TFT
Windows 10 Enterprise x64 21H1
Microsoft Office 365 ProPlus
Microsoft Visual Studio Enterprise 2022

erstellt am: 03. Feb. 2021 10:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich


TransparentPicturebox.txt

 
Hallo Klaus

Für diesen Fall habe ich einmal eine Picturebox mit transparentem Hintergrund gefunden.
Siehe Anhang.

Gruss Andreas

------------------
21 ist nur die halbe Antwort.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KMassler
Ehrenmitglied V.I.P. h.c.
CAD Admin + Mädchen für Alles...



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2657
Registriert: 06.11.2000

erstellt am: 03. Feb. 2021 12:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Test.Hinweispfeil2.mp4

 
Hallo Andreas,

vielen Dank, das ist schon mal 10Us wert 

Aber es funktioniert noch nicht perfekt:
Der Hintergrund der PictureBox ist zwar jetzt echt transparent- aber das PictureBox.BringToFront() funktioniert nicht mehr: Die PictureBox liegt hinter allen anderen Controls - mit Ausnahme der Panels. Was seltsam ist, da diese Panels ja die Eltern der Controls sind.

Seltsam, seltsam.

Du hast in dem Code
Me.SetStyle(ControlStyles.Opaque, True)
verwendet. Laut Hilfe gibt es das SetStyle für alle Controls, bei meinen Versuchen mit der PictureBox gibt es das aber offenbar nicht.
Wenn ich das in deinem Code deaktivere, macht das auch keinen erkennbaren Unterschied, die TransparenPictureBox bleibt transparent.

------------------
Klaus

http://www.alko-tech.com | mein Gästebuch

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz