GetGadgetFont, größe, farbe und flags ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
persepole
Beiträge: 36
Registriert: 14.04.2005 22:56

GetGadgetFont, größe, farbe und flags ermitteln

Beitrag von persepole »

Hi Leute,

irgendwie komme ich nicht drauf wie
aus einer FontID die Schriftart, größe und Farbe
ermittelt wird.

Code: Alles auswählen

 FontID = GetGadgetFont(#Gadget)
Ich möchte folgendes Realisieren:

Der User clickt auf ein Gadget, und dann auf einen Button (Font)
der den Fontrequester startet. Nun soll der Fontrequester
die Schriftart / Schriftgröße / Schriftfarbe und Flags gleich
anzeigen. Also z.B. gleich die Schriftart des Gadgets im Listview
anzeigen.

Hat da jemand ne ahnung wie das geht.

Grüsse
persepole
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

die Fontgröße wird nicht ermittelt, die wird beim Fontladen (loadfont(...))
gesetzt und dann HAT der Font eben die Größe, Breite, ...
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wie bo³ sagte, merken!

Code: Alles auswählen

EnableExplicit

Global FontName.s = "Arial"
Global FontSize.l = 12
Global FontBold.l = #True
Global FontItalic.l = #False
Global FontColor.l = #Red

Enumeration ; Fenster
  #frmMain
EndEnumeration
Enumeration ; Gadgets
  #txtVorschau
  #btnWaehleFont
EndEnumeration

Procedure SetzeFont()
  Protected Flags.l
  
  If FontBold : Flags | #PB_Font_Bold : EndIf
  If FontItalic : Flags | #PB_Font_Italic : EndIf
  LoadFont(1, FontName, FontSize, Flags)
  SetGadgetFont(#txtVorschau, FontID(1))
  SetGadgetColor(#txtVorschau, #PB_Gadget_FrontColor, FontColor)
EndProcedure

Procedure WaehleFont()
  Protected Result.l = FontRequester(FontName, FontSize, #PB_FontRequester_Effects, FontColor)
  If Result
    FontName = SelectedFontName()
    FontSize = SelectedFontSize()
    If SelectedFontStyle() & #PB_Font_Bold
      FontBold = #True
    Else
      FontBold = #False
    EndIf
    If SelectedFontStyle() & #PB_Font_Italic
      FontItalic = #True
    Else
      FontItalic = #False
    EndIf
    FontColor = SelectedFontColor()
    SetzeFont()
  EndIf
EndProcedure

Define.s Text = "Franz jagt im komplett verwahrlostem Taxi quer durch Bayern"

If OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 640, 230, "")
  If CreateGadgetList(WindowID(#frmMain))
    TextGadget(#txtVorschau, 10, 10, 620, 180, Text, #PB_Text_Border)
    SetzeFont()
    ButtonGadget(#btnWaehleFont, 240, 200, 140, 20, "Bitte Font wählen:")
  EndIf
EndIf

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = #btnWaehleFont
        WaehleFont()
      EndIf
  EndSelect
ForEver

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
persepole
Beiträge: 36
Registriert: 14.04.2005 22:56

Beitrag von persepole »

Oh, das ist mir jemand auf der Leitung gestanden.

Danke mal für die Hilfe. :roll:

Das Problemchen besteht aber weiterhin.
Ich ermittle nun also die FontID eines Gadgets.
Dann Lade ich die FontID.
Und nun möchte ich alle Daten (Schriftart, Größe,Farbe usw.)
ermitteln.
Folgendes möchte ich damit anstellen.
Ein Fenster auf dem sich 2 TextGadgets befinden.
Beide haben verschiedene Schriftarten. Clickt man
nun auf ein Textgadget und anschliessend auf Font-ändern
soll der Fontrequester die momentane font des Gadgets gleich
anzeigen.
Geht das überhaupt?

Danke
persepole
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> soll der Fontrequester die momentane font des Gadgets gleich anzeigen.
Macht der obige Code doch, für 2 Button eben doppelt soviele Variablen zum
merken.

Anhand der FontID das zu errechnen ist per API wohl möglich, aber sehr
umständlich mit diversen Umrechnungen und vollkommen unnötig.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Knowledge Base 84132

Code: Alles auswählen

Procedure.s GetFontNameFromGadget(gadget)
  Protected *otm.OUTLINETEXTMETRIC
  Protected bsize.l,Font.l,hWnd.l
  Protected FontName.s
  
  hWnd  =  GadgetID(gadget)
  
  Font  = GetGadgetFont(gadget) 
  hdc   = GetDC_(hWnd)
  Font  = SelectObject_(hdc,Font)
  bsize = GetOutlineTextMetrics_(hdc,0,0)
  
  If bsize = 0
    SelectObject_(hdc,Font)
    ReleaseDC_(hWnd,hdc)
    ProcedureReturn
  EndIf
  
  *otm = AllocateMemory(bsize)
  
  *otm\otmSize = bsize
  
  GetOutlineTextMetrics_(hdc,bsize,*otm)
  FontName = PeekS(*otm+*otm\otmpFamilyName)
  
  FreeMemory(*otm)
  SelectObject_(hdc,Font)
  ReleaseDC_(hWnd,hdc)

  ProcedureReturn FontName
EndProcedure

Procedure.s GetFontStyleFromGadget(gadget)
  Protected *otm.OUTLINETEXTMETRIC
  Protected bsize.l,Font.l,hWnd.l
  Protected FontStyle.s
  
  hWnd  =  GadgetID(gadget)
  
  Font  = GetGadgetFont(gadget) 
  hdc   = GetDC_(hWnd)
  Font  = SelectObject_(hdc,Font)
  bsize = GetOutlineTextMetrics_(hdc,0,0)
  
  If bsize = 0
    SelectObject_(hdc,Font)
    ReleaseDC_(hWnd,hdc)
    ProcedureReturn
  EndIf
  
  *otm = AllocateMemory(bsize)
  
  *otm\otmSize = bsize
  
  GetOutlineTextMetrics_(hdc,bsize,*otm)

  FontStyle = PeekS(*otm+*otm\otmpStyleName)
  
  FreeMemory(*otm)
  SelectObject_(hdc,Font)
  ReleaseDC_(hWnd,hdc)

  ProcedureReturn FontStyle
EndProcedure

Procedure.l GetFontSizeFromGadget(gadget)
  Protected *otm.OUTLINETEXTMETRIC
  Protected bsize.l,Font.l,hWnd.l
  Protected FontSize.l , val.f
  
  hWnd  =  GadgetID(gadget)
  
  Font  = GetGadgetFont(gadget) 
  hdc   = GetDC_(hWnd)
  Font  = SelectObject_(hdc,Font)
  bsize = GetOutlineTextMetrics_(hdc,0,0)
  
  If bsize = 0
    SelectObject_(hdc,Font)
    ReleaseDC_(hWnd,hdc)
    ProcedureReturn
  EndIf
  
  *otm = AllocateMemory(bsize)
  
  *otm\otmSize = bsize
  
  GetOutlineTextMetrics_(hdc,bsize,*otm)

  val.f = (*otm\otmTextMetrics\tmHeight-*otm\otmTextMetrics\tmInternalLeading)
  FontSize = Int(Round((val * 72 / GetDeviceCaps_(hdc,#LOGPIXELSY)),1))
  
  FreeMemory(*otm)
  SelectObject_(hdc,Font)
  ReleaseDC_(hWnd,hdc)

  ProcedureReturn FontSize
EndProcedure
GetFontSizeFromGadget haette zwar nicht so gross sein muessen,
war nur zu faul es wieder umzuschreiben.

Beispiel :

Code: Alles auswählen

hWnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,240,140,"leer")

CreateGadgetList(hWnd)
ButtonGadget(0,10,10,100,100,"sfsdfs")
ButtonGadget(1,110,10,100,100,"sfsdfs")

f = LoadFont(0,"Arial",10,#PB_Font_Italic|#PB_Font_Bold)
SetGadgetFont(0,f)

f = LoadFont(1,"Tahoma",15)
SetGadgetFont(1,f)

Debug GetFontNameFromGadget(0)
Debug GetFontStyleFromGadget(0)
Debug GetFontSizeFromGadget(0)
Debug "-----"
Debug GetFontNameFromGadget(1)
Debug GetFontStyleFromGadget(1)
Debug GetFontSizeFromGadget(1)

Repeat
	event = WaitWindowEvent()

Until event = #PB_Event_CloseWindow
Damit das Ganze nicht ganz so einfach ist, funktioniert das nur mit
Truetype Fonts.
persepole
Beiträge: 36
Registriert: 14.04.2005 22:56

Beitrag von persepole »

Danke edel. Das ist genau das wonach ich gesucht hab.
Ist mir ne große Hilfe.
Werde versuchen den Code zu verstehen.
Danke für eure Hilfe.

Grüsse
persepole
Antworten