Standardfont identifizieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag von Daffy0815 »

@RSBasic

Nein, das kein Problem der Mindestbreite.
Der "Freiraum" wird prinzipiell hinten angehängt.

Sonst würde das hier nämlich nicht funktionieren!

Code: Alles auswählen

EnableExplicit

Declare.i TextRealWidth(FontID, Text$)
Declare GetSystemFontParameters()

Define Event.i, Quit.i
Define Fensterbreite.i
Global WindowTitleFont.s
Global WindowTitleFontHeight.i 
Global IconFont.s
Global IconFontHeight.i
Global MenuFont.s
Global MenuFontHeight.i
Global MessageFont.s
Global MessageFontHeight.i
Global SmallWindowTitleFont.s
Global SmallWindowTitleFontHeight.i

Global FontIdWindowTitleFont.i

Enumeration 1
   #WindowMain
   #WindowEinstellungen
EndEnumeration

Enumeration 1
    #Deutsch            
    #Englisch           
    #Franzoesisch       
    #Spanisch           
    #Portugiesisch      
    #Slowakisch         
    #Polnisch           
    #Tschechisch
EndEnumeration
#AnzahlSprachen = #Tschechisch
Global Sprache.b = #Deutsch

Global Dim Text_Einstellungen$(#AnzahlSprachen)
Text_Einstellungen$(#Deutsch) = "Einstellungen"
Text_Einstellungen$(#Englisch) = "Settings"   
Text_Einstellungen$(#Franzoesisch) = "Réglages"        
Text_Einstellungen$(#Spanisch) =  "Preparar"        
Text_Einstellungen$(#Portugiesisch) = "Configuraçào"        
Text_Einstellungen$(#Slowakisch) = "Nastavenia"     
Text_Einstellungen$(#Polnisch) =  "Nastawienia"
Text_Einstellungen$(#Tschechisch) = "Nastavení"

GetSystemFontParameters()
Debug "WindowTitleFont_____________: " + WindowTitleFont.s           
Debug "WindowTitleFontHeight_______: " + Str(WindowTitleFontHeight.i)

FontIdWindowTitleFont.i = FontID(LoadFont(#PB_ANY, WindowTitleFont.s, WindowTitleFontHeight.i))

OpenWindow(#WindowEinstellungen, 100, 100, 0, 0, "", #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
Fensterbreite.i = WindowWidth(#WindowEinstellungen, #PB_Window_FrameCoordinate) + TextRealWidth(FontIdWindowTitleFont.i, Text_Einstellungen$(Sprache.b)) - TextRealWidth(FontIdWindowTitleFont.i, "8888")
SetWindowTitle(#WindowEinstellungen, Text_Einstellungen$(Sprache.b))
ResizeWindow(#WindowEinstellungen, #PB_Ignore, #PB_Ignore, Fensterbreite.i, #PB_Ignore)



Repeat
  Event.i = WaitWindowEvent()
 
  If Event.i = #PB_Event_CloseWindow
    Quit.i = 1
  EndIf
Until Quit.i = 1

End

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 GetSystemFontParameters()
  Define spinfo.NONCLIENTMETRICS

  spinfo\cbSize = SizeOf(spinfo)
  SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS,0,@spinfo,0)
  WindowTitleFont.s = PeekS(@spinfo\lfCaptionFont\lfFaceName[0])
  WindowTitleFontHeight.i = -PeekL(@spinfo\lfCaptionFont\lfHeight) - 3
  SmallWindowTitleFont.s = PeekS(@spinfo\lfSMCaptionFont\lfFaceName[0])
  
  MenuFont.s = PeekS(@spinfo\lfMenuFont\lfFaceName[0])
  MenuFontHeight.i = - PeekL(@spinfo\lfMenuFont\lfHeight) - 3
  MessageFont.s = PeekS(@spinfo\lfMessageFont\lfFaceName[0])
  MessageFontHeight.i = - PeekL(@spinfo\lfMessageFont\lfHeight) - 3
EndProcedure

Gruß

Daffy


PS. Ich glaube ich werde demnächst einen neuen Spruch anhängen:

So etwas in der Art wie "Wer mit viel Aufwand und hunderten von Programmzeilen die primitivsten Aufgaben erledigen will der verwendet eine grafische Oberfläche" :mrgreen:

Was waren das noch Zeiten als ich eine komplette Stücklisten/Lagerverwaltung/Kalkulation mit PowerBasic, Bibliotheken und einer SAA-Oberfläche geschrieben habe. Wenig Programmzeilen mit MÄCHTIGEN Funktionen!
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag von RSBasic »

Was ich aber bisher immernoch nicht verstanden habe ist, warum du unbedingt die Fensterbreite so anpassen möchtest, so dass der Titel noch gerade so reinpasst.
Bei Gadgets kann ich zwar bedingt verstehen, aber bei Fenster? Wofür brauchst du so kleine Fenster? Kannst du da nicht einfach 250px nehmen oder warum muss die Fensterbreite auf minimale Breite angepasst werden? Oder ist das nur ein Beispiel, damit du es auf Gadgets anwenden kannst?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag von Daffy0815 »

Genau so ist es!

Das ist ein Beispiel.
Ich werde immer das jeweile Maximum eines jeden Elements bilden und dann das optimale Bild in jeder in Windows eingestellten Größe ausgeben.

Außerdem, wer sagt Dir denn das nicht jemand für den Fenstertitel 28 Punkt einstellt und für den Rest 8 Punkt.

Dann wäre sebst bei einem kurzen Text der Titel das die Breite des Fensters bestimmende Element. Oder?

Gruß

Daffy

(der sich nun hinter die Büsche am Teich zurückzieht)
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 »

Also wenn mir mal ein Fenster zu schmal ist, sodass ich den Titel nicht lesen kann, dann zieh ich einfach größer. Bei Buttons und sonstigen Texten im Fenster stört es mich allerdings auch, wenn der Text nicht rein passt, nur weil ich alles auf Deutsch habe und nicht auf Englisch. Zum Glück skalieren die meisten Oberflächen alle GUI-Elemente automatisch mit, wenn man das Fenster vergrößert, sodass man im Endeffekt nach einmaligem Skalieren doch alles sieht.
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Standardfont identifizieren

Beitrag von Rebon »

matbal hat geschrieben: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...
Wenn man wirklich auch noch die eingestellte DPI des Nutzers berücksichtigen möchte, dann aber gleich richtig.(Code ist wieder von Rescator :D )
http://www.purebasic.fr/english/viewtop ... 62#p310920
Soll aber erst ab Windows Vista funktionieren.
PB 4.00 | Windows XP Home SP3
Antworten