VS: Formgrößenveränderung und WinForms-Designer-Forms-Darstellung passen nicht zum Resultat [gelöst]

  • Allgemein

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    VS: Formgrößenveränderung und WinForms-Designer-Forms-Darstellung passen nicht zum Resultat [gelöst]

    Hallo zusammen.

    Nachdem ich mich ein wenig mit der codeseitigen Größenänderung meines Forms herumgeschlagen habe, ist mir aufgefallen:

    VB.NET-Quellcode

    1. Me.Width = 500
    ergibt bei ner Screenshotausmessung eine Breite von 484 Pixel. Keine Skalierung, Windows-Wert = 100 %.
    Darüber hinaus (und wohl damit zusammenhängend):
    im Designer sieht mein Form so aus:

    unter Win10 zur Laufzeit aber so:

    Kann man VS auf "echtes" WYSIWYG einstellen?
    Und auch: Wie bekomm ich sauber (!) ein Windows-10-Laufzeitfenster der Breit 500 mit o.g. Code ohne quasi-willkürliche Aufschläge? Ein + 16 oder so kommt mir nicht in die Tüte!
    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, mein Hauptanliegen konnte ich erstmal lösen.

    VB.NET-Quellcode

    1. Dim UpperLeftCornerOfForm = Me.PointToScreen(New Drawing.Point(0, 0))
    2. Dim TitleBarHeight = UpperLeftCornerOfForm.Y - Me.Top
    3. Dim FormBorderWidth = UpperLeftCornerOfForm.X - Me.Left
    4. Me.Width = 500 + If(FormBorderWidth > 0, (FormBorderWidth - 1) * 2, 0)

    Zwar nicht gerade elegant und auch mit ominöser - 1, aber erstmal komm ich auf meine 500er-Ausmessbreite.
    Höhe klappt aber immer noch nicht. Die Titelleiste ist im Win10-Stil 31 Pixel hoch. Stelle ich Me.Height auf 500, ergibt die Ausmessung per Screenshot aber 493. Und zwar inkl. Titelleiste.
    Und das mit dem Designer ist immer noch unklar.

    ##########

    Im Wesentlichen habe ich es. Habe alle FormBorderStyles jetzt durch und eigentlich immer 500x500 rausbekommen. Abweichungen (1-2 Pixel) ergeben sich wohl aufgrund meiner Messmethode (Paint.NET, Zauberstab-Markier-und-Ausschneidemethode)

    VB.NET-Quellcode

    1. Dim UpperLeftCornerOfForm = Me.PointToScreen(New Drawing.Point(0, 0))
    2. Dim TitleBarHeight = UpperLeftCornerOfForm.Y - Me.Top
    3. Dim FormBorderWidth = UpperLeftCornerOfForm.X - Me.Left
    4. Me.Width = 500 + If(FormBorderWidth > 0, (FormBorderWidth - 1) * 2, 0)
    5. Me.Height = 500 + If(FormBorderWidth > 0, (FormBorderWidth - 1) * 2 + TitleBarHeight - (Me.Height - Me.ClientSize.Height - 1), 0)

    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.

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

    Versuch das mal.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Me.Height = 500
    3. Me.Width = 500
    4. Dim screenRectangle As Rectangle = Me.RectangleToScreen(Me.ClientRectangle)
    5. Dim titleHeight As Integer = screenRectangle.Top - Me.Top
    6. Me.Height -= titleHeight
    7. End Sub
    @VaporiZed Da spielen zwei Dinge mit rein:
    • Das Standard-Form-Layout vom Betriebssystem (Layout(Win7) <> Layout(Win10))
    • FormBorderStyle.
    Die Um-Größe der "Ur"-Form hat die angegebene Größe, andere sind ggf. kleiner.
    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!
    Dass das im Designer ein old-style-Window ist, denk ich mir. Wär nur schön, wenn man was im Win10-Style bekommt, damit man am Ende auch ohne Tricks rausbekommt, was man sich im Designer zusammenbastelt. Klar, das Programm kann nicht riechen, auf welchem System es am Ende läuft. Aber wenn ich 500 eingeben, will ich auch 500 haben.

    @Naifu: ergibt 486x462
    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.
    Das ganze Form mit allem drum und dran soll aber 500x500 ergeben, wenn ich 500x500 haben will.

    ##########

    Ich merke nach einem Spaziergang in der prallen Hitze, dass mein ganzes Vorhaben auf das Falsche abzielt. Letztenendes geht es doch um was anderes, was sehr leicht erzielt werden kann:

    VB.NET-Quellcode

    1. Me.ClientSize = New Drawing.Size(500, 500)

    Denn nur das Innere des Forms sollte ja relevant sein. Das muss ja systemunabhängig gleich sein oder konkret festgelegt werden können. Der Rahmen muss folgen. Es bringt mir ja nix, wenn ich ein Form mit den Maßen 500x500 habe, wenn der imaginäre Sonderrahmen schon 200 px breit ist und somit für den Inhalt nur 100 px Breite übrig bleibt. Der Inhalt muss ja größentechnisch konstant sein. Wie dick der Rahmen ist, muss ja eigentlich egal sein. Daher wird es wohl darauf hinauslaufen, dass ich mich zukünftig nicht auf Me.Size, sondern auf Me.ClientSize konzentriere.
    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.

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

    Ich hatte ein, wohl damit zusammenhängendes Problem, mit der Positionierung von Forms.
    Habs mit der Brechtange gelöst:

    VB.NET-Quellcode

    1. Private _Location As Point
    2. Public Shadows Property Location() As Point
    3. Get
    4. Return New Point(MyBase.Location.X + BorderWidth,
    5. MyBase.Location.Y)
    6. End Get
    7. Set(value As Point)
    8. _Location = value
    9. MyBase.Location = New Point(_Location.X - BorderWidth,
    10. _Location.Y)
    11. End Set
    12. End Property
    13. Private ReadOnly Property BorderWidth As Integer
    14. Get
    15. Return (MyBase.Size.Width - ClientSize.Width) \ 2
    16. End Get
    17. End Property


    Gestern habe ich Blutgrätsche draus gemacht: :D

    VB.NET-Quellcode

    1. Partial Class Form1
    2. Private _Location As Point
    3. Public Shadows Property Location() As Point
    4. Get
    5. Return New Point(MyBase.Location.X + BorderWidth,
    6. MyBase.Location.Y)
    7. End Get
    8. Set(value As Point)
    9. _Location = value
    10. MyBase.Location = New Point(_Location.X - BorderWidth,
    11. _Location.Y)
    12. End Set
    13. End Property
    14. Public _Size As Size
    15. Public Shadows Property Size() As Size
    16. Get
    17. Return New Size(MyBase.Size.Width - (BorderWidth * 2),
    18. MyBase.Size.Height - BorderWidth - 1)
    19. End Get
    20. Set(value As Size)
    21. _Size = value
    22. MyBase.Size = New Size(value.Width + (BorderWidth * 2),
    23. value.Height + BorderWidth + 1)
    24. End Set
    25. End Property
    26. Public Shadows Property Width() As Integer
    27. Get
    28. Return Size.Width
    29. End Get
    30. Set(value As Integer)
    31. MyBase.Size = New Size(value + (BorderWidth * 2),
    32. Size.Height)
    33. End Set
    34. End Property
    35. Public Shadows Property Height() As Integer
    36. Get
    37. Return Size.Height
    38. End Get
    39. Set(value As Integer)
    40. Size = New Size(Size.Width,
    41. value)
    42. End Set
    43. End Property
    44. Private ReadOnly Property BorderWidth As Integer
    45. Get
    46. Return (MyBase.Size.Width - ClientSize.Width) \ 2
    47. End Get
    48. End Property
    49. End Class


    Zur Laufzeit passt es jetzt, und über den Designer ändert sich nichts. (Glaube\Hoffe ich :whistling: )