Seite 2 von 6
Re: Standardfont identifizieren
Verfasst: 23.07.2013 01:31
von STARGÅTE
Wenn du die Schriftart und Größe kennst, weißt du aber immer noch nicht, wie viel Platz dein Text verbraucht.
Also hier gleich der Code, der die Breite zurück gibt.
Code: Alles auswählen
Procedure DefaultTextWidth(String.s)
Protected Image = CreateImage(#PB_Any,1,1)
Protected Width.i
If StartDrawing(ImageOutput(Image))
DrawingFont(GetGadgetFont(#PB_Default))
Width = TextWidth(String)
StopDrawing()
EndIf
FreeImage(Image)
ProcedureReturn Width
EndProcedure
Debug DefaultTextWidth("Hallo Welt!")
Zu den Compileroption:
Ich finde es eigentlich ganz Praktisch diese Sachen in den Compileroption einzubinden.
In einem Projekt definiere ich mir so 3-4 Exe-Versionen, mit ganz eigenen EInstellungen und Parametern.
Außerdem kannst du da auch Konstanten definieren, ohne im Quellcode mit "nervigen" CompilerIfs arbeiten zu müssen.
Re: Standardfont identifizieren
Verfasst: 23.07.2013 07:59
von matbal
Ich hatte mir mal das zusammengebastelt.
Code: Alles auswählen
Procedure SetDialogFont(hWnd.l = #Null)
Protected ncm.NONCLIENTMETRICS
Protected hDC.l
Protected i.i
Protected name.s, points.l, styles.l, charset.l
ncm\cbSize = SizeOf(ncm)
SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(ncm), @ncm, #Null)
name = PeekS(@ncm\lfMessageFont\lfFaceName[0])
charset = ncm\lfMessageFont\lfCharSet
hDC = GetDC_(hWnd)
points = -MulDiv_(ncm\lfMessageFont\lfHeight, 72, GetDeviceCaps_(hDC, #LOGPIXELSY))
If ncm\lfMessageFont\lfWeight=700 : styles = #PB_Font_Bold : EndIf
If ncm\lfMessageFont\lfItalic > 0 : styles = styles + #PB_Font_Italic : EndIf
ReleaseDC_(hWnd.l, hDC)
SetGadgetFont(#PB_Default, FontID(LoadFont(#PB_Any, name, points, styles)))
EndProcedure
Die Prozedur
setzt den für Dialoge eingestellten Font schon. Man braucht SetGadgetFont() nur am Anfang des Programms (vor dem Erstellen der Fenster) setzen, und alle Gadgets benutzen ihn automatisch.
Re: Standardfont identifizieren
Verfasst: 23.07.2013 10:14
von RSBasic
Oder:
http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
Bei mir wird die richtige Schriftart zurückgegeben. Vielleicht ist dieser Code besser für dich.
\\Edit:
Wie ich sehe, ist es dieselbe WinAPI-Funktion/-Message, die im Code von matbal ebenfalls verwendet wird.
Re: Standardfont identifizieren
Verfasst: 23.07.2013 11:02
von matbal
@RSBasic
In deinem Code stimmt die Berechnung für die Schriftgröße nicht. Da kommt nur bei einer Bildschirmeinstellung mit 96 dpi und einer Schriftgröße zwischen 8 und 10 Punkten die richtige Zahl heraus...
Re: Standardfont identifizieren
Verfasst: 23.07.2013 11:15
von Daffy0815
@Stargate
Danke, aus einem früheren Projekt habe ich da auch noch etwas (ist aber nicht auf meinem Mist gewachsen).
Code: Alles auswählen
PROCEDURE.i TextRealWidth(FontID, Text$)
PROTECTED dc = GetDC_(0)
PROTECTED sz.Size
SelectObject_(dc, FontID)
GetTextExtentPoint32_(dc, Text$, Len(Text$), sz)
ReleaseDC_(0, dc)
PROCEDURERETURN sz\cx
ENDPROCEDURE
;
;
;
PROCEDURE.i TextRealHeight(FontID, Text$)
PROTECTED dc = GetDC_(0)
PROTECTED sz.Size
SelectObject_(dc, FontID)
GetTextExtentPoint32_(dc, Text$, Len(Text$), sz)
ReleaseDC_(0, dc)
PROCEDURERETURN sz\cy + 3
ENDPROCEDURE
Gruß
Daffy
Re: Standardfont identifizieren
Verfasst: 23.07.2013 11:35
von Daffy0815
@RSBasic / matbal
Also bei dieser Funktion kommt bei mir tatsächlich "Tahoma" mit 8 Punkt raus.
Nur eins kapiere ich immer noch nicht:
Die "Kinder" haben viele "lustige" Namen wie "CaptionFont", "SMCaptionFont" "MenuFont" und "MessageFont".
Welcher von denen ist denn nun der Font mit dem die ganz normalen Textausgaben in einem PureBasic-Fenster ausgegeben werden?
Ist es der "MessageFont"?
Und wie heist das "Kind" denn in denn unter "Eigenschaften von Anzeige -> Darstellung -> Erweitert"?
Gruß
Daffy
PS.
Ich habe da mal ein wenig "gegoogelt" und bin auf folgendes gestoßen:
http://www.vb-fun.de/vb/api/strukturen/ ... ETRICS.htm
Wenn ich das richtig interpretiere gibt die Funktion doch garnicht den Font der in einem Fenster als Textfont verwendet wird zurück (noch verwirrter!!)
Re: Standardfont identifizieren
Verfasst: 23.07.2013 11:45
von NicTheQuick
Was sind denn für dich ganz normale Textausgaben? Das, was du mit einem TextGadget anzeigst? Oder die Schrift auf dem ButtonGadget oder in einem StringGadget oder EditorGadget?
Eine "ganz normale Textausgabe in einem Purebasic-Fenster" ist etwas unspezifisch.
Re: Standardfont identifizieren
Verfasst: 23.07.2013 11:53
von Daffy0815
@NickTheQuick
z. B.
MenuItem(#MenuItemOptionenEinstellungen, Text_Einstellungen$(Sprache.b))
Ist aber eigentlich egal.
Alles was ich an Texten innerhalb eines Fensters zu sehen bekomme hat immer die gleiche Schriftart und Schriftgröße.
Irgendwo muß die doch definiert sein.
Ich definiere sie doch nicht (Ich weis das ich das kann!).
Gruß
Daffy
Re: Standardfont identifizieren
Verfasst: 23.07.2013 12:35
von Rebon
Daffy0815 hat geschrieben:Alles was ich an Texten innerhalb eines Fensters zu sehen bekomme hat immer die gleiche Schriftart und Schriftgröße.
Dann hast du vielleicht entweder nicht die XP-Skin-Unterstützung in den Compileroptionen eingeschaltet oder du hast in deinen Anzeigeeinstellungen von Windows für alle Texte in den Fenstern immer die gleiche Schriftart/Schriftgröße.
Re: Standardfont identifizieren
Verfasst: 23.07.2013 12:40
von Daffy0815
@Rebon
Das ist korrekt!
Warum sollte ich die auch einschalten wenn ich, wie bereits erwähnt, den ganzen leistungsfressenden Kram abgeschaltet habe.
Gruß
Daffy