Windows Standardschrift

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Windows Standardschrift

Beitrag von matbal »

Hallo,

ich bin neuer PureBasic-Nutzer.

Mir ist aufgefallen, daß PureBasic in meinen Dialogen nicht die in Windows eingestellte Schrift für Dialogboxen verwendet. Ich habe im alten Klassik-Theme extra überall die die "Segoe UI" (9 Punkte) eingestellt, weil sie etwas breiter und dadurch besser lesbar ist.
(Die Dialoge der Entwicklungsumgebung verwenden übrigens auch die falsche Schrift)

Meine Suche hier im Forum war nicht erfolgreich, was aber auch an der Wahl meiner Suchbegriffen gelegen haben könnte.

Ich habe mir jetzt folgende Procedure gebastelt (eigentlich umgeschrieben). Wenn man mit der PB-Syntax noch nicht so vertraut ist, ist das gar nicht so einfach. Aber die Entwicklungsumgebung ist insbesondere mit der Autovervollständigung sehr hilfreich...

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
Diese Procedure rufe ich jetzt vor OpenWindow() auf.

Unter XP funktioniert es bei mir. Würde mich freuen, wenn die PB-Profis mal drüberschauen und mitteilen, ob das so OK ist.
Oder gibt es eine einfachere, elegantere Methode, vielleicht sogar eine PB-interne Funktion.

Gruß
Zuletzt geändert von matbal am 01.04.2011 18:52, insgesamt 1-mal geändert.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Windows Standardschrift

Beitrag von Bisonte »

Also mir war es so, dass man gar nichts derartiges machen muss, wenn man beim Kompiliervorgang die Option
XP-Skinunterstützung eingeschaltet hat...

Vielleicht testet Du das mal aus ob es reicht ...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Windows Standardschrift

Beitrag von matbal »

Die XP-Skinunterstützung ist eingeschaltet.

Ich habe mir jetzt noch eine Funktion geschrieben, die mir über einen Gadget-Font ein paar Werte verrät (Name, Größe, Style). Die PureBasic-Vorgabe ist "MS Shell Dlg" mit 8 Punkten. Das ist nur so etwas wie ein Platzhalter. In WinXP wird er mit "Microsoft Sans Serif" ersetzt.

Ich nehme an, daß dir die verschiedenen Schriften nur noch nicht aufgefallen sind, weil "MS Sans Serif" und "Tahoma" sehr ähnlich sind. Tahoma ist aber, trotz fast gleicher Größe, um einiges besser lesbar.

Ich verwende "Segoe UI" in 9 Punkten (Win7-Standard). Der ist deutlich anders, geringfügig größer und noch besser lesbar.

Hier ist ein kleines Testprogramm, bei dem man einen Text zwischen den verschiedenen Schriftarten umschalten kann. test3.zip


Gruß
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Re: Windows Standardschrift

Beitrag von sibru »

Hab´ hier mal was Passendes:

Code: Alles auswählen

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

;Modul      SystemFont Version 1.08 vom 25.02.2009
#PB_Vers  = "4.20"
;
;Funktion:  läd System-Font: 1=Fenster 2=Symbol 3=Menü 4=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 (=FunktionsWert)
;#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(100)
    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



;Demo
SystemFont(1) ;load SystemFont "Fenster" 
Debug SystemFont_Name$
Debug SystemFont_Size
Debug SystemFont_Style

Bild Bild
Antworten