Standardfont identifizieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag von RSBasic »

@Daffy0815
Wenn du die Einstellung "XP-Skin-Unterstützung" aktivierst, dann bedeutet das nicht, dass deine Anwendung mehr Leistung benötigt.
Wie der Name schon sagt, wird "XP-Skin-Unterstützung" einfach nur unterstützt, mehr nicht. Das heißt: Wenn jemand Windows im Klassik-Design benutzt, dann wird diese XP-Skin-Unterstützung einfach ignoriert, dann werden die Gadgets trotzdem im Klassik-Design angezeigt.
Wenn jemand aber Windows 7 im Aero-Design benutzt und er möchte deine Anwendung ausführen, dann ist es wichtig, dass diese Compiler-Einstellung aktiviert ist, sonst werden die Gadgets trotz Aero im Klassik-Design angezeigt.
Ich weiß zwar nicht, ob nur du diese Anwendung benutzt, aber wenn andere deine Anwendung auch nutzen können, dann ist es besser, wenn die "XP-Skin-Unterstützung"-Einstellung aktiviert ist, sonst sieht deine Anwendung beim Kunden-PC "hässlich" aus, weil es eben nicht im Aero- oder Luna-Design ist.
Es sieht dann also so aus, einmal mit und ohne XP-Skin-Unterstützung:
Bild
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Rebon
Beiträge: 263
Registriert: 20.05.2009 19:13

Re: Standardfont identifizieren

Beitrag von Rebon »

Daffy0815 hat geschrieben:Das ist korrekt!
Wenn es stimmt was ich gelesen habe bzw. richtig verstanden habe, dann verwendet PB in diesem Fall den Standardfont von Windows für den Text in den Fenster.

Wobei man eigentlich auch mit deaktivierten Windows-Themes die Schriftarten in den Anzeigeeinstellungen festlegen können sollte, aber dies sollte man eigentlich ohne Probleme selbst herausfinden können, wenn man die Schriftart/größe einfach abändert und vergleicht.
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 »

Also ich bin gerade dabei das ganze System zu verstehen.
Es gibt in der Systemsteuerung unter Anzeige die folgenden Einstellmöglichkeiten für Fonts:

Dialogfeld
Markierte Elemente
Menü
Palettentitel
Quickinfo
Symbol
Titelleiste des aktiven Fensters
Titelleiste des inaktiven Fensters

Dies muß letztlich nur in Verbindung mit den Namen / Gadgets in Purebasic gebracht werden und dann weis man auch wie Texte wo dargestellt werden.

Mit dem Code von "Rashad" kann nun ermittelt werden welche Fonts in welchen Größen eingestellt sind!

Code: Alles auswählen

;Autor: RASHAD
EnableExplicit

Define spinfo.NONCLIENTMETRICS
spinfo\cbSize = SizeOf(spinfo)
SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS,0,@spinfo,0)

Debug PeekS(@spinfo\lfCaptionFont\lfFaceName[0])
Debug PeekS(@spinfo\lfSMCaptionFont\lfFaceName[0])
Debug PeekS(@spinfo\lfMenuFont\lfFaceName[0])
Debug PeekS(@spinfo\lfMessageFont\lfFaceName[0])
Debug - PeekL(@spinfo\lfCaptionFont\lfHeight) - 3
Debug - PeekL(@spinfo\lfMenuFont\lfHeight) - 3
Debug - PeekL(@spinfo\lfMessageFont\lfHeight) - 3


Gruß

Daffy
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 »

http://msdn.microsoft.com/en-us/library ... 60%29.aspx
Da kannst du nachlesen, was die einzelnen Struktureigenschaften bedeuten.
Z.B. unter " Table 9.16: Font Object Properties Supplied by the NonClientMetrics Class" siehst du die 5 Schriftarteinstellungen.
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 »

So, ich hab mal was zusammengestellt:

Code: Alles auswählen

EnableExplicit

Declare GetSystemFontParamters()

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

GetSystemFontParamters()

Debug "WindowTitleFont_____________: " + WindowTitleFont.s           
Debug "WindowTitleFontHeight_______: " + Str(WindowTitleFontHeight.i)
Debug "IconFont____________________: " + IconFont.s                  
Debug "IconFontHeight______________: " + Str(IconFontHeight.i)
Debug "MenuFont____________________: " + MenuFont.s                  
Debug "MenuFontHeight______________: " + Str(MenuFontHeight.i)            
Debug "MessageFont_________________: " + MessageFont.s               
Debug "MessageFontHeight___________: " + Str(MessageFontHeight.i)         
Debug "SmallWindowTitleFont________: " + SmallWindowTitleFont.s      
Debug "SmallWindowTitleFontHeight__: " + Str(SmallWindowTitleFontHeight.i)

End


Procedure GetSystemFontParamters()
  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
Was da nur noch fehlt ist "IconFont", "IconFontHight" und "SmallWindowFontHeight"


Gruß

DAffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Re: Standardfont identifizieren

Beitrag von sibru »

damit geht´s auch:

Code: Alles auswählen

;+----------------------------------------------------------------------+
;|         PureBasic-QuellCode "SystemFont" mit allen ModulBody´s       |
;|erstellt durch Programm "PB_Mod2Body", Vers. 11225a am 23.07.13, 15:50|
;+----------------------------------------------------------------------+


;Modul      SystemFont Version 1.08 vom 25.02.2010
#PB_Vers  = "4.20"
;
;Funktion:  läd System-Font: 1=Titel 2=Switch/Symbol 3=Menü 4=WinText/Dialog 5=Palette 6=Quick&Status
;           Es werden die System-FontDaten bestimmt, die via "SystemSteuerung/An=
;           zeige/Darstellung/Eigenschaften/erweitert" auf´m Desktop eingestellt
;           werden.
;
;Aufruf:    FontID = SystemFont(SysFontNr.l)
;   wobei:  SysFontNr = der Index des gewünschten System-Font´s:
;                       1 = Titelleiste des aktiven / deaktiven Fensters
;                           (auch für Taskleiste und Fenster-Text)
;                       2 = Symbol (Desktop-Icon´s)
;                       3 = Fenster-Menü, markierte Elemente
;                       4 = Dialogfeld (MessageRequester)
;                       5 = Paletten-Titel
;                       6 = QuickInfo, auch StatusZeile
;           Sofern eine gültige SysFontNr (1..6) angegeben wurde, so wird
;           dieser Font geladen und dessen Handle als FunktionsWert geliefert.
;           Auch die folgenden Global´s sind belegt:
Global SystemFont_Name$  ;Schriftart-Name
Global SystemFont_Size   ;Schriftart-Größe
Global SystemFont_Style  ;Schriftart-Attribute
Global SystemFont_FontNr ;FontNr des geladenen Font´s
;
;
;Aufruf:    FontName$ = SystemFontName(SysFontNr.l) - liefert SystemFont-Bezeichnung
;   wobei:  SysFontNr = der Index des gewünschten System-Font´s, siehe oben

 ;==========  Begin Modul "Wort.PBI"  ==========
;Modul      Wort           Version 1.14 vom 05.03.2013 (PB_V3.73)
#PB_Vers  = "4.20"
;                 (Basis: THEOS-Modul SYSTEM.MODLIB.WORT V 3.03 vom 11.05.1997)
;
;Funktion: liefert erstes Wort in einem String und verkürzt Diesen entsprechend
;          entspricht prinzipell der PB-Funktion "StringField()", benötigt jedoch
;          keinen Wort-Index und erkennt Wort aufgrund diverser Trenn- / Klammerungs=
;          zeichen. Außerdem wird die Wort-Basis (Eingangs-String-Parameter) wie
;          eine Queue gehandhabt und nach FunktionsEnde ist das erkannte Wort am
;          Anfang dieses Strings entfernt...
;
;Aufruf: Wort$ = Wort(@String$) - liefert nächstes Wort von String$ (bis Leerzeichen bzw. geklammert)
;      wobei: String$ = Text-Variable !!!, in der ggf. mehrere Worte enthalten sind.
;             Ein Wort ist:
;             - alle Zeichen bis zum nächsten Blank(führende Blank´s werden ignoriert)  oder
;             - geklammert durch " (^34), ' (^39), ´(^180), " " (^160) oder ^255       oder
;             - bis zum nächsten Zeichen lt. Global ´Wort_Ende$´                       oder
;             - geklammter durch Zeichen lt. Global ´Wort_Klammer$´
;     Die Global´s Wort_Ende$ und Wort_Klammer$ sind nach Funktions-Rückkehr resetet
;     (=leer!!), müßen also -sofern erforderlich- _vor jedem Aufruf_ dieser Funktion
;     entsprechend gesetzt werden !!!!
;
;     Diese Funktion liefert das 1. Wort im String (führende Leerzeichen werden ignoriert)
;     und der String wird entsprechend verkürzt
;     Beispiel:
;     A$ = "hallo ´du da´ alles klar"
;     B$ = Wort(@A$) ;1. Aufruf
;      (--> B$ ist "hallo",    A$ ist nun "´du da´ alles klar")
;     B$ = Wort(@A$) ;2. Aufruf
;      (--> B$ ist "du da",    A$ ist nun "alles klar") (wg. ´´-Klammerung)
;     B$ = Wort(@A$) ;3. Aufruf
;      (--> B$ ist "alles",    A$ ist nun "klar")
;     B$ = Wort(@A$) ;4. Aufruf
;      (--> B$ ist "klar",     A$ ist nun leer)
;
Global Wort_Ende$       ;Zeichen(kette) für Wort-Ende, GROSS-/klein-Schrift egal
                        ;!!! ist nach Funktionsausführung resettet (=leer) !!!
Global Wort_Klammer$    ;Klammerungs-Zeichen: alle Zeichen, die als Wort-Anfangs- oder Ende-Kennung
                        ;beim folgenden Aufruf zulässig sein sollen
Global Wort_EndKz$      ;Rückgabe: gefundenes/benutztes Wort-Ende-Zeichen
                        ;bzw. Zeichenkette bei Einsatz von Wort_Ende$
#Wort_BlankReplace = Chr(28);siehe Modul "WortForm()"...
;#jaPBeExt exit
Procedure.s Wort(*Param)
  Protected Param$, Wort$
  If *Param>1
    Param$ = LTrim(PeekS(*Param))
    If Wort_Ende$ = ""
      If Wort_Klammer$ = ""
        Wort_Klammer$ = #DQUOTE$ + Chr(39) + Chr(180) + Chr(255) + Chr(160);", ', ´ oder ^255
      EndIf
      If FindString(Wort_Klammer$, Left(Param$, 1), 1)And Param$>""
        Wort_Ende$ = Left(Param$, 1)
        Param$ = Right(Param$, Len(Param$) - 1)
      Else
        Wort_Ende$ = " "
      EndIf
    EndIf
    Wort_Ende$ = UCase(Wort_Ende$)
    While UCase(Left(Param$, Len(Wort_Ende$)))<>Wort_Ende$ And Param$>""
      Wort$ + Left(Param$, 1)
      Param$ = Mid(Param$, 2)
    Wend
    Param$ = Mid(Param$, Len(Wort_Ende$))
    Wort$ = LTrim(ReplaceString(Wort$, #Wort_BlankReplace, Chr(32)))
    Wort_EndKz$ = Wort_Ende$
    Wort_Ende$ = "" : Wort_Klammer$ = ""
    PokeS(*Param, LTrim(Right(Param$, Len(Param$) - 1)))
  EndIf
  ProcedureReturn Wort$
EndProcedure
 ;==========  Ende Modul "Wort.PBI"  ==========
;#jaPBeExt exit
Procedure SystemFont(FontNr.l);- Läd einen System-Font (WinTitel, Menü, Message, Status...) und liefert dessen FontHandle
  Protected RegID.l, RegKey$, RegEntry.l, *LogFont.LOGFONT, FontID.l, pos.l,  Char.l, Win_DC.l
  Protected MemNr
  Select FontNr
    Case 1 : RegKey$ = "CaptionFont"    ;FensterTitel (aktiv und deaktiv)
    Case 2 : RegKey$ = "IconFont"       ;Symbol (Icon-Texte)
    Case 3 : RegKey$ = "MenuFont"       ;Menü, markierte Elemente
    Case 4 : RegKey$ = "MessageFont"    ;DialogFeld (MessageRequester...)
    Case 5 : RegKey$ = "SmCaptionFont"  ;Paletten-Titel
    Case 6 : RegKey$ = "StatusFont"     ;QuickInfo (auch StatusZeile)
  EndSelect
  SystemFont_Name$ = "" : SystemFont_Size = 0 : SystemFont_Style = 0  ;reset Global´s
  If RegKey$>""  ;FontID gültig
    RegOpenKeyEx_(#HKEY_CURRENT_USER, "Control Panel\Desktop\WindowMetrics", 0, #KEY_READ, @RegID)
    RegQueryValueEx_(RegID, RegKey$, 0, 0, 0, @RegEntry)
    *LogFont = AllocateMemory(200)
    MemNr =*LogFont
    RegQueryValueEx_(RegID, RegKey$, 0, 0, *LogFont, @RegEntry)
    pos = 28  ;start of lfFaceName
    Repeat
      Char = PeekB(*LogFont + pos)
      If Char : SystemFont_Name$ + Chr(Char): pos + 2 : EndIf
    Until Char = 0
    SystemFont_Size = PeekL(*LogFont): If SystemFont_Size<0 : SystemFont_Size * - 1 : EndIf
    Win_DC = GetDC_(GetDesktopWindow_())
    SystemFont_Size = Round(SystemFont_Size * 72 / GetDeviceCaps_(Win_DC, #LOGPIXELSY), 1)
    If PeekL(*LogFont + 16) = 700 : SystemFont_Style = #PB_Font_Bold : EndIf
    If PeekB(*LogFont + 20): SystemFont_Style + #PB_Font_Italic : EndIf
    If PeekB(*LogFont + 21): SystemFont_Style + #PB_Font_Underline : EndIf
    If PeekB(*LogFont + 22): SystemFont_Style + #PB_Font_StrikeOut : EndIf
    If PeekB(*LogFont + 26): SystemFont_Style + #PB_Font_HighQuality : EndIf
    SystemFont_FontNr = LoadFont(#PB_Any, SystemFont_Name$, SystemFont_Size, SystemFont_Style)
    FontID = FontID(SystemFont_FontNr)
    RegCloseKey_(RegID)
    FreeMemory(MemNr)
  EndIf
  ProcedureReturn FontID
EndProcedure
; jaPBe Version=3.8.6.707
; Build=0
; FirstLine=0
; CursorPosition=29
; ExecutableFormat=Windows
; DontSaveDeclare
; EOF
__________________________________________________
Code angepasst
23.07.2013
RSBasic
Bild Bild
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag von Daffy0815 »

@Sibru

Gibt leider einen Syntaxfehler bei " If * Param>1".

Wurde wohl mal wieder was geändert?!

Gruß

Daffy
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 »

Daffy0815 hat geschrieben:@Sibru

Gibt leider einen Syntaxfehler bei " If * Param>1".

Wurde wohl mal wieder was geändert?!

Gruß

Daffy
Da machst du das Leerzeichen hinterm Stern weg und dann klappt's auch. Das war auch noch nie anders. Das hättest du aber auch selbst herausfinden können.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Standardfont identifizieren

Beitrag von Daffy0815 »

Zum besseren Verständnis lege ich mal dar was das Ganze für einen Hintergrund hat:

Prinzipiell gehe ich erst mal davon aus, dass sich ein Anwender Schriftarten und Größen für das von Ihm benutzte System bereits in Windows seinen Bedürfnissen entsprechend eingestellt hat.
Also warum das Programm mit programminternen Einstellmöglichkeiten überfrachten.

Die Problematik liegt zum Einen in den unterschiedlichen Bildschirmauflösungen und zum Anderen in den durch die Mehrsprachigkeit unterschiedlichen Textlängen.

Nachdem nun die maximal zur Verfügung stehende "Fensterfläche" ermittelt wurde gilt es nun für "Unterfenster" die optimale / notwendige Größe zu berechnen.

Dies kann nur durch genaue Kenntnis des Platzbedarf der jeweiligen Texte festgestellt werden.

Da es optisch jedoch unschön aussehen würde wenn zum Beispiel ein Button in der Sprache 1 den Text "abc" und in der Sprache 2 den Text "xycvbnmjfr" enthielte, und dadurch unterschiedliche Buttonbreiten entstehen würden muß vorher die maximale notwendige Buttonbreite für alle Sprachen berechnet werden.
Das gleiche gilt natürlich auch für Menütexte.

Und erst wenn alle Inhalte in Höhe und Breite bekannt sind kann zu guter Letzt erst die Größe des umschließenden Fensters bestimmt werden.

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 »

@NickTheQuick

Wenn dem so ist, dann wundert es mich aber das das wohl irgendwann mal so gelaufen ist.

Und mal so am Rande: Warum kommen immer solche Sprüche wie "Das hättest Du aber auch selbst herausfinden können"? Was soll das?

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Antworten