Standardfont identifizieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Standardfont identifizieren

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Standardfont identifizieren

Beitrag 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...
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag 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!!)
Zuletzt geändert von Daffy0815 am 23.07.2013 11:54, insgesamt 2-mal geändert.
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Standardfont identifizieren

Beitrag 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.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Standardfont identifizieren

Beitrag 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.
PB 4.00 | Windows XP Home SP3
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Antworten