große oder kleine Schriftart?



  • Hallo zusammen,
    kann mir jemand sagen, ob es eine Möglichkeit gibt, die aktuell eingestellte Schriftgröße zu erfahren, sprich ob kleine oder große Schriftart (im Eigenschaftenfenster des Desktops) eingestellt ist?
    Kann ich das vielleicht auch mit GetDeviceCaps() in Erfahrung bringen, wie die Bildschirmauflösung?
    Danke für eure Hilfe 🙂

    Gruß
    rg_Basser



  • Denke nicht, wofür benötigt man das denn ?



  • Nun, ich brauche es, weil ich bei meiner Anwendung drei mal die selbe Oberfläche für drei verschiedene Auflösungen erstellt habe (1280,1152 und 1024). Dies habe ich jeweils mit normaler Schriftgröße getan. Nun habe ich diese Anwendung auf einem anderen Rechner laufen lassen, bei dem große Schriftarten eingestellt sind und schon konnte ich meine bis ins kleinste Pixelchen ausgeklügelte Oberfläche vergessen 😡. Bisher frage ich beispielsweise in OnUpdate() eines der Fenster meiner Oberfläche über GetDeviceCaps() nach der Bildschirmauflösung, um entsprechend die darin befindlichen Steuerelemente zu positionieren.
    Jetzt dachte ich, vielleicht gibt es auch eine Möglichkeit, entsprechend Informationen über die eingestellte Schriftgröße zu erhalten, um dementsprechend die Fenster und Steuerelemente danach auszurichten (so das ich dann 6 anstatt 3 Oberflächen entwerfen muß 😞 )



  • Ahja, das Problem kenn ich 😉
    Allerdings reichen 6 Oberflächen dafür nicht, denn wenn jemand eine andere Schriftart als Default eingestellt hat, geht gar nix mehr !

    Ich habe dann die Oberfläche so umgeändert, daß die Elemente nicht bis aufs Pixel genau den Text umschlossen sondern etwas grösser waren.

    Wird nun eine grössere Schriftart eingestellt, vergrössert sich ja die Dialogbox automatisch, die Positionen der Elemente stimmen aber noch überein.



  • Du mußt mit GetDeviceCaps() die LOGPIXELS abfragen. Bei kleinen Schriften bekommst Du auf 'normalen' Monitoren 96 und bei großen Schriften 120 zurück. Hier ist noch ein interessanter Artikel zum Thema:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngdi/html/highdpiapp.asp?frame=true



  • Vielen Dank euch beiden!

    @King, dir gilt extra Dank, sowohl für den guten Tip mit Logpixels, als auch für den Bericht 😃 ! Das war genau das, was ich gesucht habe! 😉

    Gruß
    rg_Basser



  • Hmm, trotzdem verstehe ich noch nicht ganz, was dann bei Dialogen passiert!

    Also, ich habe ein Dialoglayout auf kleinen Schriftarten erstellt. Wenn ich nun diesen Dialog auf großen Schriftarten laufen lasse, wird er automatisch vergrössert.
    Wahrscheinlich genau nach der Formel im MSDN-Artikel. D.h. alle Elemente werden in Position und Größe mit SCALEX sowie SCALEY skaliert.
    Danach wird die Schriftart genommen und wie eh und je in die Dialogelemente geschrieben.

    Nur passiert jetzt folgendes:
    Die Schrift passt NICHT in die Elemente, und das trotz Vergrösserung!

    Muß man wirklich manuell alle Elemente des Dialogs noch zusätzlich vergrössern?



  • Der Font in DialogBoxen wird scaliert. Die Schriftgröße wird in Punkt und nicht in Pixeln angegeben. Das klappt aber nicht mit allen Fonts:

    There are two kinds of fonts: bitmapped fonts and TrueType fonts. High-DPI applications should use only TrueType fonts. Bitmapped fonts are written for 96-DPI screens, and don’t scale.



  • Und nun noch eine letzte Frage, die etwas trivialer ist (hoffe ich doch). Wie stelle ich nun, da ich die DPI Größe abgefragt habe, evtl. einen anderen Font für ein Formular oder Fenster (auch Menüs) ein?



  • @King
    Alles klaro, muss man also bei seinen Anwendungen immer TT-Fonts einsetzen

    @rg_Basser
    Font erstellen und mit SetFont setzen ...
    Ich glaube, dieser Font wird, wenn er beim Start gesetzt wird, automatisch von den Child-Windows übernommen



  • Hab ich jetzt alles versucht (Font erstellen und dann SetFont())! Aber erreiche keine Änderungen 😡 An welche Stelle muß das SetFont() deiner Meinung nach?
    Ich hab's schon in

    MainFrame->OnCreate()
    

    ,in

    ChildFrame->OnCreate()
    

    und in

    OnInitialUpdate()
    

    der Views probiert 🙄 Nichts geschieht 😡


Anmelden zum Antworten