2 Form aneinander verbinden

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von tommy.

    RodFromGermany schrieb:

    Am Besten, Du steuerst die transparente Form von einer nicht transparenten Form aus.
    Man könnte ein Image mit transparentem Background dem Form als BackgroundImage geben, dann wäre es immer noch transparent, oder?
    Wenn man dann auf die gesetzten Pixel klickst, kommt das durchaus an. Also ein Form in Form eines Messschiebers ist durchaus möglich.

    Ah - deine Vorlage ist dafür ja prima geeignet - guggemol:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private _offsetSchieb As Integer
    3. Private _offsetForm As Size
    4. Private Sub pbSchieb_MouseDown(sender As Object, e As MouseEventArgs) Handles pbSchieb.MouseDown
    5. If e.Button = Windows.Forms.MouseButtons.Left Then _offsetSchieb = e.X
    6. End Sub
    7. Private Sub pbSchieb_MouseMove(sender As Object, e As MouseEventArgs) Handles pbSchieb.MouseMove
    8. If e.Button <> Windows.Forms.MouseButtons.Left Then Return
    9. pbSchieb.Left = e.X + pbSchieb.Left - _offsetSchieb
    10. End Sub
    11. Private Sub pbForm_MouseDown(sender As Object, e As MouseEventArgs) Handles pbForm.MouseDown
    12. If e.Button = Windows.Forms.MouseButtons.Left Then _offsetForm = New Size(pbForm.PointToScreen(e.Location)) - New Size(Me.Location)
    13. End Sub
    14. Private Sub pbForm_MouseMove(sender As Object, e As MouseEventArgs) Handles pbForm.MouseMove
    15. If e.Button = Windows.Forms.MouseButtons.Left Then Me.Location = pbForm.PointToScreen(e.Location) - _offsetForm
    16. End Sub
    17. End Class
    (den Form_Load-Kram habich im Designer eingestellt)
    Also das ist kein Messschieberförmiges Form, sondern nur ein Form, wo man eine der Messschieber-Pictureboxen schieben kann.
    Jo, und das Form selbst kann ich ja über die annere Messschieber-Picturebox plazieren wo wolle.
    Is hübsch :)
    Dateien

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades Das ist jetzt aber sehr merkwürden, dass sich der "Durchklick-Effekt" von gestern nicht reproduzieren lässt.
    Jedenfalls hat @tommy nun eine gute Basis für seinen Messssssssschieber. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mogen Leute!
    @ErfinderDesRades
    Ich kenne die Unterschiede von Point und Size, das war gelegentlich ein Programmier-Schlamperei.
    Size = Größe und Breite von diesem Objekt
    Point = Koordinaten von Objekten sprich links/rechts und oben/unten.
    Ich hoffe du verzeihst mir ;(
    Ich wollte nur schnell antworten, und habe nicht aufgepasst, was für ein Code ins Forum stelle.
    In Sachen Wpf, Xaml, Databinding oder ControlTemplates habe ich garnichts am Hut im gegen teil das ist mir füllig fremd.
    Ich habe mir das Programmieren selbst bei gebracht, und habe wie du mir
    schon öfter gesagt hast, keine Ahnung von der ganzen Technik.
    Ich war auch nie in einer Programmierschule und ich kann es mir auch nicht leiste Geld und Zeit mäßig.
    Und die Fachausdrücke verstehe ich natürlich auch nicht.

    Unterm Strich ich bin nur ein kleiner Hobbyprogrammierer der über Internet und Forums sich was selbst beigebracht hat.

    Ich bin trotzdem an allen, sehr Dankbar, dass ich mir trotzdem versucht mir zu helfen.

    Nun zum Thema Zeichnen
    wie soll ich die Messschieber mit so eine Grafik nachzeichnen, um diese Überlappung zu ermöglichen.
    Also ich glaube, ich lass das Projekt lieber. habe wohl wieder eine Niederlage einzustecken.
    Aber trotzdem Danke.

    tommy schrieb:

    Ich hoffe du verzeihst mir
    Ich bin dir garnet böse.
    Ich will Visual Studio - Empfohlene Einstellungen nur so dringend machen wie's ist.
    Weil meist die Leuts sagen bestenfalls 'Jaja', und im übernächsten Post sieht man wieder son Lapsus - der anzeigt, dasses nicht ernst genommen haben.
    Und der konkrete Fall ist auch schnuppe, bzw ist sogar gut, dasser aufgetreten ist.
    Das Problem sind die 100 Fälle, die nicht gesehen werden.
    Und Problem wirds, wenn du dich zB ein Jahr lang dran gewöhnt hast. Dann haste tausend Fälle, und erst recht keine Lust, zu korrigieren, hast auch nicht gelernt, drauf zu achten, und zB im ObjectBrowser nachzugucken, was ein Datentyp alles kann, und warum dieser richtig ist, und jener nicht, und deine Proggis laufen nicht so stabil wie sie sollten.
    Ma HandaufsHerz - haste Visual Studio - Empfohlene Einstellungen inzwischen umgesetzt?
    Siehste.

    Zum Aufgeben: Dafür gibts kein Grund, im Anhang ist eine hübsche Lösung - hier der Code:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private _offsetSchieb As Integer
    3. Private _offsetForm As Size
    4. Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Using gp = New System.Drawing.Drawing2D.GraphicsPath
    6. Dim x0 = 0, x1 = 14, x2 = 27, x3 = pbForm.Width ' relevante X-Werte der Grafik
    7. Dim y0 = 2, y1 = 31, y2 = 61, y3 = 66, y4 = pbForm.Height - 3 ' relevante Y-Werte der Grafik
    8. Dim arr = New Integer(,) {{x0, y1}, {x1, y0}, {x1, y1}, {x3, y1}, {x3, y3}, {x2, y3}, {x1, y4}, {x1, y2}, {x0, y2}} ' pointPositions
    9. Dim points = (From y In Enumerable.Range(0, arr.GetUpperBound(0) + 1) Select New Point(arr(y, 0), arr(y, 1))).ToArray
    10. gp.AddPolygon(points)
    11. Dim r = New Region(gp)
    12. pbForm.Region = r
    13. End Using
    14. End Sub
    15. Private Sub pbSchieb_MouseDown(sender As Object, e As MouseEventArgs) Handles pbSchieb.MouseDown
    16. If e.Button = Windows.Forms.MouseButtons.Left Then _offsetSchieb = e.X
    17. End Sub
    18. Private Sub pbSchieb_MouseMove(sender As Object, e As MouseEventArgs) Handles pbSchieb.MouseMove
    19. If e.Button <> Windows.Forms.MouseButtons.Left Then Return
    20. pbSchieb.Left = e.X + pbSchieb.Left - _offsetSchieb
    21. End Sub
    22. Private Sub pbForm_MouseDown(sender As Object, e As MouseEventArgs) Handles pbForm.MouseDown
    23. If e.Button = Windows.Forms.MouseButtons.Left Then _offsetForm = New Size(pbForm.PointToScreen(e.Location)) - New Size(Me.Location)
    24. End Sub
    25. Private Sub pbForm_MouseMove(sender As Object, e As MouseEventArgs) Handles pbForm.MouseMove
    26. If e.Button = Windows.Forms.MouseButtons.Left Then Me.Location = pbForm.PointToScreen(e.Location) - _offsetForm
    27. End Sub
    28. End Class
    Das da im Form_Load bildet eine Region, welche bpForm quasi genau in die unregelmässige Form (ein Polygon) eines Messschiebers zurechtschneidet.
    War nötig, weil beim zusammenschieben des Meschibas gabs Ansichts-Probleme - siehste sofort, wennde den Form_Load auskommentierst.
    Dateien
    Ich werde sehr wohl dein Rad befolgen.
    Danke für dein Verständnis!
    Ich habe dein Projekt mal angesehen mache sehr große Augen.
    Also sowas habe ich auch noch nie gesehen
    ich studiere mal dein Code, um zu verstehen, was da abgeht, um zu verstehen,
    sollte ich bezüglich fragen zu diesen Code haben, darf ich dich danach fragen?
    So soll es auch sein oder ;)
    Also so wie ich es verstanden habe, wird ein umriss erzeugt.
    Aber wie soll ich das verstehen
    Ich habe 2 möglichen Gedanken, ob ich richtig Liege weiß ich nicht.

    1 Es wird, durch die äußere umriss nochmal transparent gemacht.
    Oder
    2 der innere umriss ist "die makierung" damit die Transparent richtig erkannt wird.
    jo, es geht um dieses Geschwurbel:

    VB.NET-Quellcode

    1. Using gp = New System.Drawing.Drawing2D.GraphicsPath
    2. Dim x0 = 0, x1 = 14, x2 = 27, x3 = pbForm.Width ' relevante X-Werte der Grafik
    3. Dim y0 = 2, y1 = 31, y2 = 61, y3 = 66, y4 = pbForm.Height - 3 ' relevante Y-Werte der Grafik
    4. Dim arr = New Integer(,) {{x0, y1}, {x1, y0}, {x1, y1}, {x3, y1}, {x3, y3}, {x2, y3}, {x1, y4}, {x1, y2}, {x0, y2}} ' pointPositions
    5. Dim points = (From y In Enumerable.Range(0, arr.GetUpperBound(0) + 1) Select New Point(arr(y, 0), arr(y, 1))).ToArray
    6. gp.AddPolygon(points)
    7. Dim r = New Region(gp)
    8. pbForm.Region = r
    9. End Using

    Ziel davon ist, der pbForm eine Region zuzuweisen. Region ist ein ziemlich abgedrehter Datentyp, der eine beliebig geformte Fläche definiert (kannste sogar Löcher reinmachen).
    Nur erstellen kann man eine Region nicht so direkt.
    Dazu brauche ich eine andere, fast ebenso abgedrehte Klasse, GraphicsPath, in die man Figuren definieren kann - etwa ein Polygon.
    (Ich hoffe, "Polygon" ist dir bekannt: eine beliebig geformte geschlossene Figur aus aneinander-gefügten graden Strecken)
    Für ein Polygon benötigt man natürlich ein Array von Punkten (die als Strecken quasi "abgelaufen" werden).
    Polygon ist günstig, weil dein Messchieber auffm Image freundlicherweise nur von graden Strecken umrandet ist.
    Jo, habich die Image-resource im VS geöffnet, und die Eck-Pixel nachgeguckt und auseinandergefummelt in geeignete x/y - Variablen.

    Aus den Variablen bastel ich ein 2-dimensionales Integer-Array (es sind ja Integer-Vars), wo x- und y- Werte schoma sinnvoll und in richtiger Reihenfolge die Pixel angeben.
    Aber GraphicsPath will ein PointArray als Polygon-Data - ein 2-d-Integer-Array nimmter nicht.
    Also habich noch eine Konvertierung geschrieben, wo die points dann richtig rauskommen (Zeile #5).
    Man hätte die Points auch gleich als PointArray definieren können - das wäre aber weniger kompakter Code geworden, und etwas unübersichtlicher - so:

    VB.NET-Quellcode

    1. Dim points = {New Point(x0, y1), New Point(x1, y0), New Point(x1, y1), New Point(x3, y1), New Point(x3, y3), New Point(x2, y3),
    2. New Point(x1, y4), New Point(x1, y2), New Point(x0, y2)}
    Jo, wäre besser gewesen - soo unkompakt ists auch wieder nicht - also bitte vereinfachen:

    VB.NET-Quellcode

    1. Using gp = New System.Drawing.Drawing2D.GraphicsPath
    2. Dim x0 = 0, x1 = 14, x2 = 27, x3 = pbForm.Width ' relevante X-Werte der Grafik
    3. Dim y0 = 2, y1 = 31, y2 = 61, y3 = 66, y4 = pbForm.Height - 3 ' relevante Y-Werte der Grafik
    4. Dim points = {New Point(x0, y1), New Point(x1, y0), New Point(x1, y1), New Point(x3, y1), New Point(x3, y3),
    5. New Point(x2, y3), New Point(x1, y4), New Point(x1, y2), New Point(x0, y2)}
    6. gp.AddPolygon(points)
    7. Dim r = New Region(gp)
    8. pbForm.Region = r
    9. End Using

    Wirkungsweise der Region ist, dass das Control wirklich diese Form annimmt - es ist dann nicht mehr rechteckig mit transparenten Anteilen, sondern es hat die Form der Region.
    Dadurch passiert nicht mehr die Unschönheit, wenn die 2. transparente PicBox sich darunter schiebt (ich hoffe, das mit Auskommentieren haste mal probiert).

    Für dich wichtig ist v.a. dass der GraphicsPath gp in einem Using-Block erstellt ist.
    GraphicsPath ist eine der vielen Klassen, die vom GarbageCollector nicht zuverlässig aufgeräumt werden können, und daher sich selbst aufräumen müssen.
    Der Using-Block ist dabei die vorzuziehende Variante, etwas zu disposen, was nicht mehr gebraucht wird.
    (google: .Net Dispose-Pattern und Using-Block).
    Oder besser lies gutes Buch, etwa Löffelman vb.net, die 2005er Ausgabe. Die ist in den Grundlagen am gründlichsten, und die Grundlagen veralten auch nicht.
    Hier Link-Sammlung, Löffi ist auch dabei: Entwickler-Ressourcen und Tools, Bücher und WebCasts
    Was du nicht lesen darfst ist das leider berühmte Online-Book von Theiss - der programmiert Strict Off und macht auch sonst lauter Käse.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Also habe ich das fast richtig erkannt
    Danke für deine Aufklärung den Zeile 5
    aus dem hätte ich mir kein Reim daraus machen können.
    Aber da du dir, die Zeit für mich genommen hast, um es mir ausführlicher zu erklären, konnte ich etwas verstehen
    und noch was, das habe ich auch noch die gesehen

    VB.NET-Quellcode

    1. Dim points = ....

    Darf man so Deklarieren? Ich meine weiß der kompilierter um was es hier geht ?(
    Ich hätte das immer so geschrieben

    VB.NET-Quellcode

    1. Dim points() As Point = {....}

    den da gibts keine Missverständnisse für den kompilierter
    denn ich habe mir vor sehr langer Zeit den artikel gelesen
    und habe natürlich was daraus gelernt.
    @tommy Die beiden Teile des Messssssschiebeers im Projekt haben einen transparenten Außenbereich, der ist mit der Farbe Colors.Transparent befüllt. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @tommy Das war ein Hinweis ob der Funktionalität ab Post #20.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    tommy schrieb:

    Ich hätte das immer so geschrieben

    VB.NET-Quellcode

    1. Dim points() As Point = {New Point(x0, y1), ...}

    den da gibts keine Missverständnisse für den kompilierter
    denn ich habe mir vor sehr langer Zeit den artikel gelesen
    und habe natürlich was daraus gelernt.


    Auch so:

    VB.NET-Quellcode

    1. Dim points = {New Point(x0, y1), ...}
    gibts keine Missverständnisse. Der Compiler ist inzwischen so intelligent, dass er sieht, welchen Datentyp das hat, was zugewiesen wird.
    Vorteil davon
    • ist kürzer
    • ist leichter änderbar.
      Etwa wenn ich auf PointF umstellen wollte, brauche ich nur die rechte Seite der Zuweisung ändern, die linke ergibt sich daraus.
    guggemol Grundlagen: Fachbegriffe
    Da ist auch ein Abschnitt über die vielen Möglichkeiten, ein Array zu deklarieren und initialisieren.