Schriftgröße in Gadgets

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Schriftgröße in Gadgets

Beitrag von computerkranker »

Die Größenangabe von 0 bei Gadgets in Linux/GTK, erzeugt ein Gadget angepasst an die Schriftgröße. Besonderst wenn die DPI der Schrift im Gnome gändert wird, passt sich das Gadget an.
An sich ja auch das richtige Verhalten meiner Meinung nach. Benutzt der Desktop eine Schriftgröße mit z.B. 120 DPI so benutzt mein Programm dies auch.

Leider bringt das unter Windows nicht den gleichen Effekt.
1. Bei mir ändert sich die Standard Schriftgröße der Gadgets nicht wenn ich die DPI der Schrift in den Anzeigeeigenschaften ändere(getestet in Windows XP).
2. Eine automatische Größe wie unter Linux/GTK schein (zumindest mit 0)auch nicht zu gehen.

Beispiel:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 222, 200, "ButtonGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ButtonGadget(0, 10, 10, 0, 0, "Standard Button")
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Da ich schon gerne die DPI der Schrift des Benutzers/Desktops für meine Anwendungen benutzen möchte wäre meine Frage ob jemand eine Möglichkeit kennt das verhalten unter Linux/GTK auch in Windows zu ermöglichen.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@computerkranker
Was ist hiermit?

Code: Alles auswählen

LoadFont(1,"",30,0)

If OpenWindow(0, 0, 0, 322, 200, "ButtonGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ;CreateGadgetList(WindowID(0))
   ButtonGadget(0, 10, 10, 300, 50, "Standard Button")
   SetGadgetFont(0,FontID(1))
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag von computerkranker »

Was ist hiermit?
Ich wollte gern die System eingestellte Standardschriftgröße benutzen und die damit verbundene Größe(Höhe/Breite) von Gadgets(z.B. des Button's).

Um das Problem besser zu sehen:
Stelle doch einfach mal die Standardschriftgröße (Systemsteuerung/Anzeigeeigenschaften/Einstellungen/Erweitert) von Windows um(z.B. von 96DPI auf 120DPI). Starte neu und siehe da alles hat die neue große Schriftgröße, nur der Purebasic-Editor nicht und natürlich auch die in Purebasic erzeugten Programme haben noch die gleiche Schrift(96 DPI).

Die Frage ist ja nun, wie kommt man an die Standardschriftgröße des Systems und wie berechnet man dann die Buttongröße?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@computerkranker
Wie du die DPI ermitteln kannst: http://www.api-library.i3h.de/html/dpi_ermitteln.html

Jetzt brauchst du nur zu berechnen und mit SetGadgetFont() die Schriftgröße ändern.

Obs dafür eine API gibt, kA, kann sein, weis ich aber nicht.

120 DPI ist 25 % größer als die Standard-Größe von 96 DPI.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

das müßte es sein:

Code: Alles auswählen

;+-------------------------------------------------------------------------+
;|        PureBasic-QuellCode "GetSystemFontI" mit allen ModulBody´s       |
;| erstellt durch Programm "PB_Mod2Body", Vers. 8A08a am 02.11.2008, 17:54 |
;+-------------------------------------------------------------------------+


;Modul      GetSystemFont Version 1.07 vom 19.02.2008
;
;Funktion:  läd System-Font: 1=Titel 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 = GetSystemFont(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
;
;
;Aufruf:    FontName$ = SystemFontName(SysFontNr.l) - liefert SystemFont-Bezeichnung
;   wobei:  SysFontNr = der Index des gewünschten System-Font´s, siehe oben

;==========  Begin Modul "C:\ALSTERSOFT\PB4.20\MODULE\REGISTRY.PBI"  ==========
CompilerIf Defined(Debug_Registry, #PB_Constant)=0
  #Debug_Registry = 0
CompilerEndIf
;#PB_Lit2Msg start
Global RegLasterror.l
Global RegLastMessage.s
CompilerIf Defined(FormatMessage, #PB_Procedure) = #False
  Procedure.s FormatMessage(ErrorNumber.l)
    Protected *Buffer, len, result.s
    len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@*Buffer,0,0)
    If len
      result = PeekS(*Buffer, len - 2)
      LocalFree_(*Buffer)
      MessageRequester("Registry-Fehler", result)
      ProcedureReturn result
    Else
      ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
    EndIf
  EndProcedure
CompilerEndIf
Procedure Reg_SetValue(topKey, sKeyName.s, sValueName.s, vValue.s, lType = #REG_SZ, ComputerName.s = "")
  Protected HKEY.l, lhRemoteRegistry.l
  Protected r1.l, result.l
  Protected lpData.s{256}
  Protected lpcbData.l, lValue.l
  Protected KeyInfo
  RegLasterror = 0
  If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf
  If Right(sKeyName,1) = "\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf
  If ComputerName = ""
    r1 = RegCreateKeyEx_(topKey, sKeyName.s, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @HKEY, @KeyInfo)
  Else
    r1 = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry)
    If r1 <> #ERROR_SUCCESS
      RegLasterror = r1
      RegLastMessage = FormatMessage(RegLasterror)
      ProcedureReturn #False
    EndIf
    r1 = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @HKEY)
  EndIf
  If #Debug_Registry : Debug "RegSave: open="+Str(r1)+" (ok="+Str(#ERROR_SUCCESS)+")" : EndIf
  If r1 = #ERROR_SUCCESS
    lpcbData = 255
    If #Debug_Registry : Debug "RegSave: write <"+vValue+">" : EndIf
    Select lType
      Case #REG_SZ
        r1 = RegSetValueEx_(HKEY, sValueName, 0, #REG_SZ, @vValue, Len(vValue) + 1)
      Case #REG_DWORD
        lValue = Val(vValue)
        r1 = RegSetValueEx_(HKEY, sValueName, 0, #REG_DWORD, @lValue, 4)
    EndSelect
    If r1 = #ERROR_SUCCESS
      result = #True
    Else
      RegLasterror = r1
      RegLastMessage = FormatMessage(RegLasterror)
      result = #False
    EndIf
  Else
    RegLasterror = r1
    RegLastMessage = FormatMessage(RegLasterror)
    result = #False
  EndIf
  RegCloseKey_(HKEY)
  If lhRemoteRegistry : RegCloseKey_(lhRemoteRegistry) : EndIf
  ProcedureReturn result
EndProcedure
Procedure.s Reg_GetValue(topKey, sKeyName.s, sValueName.s, ComputerName.s = "")
  Protected HKEY.l, lhRemoteRegistry.l
  Protected r1.l, result.l
  Protected lpData.s{256}, GetValue.s
  Protected lType.l, lpcbData.l, lpDataDWORD.l
  RegLasterror = 0
  GetValue.s = ""
  If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf
  If Right(sKeyName,1) = "\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf
  If ComputerName = ""
    r1 = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @HKEY)
  Else
    r1 = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry)
    If r1 <> #ERROR_SUCCESS
      RegLasterror = r1
      RegLastMessage = FormatMessage(RegLasterror)
      ProcedureReturn ""
    EndIf
    r1 = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @HKEY)
  EndIf
  If r1 = #ERROR_SUCCESS
    lpcbData = 255
    r1 = RegQueryValueEx_(HKEY, sValueName, 0, @lType, @lpData, @lpcbData)
    If r1 = #ERROR_SUCCESS
      lType= #REG_SZ
      Select lType
        Case #REG_SZ
          r1 = RegQueryValueEx_(HKEY, sValueName, 0, @lType, @lpData, @lpcbData)
          If r1 = #ERROR_SUCCESS
            GetValue = Left(lpData, lpcbData - 1)
          Else : GetValue = ""
          EndIf
        Case #REG_DWORD
          r1 = RegQueryValueEx_(HKEY, sValueName, 0, @lType, @lpDataDWORD, @lpcbData)
          If r1 = #ERROR_SUCCESS
            GetValue = Str(lpDataDWORD)
          Else : GetValue = ""
          EndIf
      EndSelect
      If r1 = #ERROR_SUCCESS
        result = #True
      EndIf
    EndIf
  EndIf
  RegCloseKey_(HKEY)
  If lhRemoteRegistry : RegCloseKey_(lhRemoteRegistry) : EndIf
  ProcedureReturn GetValue
EndProcedure
;==========  Ende Modul "C:\ALSTERSOFT\PB4.20\MODULE\REGISTRY.PBI"  ==========
;==========  Begin Modul "C:\ALSTERSOFT\PB4.20\MODULE\WORT.PBI"  ==========
Global Wort_Ende$
Global Wort_Klammer$
Procedure.s Wort(*WO_Param)
  Protected WO_Param$, Wort$
  WO_Param$ = LTrim(PeekS(*WO_Param))
  If Wort_Ende$ = ""
    If Wort_Klammer$ = ""
      Wort_Klammer$ = Chr(34)+Chr(39)+Chr(180)+Chr(255)
    EndIf
    If FindString(Wort_Klammer$,Left(WO_Param$,1),1) And WO_Param$>""
      Wort_Ende$ = Left(WO_Param$,1)
      WO_Param$ = Right(WO_Param$,Len(WO_Param$)-1)
    Else
      Wort_Ende$ = " "
    EndIf
  EndIf
  While Left(WO_Param$,1)<>Wort_Ende$ And WO_Param$>""
    Wort$ +Left(WO_Param$,1)
    WO_Param$ = Mid(WO_Param$,2,99999)
  Wend
  Wort_Ende$ = "" : Wort_Klammer$ = ""
  PokeS(*WO_Param,LTrim(Right(WO_Param$,Len(WO_Param$)-1)))
  ProcedureReturn Wort$
EndProcedure
;==========  Ende Modul "C:\ALSTERSOFT\PB4.20\MODULE\WORT.PBI"  ==========




Global PB4_FontNr
;#jaPBeExt exit
Procedure GetSystemFont(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 PB4_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)
    PB4_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
    ;FontID = LoadFont(FreeFont(0), SystemFont_Name$, SystemFont_Size, SystemFont_Style) <-- updated by PB_SrcChg Vers. 8A21a
    PB4_FontNr = LoadFont(#PB_Any, SystemFont_Name$, SystemFont_Size, SystemFont_Style)
    FontID = FontID(PB4_FontNr)
    RegCloseKey_(RegID)
    FreeMemory(PB4_MemNr)
  EndIf
  ProcedureReturn FontID
EndProcedure



Debug GetSystemFont(2) 
Debug SystemFont_Name$  ;Schriftart-Name
Debug SystemFont_Size   ;Schriftart-Größe
Debug SystemFont_Style  ;Schriftart-Attribute
viel Erfolg...
Bild Bild
Antworten