Skalieren einer Linie

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Joshi.

    Skalieren einer Linie

    Hallo Forum!

    Ich bin recht neu in VB.NET unterwegs, nun versuche ich nur eine einfache Linie in eine TextBox zu zeichnen, was auch geht. Nur wenn die Linie Länger ist als die TextBox dann sollte das ganze auch Skaliert werden. Und da beginnt das Problem.
    Hier mal der Code den ich verwende!

    Vielleicht kann mir da jemand helfen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    3. Dim xStartU As Integer
    4. Dim xEndeU As Integer
    5. Dim yStartU As Integer
    6. Dim yEndeU As Integer
    7. Dim ULaenge As Integer
    8. Dim pen1 As New System.Drawing.Pen(Color.Black, 1)
    9. Dim Tischlaenge As Integer = PictureBox1.Size.Width
    10. Dim Tischbreite As Integer = PictureBox1.Size.Height
    11. Dim RandX As Integer = 50
    12. Dim RandY As Integer = 50
    13. ULaenge = TextBox1.Text
    14. xStartU = RandX
    15. xEndeU = ULaenge
    16. yStartU = Height - PictureBox1.Location.X - RandY
    17. yEndeU = Height - PictureBox1.Location.X - RandY
    18. e.Graphics.DrawLine(pen1, xStartU, yStartU, xEndeU, yEndeU)
    19. End Sub


    Verschoben. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    zunächstmal scheinst du Picturebox und Textbox zu verwechseln. Bei Textbox kannste nämlich sicherlich nicht eine Linie malen.
    Dann weiss ich nicht, was mit "

    TS_Miesbach schrieb:

    das ganze auch Skaliert werden
    gemeint sein mag.
    weder was du mit "das ganze" meinst, noch was "skalieren" für dich in diesem Zusammenhang bedeutet.
    Willkommen im Forum.
    Button1_Click(...) Handles PictureBox1.Paint? Komischer Name für solch eine Sub.
    ULaenge = TextBox1.Text? Da ULaenge vom Typ Integer ist, stellt sich die Frage, was diese Zeile bedeuten soll - außer dass Du mit Option Strict Off arbeitest. Da mit Code und Worten es nicht rüberkommt, was Du gern hättest, zeig es doch mal bitte mit Bildern. Wo ist die PicBox, was hat das mit der TextBox zu tun und - wie EdR schon fragte - was meinst Du mit skalieren. Auch: Wann wird skaliert? Designzeit? Laufzeit? Mit welchen Mitteln? Und auch: Was wird skaliert bzw was soll skaliert werden?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ok....
    war Blödsinn! Sehe ich nun selbst.

    Ich habe eine PictureBox Size 500;500. In diese PictureBox sollen einfach nur Linien die in der Länge Variabel sind. Solange die Linien in die Box passen, ist alles gut. Wenn aber die Linien > 500 sind, was durchaus der Fall sein kann schneidet die PictureBox den Rest ab.
    Nun suche ich nach einer Möglichkeit alle Linien in die Box zu Skalieren. Alle Linien, auch Linien die <500 sind sollen dann angepasst werden.
    Hoffe das sich mich nun verständlich ausgedrückt hab.

    Grüße aus Miesbach
    Toni
    Definiere

    TS_Miesbach schrieb:

    sollen dann angepasst werden.
    Am besten, Du malst mal ein Bild in Paint, wie es sein soll.
    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!
    Hier mal ein Bild so wie es werden soll!

    1drv.ms/u/s!AralAiQ8wqdJodYKhaOsDiInZta_Cg

    Die Linie in Y ist so Richtig. Die Linie in X ist zu lang.
    Deshalb müssen beide Linien Skaliert werden, so dass die Linie in X Innerhalb der grauen Box ist.
    Die Zeichnung beginnt immer links unten. Alle Maße sind in mm.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TS_Miesbach“ ()

    Was soll das überhaupt werden?
    Ich verstehe denn Sinn nicht. Wenn eine Linie kleiner 500 ist passt sie in die Picturebox, warum soll sie dann noch angepasst werden? Mit welchem Hintergrund? Angepasst zu was?
    Ich behaupte einfach mal das beide im Verhältnis zueinander gekürzt werden sollen.

    Dann gibst du an das alle Masse in mm sind, die Picturebox aber hat 500*500 Pixel, oder?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    TS_Miesbach schrieb:

    Deshalb müssen beide Linien Skaliert werden, so dass die Linie in X Innerhalb der grauen Box ist.
    Versteh ich immer noch nicht.
    Erklär mal verbal das ganze Problem (ohne Code!).
    Und:
    Nutze die Dateianhangs-Funktionalität des Forums:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    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!
    @TS_Miesbach Jetzt wird das schon etwas klarer.
    Male alles in einen GraphicsPath, mit welchen Einheiten auch immer, und skaliere den auf die Größe der PictureBox.
    docs.microsoft.com/de-de/dotne…h?view=netframework-4.7.2
    dotnetheaven.com/article/using-gdi-graphics-paths-in-vb.net
    Auch hier im Forum findest Du viele Beispiele dazu.
    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!
    @TS_Miesbach Das macht der GraphicsPath für Dich.
    Ist in C#, kannst Du entweder übernehmen und die VB-Änderungen von Hand machen oder Du nutzt einen Translator.
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. using System.Drawing.Drawing2D;
    4. using System.Windows.Forms;
    5. namespace MyGraphicsPath
    6. {
    7. public partial class Form1 : Form
    8. {
    9. private GraphicsPath gp;
    10. public Form1()
    11. {
    12. InitializeComponent();
    13. gp = new GraphicsPath();
    14. gp.AddLine(new Point(100, 100), new Point(200, 100));
    15. gp.AddLine(new Point(200, 100), new Point(200, 200));
    16. gp.AddLine(new Point(200, 200), new Point(100, 200));
    17. gp.AddLine(new Point(100, 200), new Point(100, 100));
    18. gp.AddLine(new Point(100, 100), new Point(200, 200));
    19. gp.AddLine(new Point(200, 100), new Point(100, 200));
    20. gp.CloseFigure();
    21. }
    22. private void Form1_Paint(object sender, PaintEventArgs e)
    23. {
    24. if (gp != null)
    25. {
    26. GraphicsPath gp2 = null;
    27. try
    28. {
    29. gp2 = (GraphicsPath)gp.Clone();
    30. using (Matrix matrix = new Matrix())
    31. {
    32. RectangleF rc = gp2.GetBounds();
    33. matrix.Scale(this.ClientRectangle.Width / rc.Width, this.ClientRectangle.Height / rc.Height);
    34. matrix.Translate(-rc.Left, -rc.Top);
    35. gp2.Transform(matrix);
    36. e.Graphics.DrawPath(Pens.Black, gp2);
    37. }
    38. }
    39. finally
    40. {
    41. if (gp2 != null)
    42. {
    43. gp2.Dispose();
    44. }
    45. }
    46. }
    47. }
    48. private void Form1_SizeChanged(object sender, EventArgs e)
    49. {
    50. this.Invalidate();
    51. }
    52. }
    53. }
    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!
    Hi.

    Wenn es als Technische Zeichnung dargestellt werden soll, könnte die Strichstärke evtl. mit einbezogen werden.

    VB.NET-Quellcode

    1. Public Sub DrawLinePoint(ByVal e As PaintEventArgs)
    2. ' Create pen.
    3. Dim blackPen As New Pen(Color.Black, 3)
    4. ' Create points that define line.
    5. Dim point1 As New Point(100, 100)
    6. Dim point2 As New Point(500, 100)
    7. ' Draw line to screen.
    8. e.Graphics.DrawLine(blackPen, point1, point2)
    9. End Sub


    Einige Pinsel könnten vorher definiert werden.

    VB.NET-Quellcode

    1. Dim Werkstoffkante As New Pen(Color.Black, 5)
    2. Dim Achsen As New Pen(Color.Black, 2)
    3. Dim Bemaßung As New Pen(Color.Black, 2)
    4. Dim Gewinde As New Pen(Color.Black, 1)


    Ich würde ein zweite Picturebox über die eigentliche Zeichenfläche legen,
    um das aktuelle Objekt (z.B. Bohrung mit Achsen und Kreis) darauf als Vorschau zu zeichnen.
    Im MouseMove-Event wird dann die Vorschau bewegt mit hilfe der Mousekoordinaten und e.Graphics.TranslateTransform(xx.xF, yy.yF, MatrixOrder.Append).
    Und nicht vergessen, das Neuzeichnen anzustossen.
    Zudem unverzichtbar: Wenn etwas auf der Vorschau-Zeichenfläche nicht mehr gebraucht wird mit ".dispose" den Grafikkontext löschen!

    Dazu beim MouseClick-Event den Inhalt der Vorschau in das Bild stempeln.

    VB.NET-Quellcode

    1. <System.Security.Permissions.SecurityPermission( _
    2. System.Security.Permissions.SecurityAction.LinkDemand, Flags := _
    3. System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
    4. Private Sub FromHdcHdc(ByVal e As PaintEventArgs)
    5. ' Get handle to device context. - Hole die Referenz
    6. Dim hdc As IntPtr = e.Graphics.GetHdc()
    7. ' Create new graphics object using handle to device context. - Neue Grafik erstellen mit hdc
    8. Dim newGraphics As Graphics = Graphics.FromHdc(hdc)
    9. ' Draw rectangle to screen. - Rechteck zeichnen
    10. newGraphics.DrawRectangle(New Pen(Color.Red, 3), 0, 0, 200, 100)
    11. 'Draw other things, like another GraphicsObject. - Zeichnen von anderen Dingen, zum Beispiel die Vorschau unter der Maus oder ein anderes GraphicObjekt
    12. '...
    13. ' Release handle to device context and dispose of the Graphics ' object - DAS sowas von wichtige lösen und löschen. (In der Reihenfolge bitte.)
    14. e.Graphics.ReleaseHdc(hdc)
    15. newGraphics.Dispose()
    16. End Sub


    docs.microsoft.com/en-us/dotne…hdc?view=netframework-2.0

    VB.NET-Quellcode

    1. Private Sub TranslateTransformAngleMatrixOrder(ByVal e As PaintEventArgs)
    2. ' Set world transform of graphics object to rotate. - Erst die Drehung (dd.dF)
    3. e.Graphics.RotateTransform(30.0F)
    4. ' Then to translate, appending to world transform. - danach die Bewegung (xx.xF, yy.yF)
    5. e.Graphics.TranslateTransform(100.0F, 0.0F, MatrixOrder.Append)
    6. ' Draw rotated, translated ellipse to screen. - zum Abschluß, mit den vorherigen Transformationen (30.0F Drehung, 100.0F, 0.0F Bewegung) ein Rechteck zeichnen.
    7. e.Graphics.DrawEllipse(New Pen(Color.Blue, 3), 0, 0, 200, 80)
    8. End Sub


    docs.microsoft.com/en-us/dotne…orm?view=netframework-2.0


    Viel erfolg... :D

    c.u. Joshi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Joshi“ ()

    TS_Miesbach schrieb:

    Hoffe ich bekomme das hin!
    Ich nehme mal an, Du weißt, welchen Weg Du zuerst testest.
    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!