Windows funktion: "Text und weitere Elemente vergrößern"

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von YEE.

    Windows funktion: "Text und weitere Elemente vergrößern"

    Hi,

    In Windows lassen sich Text und "weitere Elemente" vergrößern.
    ( 100%, 125%, 150% )

    Bei einigen Notebooks mit hoher Auflösung und kleinem Display ist "125%" voreingestellt. Das zerschießt die Formatierung meines Programmes, da Schriften zu groß dargestellt werden, weshalb sie sich überlappen.

    Ich denke hier wird es 2 Möglichkeiten geben, das Problem zu lösen:
    a) zur Laufzeit Auflösung und Vergrößerungsgrad erkennen und anhand dessen die Form zeichnen.
    b) Vergrößerung per Eigenschaftswert verbieten.

    Aufgrung der schnelleren Umsetzung interessiert micht erstmal Methode B.

    Vielen Dank im vorraus!
    eine Möglichkei ist auch, das du
    a) Mißt wie groß ein Text ist .. Stichwort : TextRenderer.MeasureText oder auch in Graphics.MeasureString

    ab da an hast du 2 Möglichkeiten:
    - du passt dein Buttons etc. dann er Größe an. (Du bekommst ja höhe und Breite heraus)
    - oder du machst eine Schleife, und den Font immer kleiner bis er die gewünschte Größe hat und nimmst dann überall diese Größe.

    kommt halt drauf an, wie umfangreich dein Layout ist
    nicht ideal.. aber ein Ansatzpunkt :)

    Auch solltest du vermeiden mit Pixeln für das Layout zu arbeiten, also falls du per Programm die Höhe für ein Label, Button u.ä. bestimmst, oder in Listen die Nächste Position der Zeile. dann nicht einfach Y += 20 oder so nehmen, sondern z.B. Y += font.height+5
    @ErfinderDesRades
    Habe mir die beiden Videos mal angeschaut. Haben mir aber dahingehend nicht weiter geholfen.

    @RoulettePilot
    TextRenderer.MeasureText und Graphics.MeasureString und dann in lauter Schleifen das ganze Programm hoch und runter zu fahren. Das scheint mir ein Umweg über 20 Ecken. Für ein doch eigentlich so klitze kleines Problemchen.

    Habe es dann mit Y += font.height+5 umgesetzt. Das hat Fehlerfrei funktioniert und scheint mir Programmier technisch ein sauberer Stil zu sein.
    Ich frage mich allerdings, ob der Designer in diesem Fall dann nicht doppelte Arbeit ist?
    Wenn ich mir erst alle Buttons und Labels im Designer schön positionier wie ich sie haben will und ich das beim starten des Programmes dann doch über das Form Load Handle über den haufen schmeiße, kann ich mir das benutzen des Designers doch sparen?
    Oder kann ich an den Code kommen, den der Designer erstellt und diesen editieren?

    Bitte um Verbesserung meiner Vorgehensweise :)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „YEE“ ()

    Man kann den DesignerCode ansehen und auch bearbeiten über den Projektmappenexplorer (erweiterte Ansicht), aber man ändert da nichts!!!
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    Man kann den DesignerCode ansehen und auch bearbeiten über den Projektmappenexplorer (erweiterte Ansicht), aber man ändert da nichts!!!


    Ich habe gerade mal Testweise bei folgender Zeile die Zahlenwerte geändert:

    VB.NET-Quellcode

    1. Me.Label_Model.Location = New System.Drawing.Point(117, 11)

    Wurde Problemlos angenommen.

    Ersetze ich die Zeile jedoch durch folgende:

    VB.NET-Quellcode

    1. Me.Label_Model.Location = New Point(LabelModel.Location.X + 156, LabelModel.Location.Y)

    meckert der Designer, wie von dir Prophezeit, rum.

    Wie löse ich also das Problem, ohne das Design doppelt gemoppelt zu erstellen (erst im Designer, dann im Form load handle)?

    ErfinderDesRades schrieb:

    und mich mal probieren lassen ist ganz ausgeschlossen?

    Weil doppelt gemoppelt ist tatsächlich idiotisch, aber auf den Designer verzichten hieße, auf das "visual" vom VisualStudio verzichten.


    Im Prinzip auf der Linken Seite 4 Labels untereinander. Diese haben nen festen Text. Rechts daneben nochmal 4 Labels. Diese hingegen zeigen Variablen Inhalt an (Systeminformationen: SN, Model, Bios, usw). Rechts daneben kommt,eine ListBox und ein Button. Am Form Bottom kommt noch ein Label.

    Jetzt kommt das Problem: Auf verschiedenen Notebooks mit hoher Auflösung und kleinem Display ist die Vergrößerungsfunktion von Windows aktiviert (125%).
    Da ich natürlich alle Labels auf eine fixe Position gesetzt habe (und das mit möglichst wenig Luft zwischen den Elementen) haben sich diese überlappt.
    Natürlich könnte ich einfach die zwischen Räume vergrößern. Das würde aber wiederrum bedeuten, das die Form auf normaler Vergrößerungs Stufe (100%) furchtbar aufgebläht aussehen würde.


    VB.NET-Quellcode

    1. LabelModel.Location = New Point(1, 1)
    2. Label_Model.Location = New Point(LabelModel.Location.X + 156, LabelModel.Location.Y)
    3. LabelSn.Location = New Point(LabelModel.Location.X, LabelModel.Location.Y + Font.Height + 13)
    4. Label_SN.Location = New Point(Label_Model.Location.X, LabelModel.Location.Y + Font.Height + 13)
    5. LabelBiosAktuel.Location = New Point(LabelModel.Location.X, LabelSn.Location.Y + Font.Height + 13)
    6. Label_Bios_Aktuel.Location = New Point(Label_Model.Location.X, LabelSn.Location.Y + Font.Height + 13)
    7. LabelBiosVerfügbar.Location = New Point(LabelModel.Location.X, LabelBiosAktuel.Location.Y + Font.Height + 13)
    8. Label_Bios_Verfügbar.Location = New Point(Label_Model.Location.X, LabelBiosAktuel.Location.Y + Font.Height + 13)
    9. Ergebnis.Location = New Point(LabelModel.Location.X, LabelBiosVerfügbar.Location.Y + Font.Height + 13)
    10. ListBox1.Location = New Point(Label_Model.Location.X + Label_SN.Width + 70, LabelModel.Location.Y + 5)
    11. button_update.Location = New Point(ListBox1.Location.X, button_update.Location.Y)


    (wie zu erkennen ist, Orientieren sich die Locations der X Werte immer an den obersten Labels.



    LabelModel-------------Label_Model---------------------ListView1
    LabelSN-----------------Label_SN------------------------- ListView1
    LabelBiosAktuel-------Label_Bios_Aktuel-------------- ListView1
    LabelBiosVerfügbar---Label_Bios_Verfügbar-----------Button
    Ergebnis

    YEE schrieb:


    @RoulettePilot
    TextRenderer.MeasureText und Graphics.MeasureString und dann in lauter Schleifen das ganze Programm hoch und runter zu fahren. Das scheint mir ein Umweg über 20 Ecken. Für ein doch eigentlich so klitze kleines Problemchen.

    Habe es dann mit Y += font.height+5 umgesetzt. Das hat Fehlerfrei funktioniert und scheint mir Programmier technisch ein sauberer Stil zu sein.
    Ich frage mich allerdings, ob der Designer in diesem Fall dann nicht doppelte Arbeit ist?

    Warum in "Lauter Schleifen"?
    Ich würde es genau 1x mal machen ,da ja erfahrungsgemäß Systemweit/Programmweit der gleiche Font verwendet wird. Und da auch meist die Button-Label-Größe gleich sind musst du es doch nicht jedesmal machen.
    Und, das du die Position neu berechnen musst, ok.. ist etwas Arbeit, aber was anderes macht dein Programm, wenn du z.B. Dock "TOP","LEFT" bzw. "Anchor" usw. machst aber auch nicht.

    Ich bin da weniger zimperlich :)
    Wenn ich das Problem habe, und es so funktioniert, ist doch gut. Es gibt an dem Programm sicher mehr zu tun, als sich Tagelang an der Position einiger Controls festzubeißen.

    Manchmal muss man halt vor der Technik kapitulieren :)

    Vielleicht ist man durch den Designer schon so sehr verwöhnt, das man vergisst, das es nur EIN "Hilfsmittel" ist.
    Erstellst du dynamische Conrols, stehst du dauernd vor dem Problem, es "per Code" anzuordnen/anzupassen.

    Vor ähnlichen Problemen stehst du auch, wenn du Programme für Phone und Tablett machst. Beide haben Unterschiedlich Größen, in Unterschiedlicher Ausrichtung (Hoch/Quer).
    Auch da musst du "Hand" anlegen, entscheiden was wo hingepackt werden muss, und was ggf. wegfallen kann. (Auch wenn es da ein paar Hilfmittel gibt)
    Gute Programme bedeuten nun mal Arbeit, und da ist es nicht immer mit "Klicken" i Designer getan :)

    YEE schrieb:

    LabelModel-------------Label_Model---------------------ListView1
    LabelSN-----------------Label_SN------------------------- ListView1
    LabelBiosAktuel-------Label_Bios_Aktuel-------------- ListView1
    LabelBiosVerfügbar---Label_Bios_Verfügbar-----------Button
    Ergebnis

    sieht mir aus, als ob man eine TableLayoutPanel nehmen könnte, mit Zeilen auf AutoSize, und die Labels und Buttons auch AutoSize=True setzen.
    Es geht darum das die DesignerDatei von VS generiert wird. Wenn du jetzt ne Zahl durch ne andere ersetzt macht dad nichts, ist halt das gleiche wie im Eigenschaftenfenster im Designer.

    BTT: Schon mal mit AutoSize und Dock / Anchor probiert?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @YEE Die Textgröße könntest Du an die Länge der Diagonale Deines Controls koppeln.
    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!