Au sujet de LoadFont()

Sujets variés concernant le développement en PureBasic
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Au sujet de LoadFont()

Message par comtois »

Apparemment , il n'est pas possible de charger une police qui se trouve dans un répertoire bien précis avec la fonction LoadFont() . Cette fonction va chercher dans le répertoire polices de windows , ou il y a un truc qui m'échappe ?

Voila ce que je cherche à faire, pour ceux qui ont téléchargé le tutoriel RPG, dedans il y a une police de caractères ,que je charge de la façon suivante :

Code : Tout sélectionner

Fid=LoadFont(#PB_Any,"carolingia.ttf", 16,#PB_Font_HighQuality)
si je me contente de ça , je n'ai pas la bonne police qui s'affiche.
Il faut en plus que j'aille dans le panneau de configuration puis dans "polices"
et enfin que je fasse ajouter une police pour ajouter la police carolingia.
Alors que je voudrais pouvoir charger une police directement depuis le fichier dispo dans mon répertoire .Est-ce possible de faire un truc de ce genre ? et comment ?

J'ai trouvé ça :

Code : Tout sélectionner

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1651&highlight=
; Author: GPI
; Date: 08. July 2003

Procedure LoadAdditionalFonts(Dir$) 
  ExamineDirectory(#Dir_Font,"Style\","*.TTF") 
  While NextDirectoryEntry() 
    AddFontResource_("Style\"+DirectoryEntryName()) 
  Wend 
  ExamineDirectory(#Dir_Font,"Style\","*.FON") 
  While NextDirectoryEntry() 
    AddFontResource_("Style\"+DirectoryEntryName()) 
  Wend 
  SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0) 
EndProcedure 

Procedure UnLoadAdditionalFonts(Dir$) 
  ExamineDirectory(#Dir_Font,"Style\","*.TTF") 
  While NextDirectoryEntry() 
    RemoveFontResource_("Style\"+DirectoryEntryName()) 
  Wend 
  ExamineDirectory(#Dir_Font,"Style\","*.FON") 
  While NextDirectoryEntry() 
    RemoveFontResource_("Style\"+DirectoryEntryName()) 
  Wend 
  SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0) 
EndProcedure  
Il faut obligatoirement charger la police dans le répertoire windows avant de pouvoir utiliser la fonction LoadFont() ?
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Je suis aussi interessé
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Il me semble que oué... quand je bossais sur mes codes à barres j'ai été confronté au même problème et j'n suis venu à ces conclusions...

bien sûr tu peux aussi charger une police sans la mettre dans le répertoire windows... font creator le fait très bien... l'apperçu d'une police aussi (quand on double clique sur une police) mais je ne sais pas comment on s'y prend. j'avais trouvé une piste mais sans succès...

Dri
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

@comtois,

Je suis parvenu à faire fonctionner AddFontResource_() et à ajouter une font ttf, mais le RemoveFontResource ne la fait plus disparaître de la liste.

Du coup je n'arrive pas à valider un modèle de test convenable.

Par contre je me suis amusé avec le reste des fonctions API pour voir ce que l'on peut tirer comme parti supplémentaire :

Code : Tout sélectionner

Enumeration
  #Window_Main
  #Gadget_Button
  #Gadget_String
  #Gadget_ListIcon
  #Gadget_Image
  #Image
EndEnumeration

#AW_HOR_POSITIVE = $1 ; Animates the window from left to right. This flag can be used with roll or slide animation.
#AW_HOR_NEGATIVE = $2 ; Animates the window from right to left. This flag can be used with roll or slide animation.
#AW_VER_POSITIVE = $4 ; Animates the window from top to bottom. This flag can be used with roll or slide animation.
#AW_VER_NEGATIVE = $8 ; Animates the window from bottom to top. This flag can be used with roll or slide animation.
#AW_CENTER = $10 ; Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used.
#AW_HIDE = $10000 ; Hides the window. By default, the window is shown.
#AW_ACTIVATE = $20000 ; Activates the window.
#AW_SLIDE = $40000 ; Uses slide animation. By default, roll animation is used.
#AW_BLEND = $80000 ; Uses a fade effect. This flag can be used only if hwnd is a top-level window.

;
; All returned values are accessible but few are used here to fill the ListIcon gadget
;
Procedure EnumFontFamProc(lpelf.l, lpntm.l, FontType.l, lParam.l)
Static FontCounter.l
  *lpelf.ENUMLOGFONT = lpelf
  sFontType.s = ""
  TrueType = #False
  If FontType & #DEVICE_FONTTYPE
      sFontType.s + "Device "
  EndIf
  If FontType & #RASTER_FONTTYPE
      sFontType.s + "Raster "
  EndIf
  If FontType & #TRUETYPE_FONTTYPE  
      sFontType.s + "TrueType "
      TrueType = #True
  EndIf
  FontHeight = *lpelf\elfLogFont\lfHeight
  FontWidth = *lpelf\elfLogFont\lfWidth
  FontEscapement = *lpelf\elfLogFont\lfEscapement
  FontOrientation = *lpelf\elfLogFont\lfOrientation
  FontWeight = *lpelf\elfLogFont\lfWeight
  FontItalic = *lpelf\elfLogFont\lfItalic
  FontUnderline = *lpelf\elfLogFont\lfUnderline
  FontStrikeOut = *lpelf\elfLogFont\lfStrikeOut
  FontCharSet = *lpelf\elfLogFont\lfCharSet
  FontOutPrecision = *lpelf\elfLogFont\lfOutPrecision
  FontClipPrecision = *lpelf\elfLogFont\lfClipPrecision
  FontQuality = *lpelf\elfLogFont\lfQuality
  FontPitchAndFamily = *lpelf\elfLogFont\lfPitchAndFamily
  FontName.s = ""
  i = 0
  While *lpelf\elfFullName[i] <>0
    FontName + Chr(*lpelf\elfFullName[i])
    i + 1
  Wend
  FontStyle.s = ""
  i = 0
  While *lpelf\elfStyle[i] <>0
    FontStyle + Chr(*lpelf\elfStyle[i])
    i + 1
  Wend
  If TrueType
      *lpntm1.NEWTEXTMETRIC = lpntm
      MetricHeight = *lpntm1\tmHeight
      MetricAscent = *lpntm1\tmAscent
      MetricDescent = *lpntm1\tmDescent
      MetricInternalLeading = *lpntm1\tmInternalLeading
      MetricExternalLeading = *lpntm1\tmExternalLeading
      MetricAveCharWidth = *lpntm1\tmAveCharWidth
      MetricMaxCharWidth = *lpntm1\tmMaxCharWidth
      MetricWeight = *lpntm1\tmWeight
      MetricOverhang = *lpntm1\tmOverhang
      MetricDigitizedAspectX = *lpntm1\tmDigitizedAspectX
      MetricDigitizedAspectY = *lpntm1\tmDigitizedAspectY
      MetricFirstChar = *lpntm1\tmFirstChar
      MetricLastChar = *lpntm1\tmLastChar
      MetricDefaultChar = *lpntm1\tmDefaultChar
      MetricBreakChar = *lpntm1\tmBreakChar
      MetricItalic = *lpntm1\tmItalic
      MetricUnderlined = *lpntm1\tmUnderlined
      MetricStruckOut = *lpntm1\tmStruckOut
      MetricPitchAndFamily = *lpntm1\tmPitchAndFamily
      MetricCharSet = *lpntm1\tmCharSet
      MetricFlags = *lpntm1\ntmFlags
      MetricSizeEM = *lpntm1\ntmSizeEM
      MetricCellHeight = *lpntm1\ntmCellHeight
      MetricAveWidth = *lpntm1\ntmAveWidth
    Else
      *lpntm2.TEXTMETRIC = lpntm
      MetricHeight = *lpntm2\tmHeight
      MetricAscent = *lpntm2\tmAscent
      MetricDescent = *lpntm2\tmDescent
      MetricInternalLeading = *lpntm2\tmInternalLeading
      MetricExternalLeading = *lpntm2\tmExternalLeading
      MetricAveCharWidth = *lpntm2\tmAveCharWidth
      MetricMaxCharWidth = *lpntm2\tmMaxCharWidth
      MetricWeight = *lpntm2\tmWeight
      MetricOverhang = *lpntm2\tmOverhang
      MetricDigitizedAspectX = *lpntm2\tmDigitizedAspectX
      MetricDigitizedAspectY = *lpntm2\tmDigitizedAspectY
      MetricFirstChar = *lpntm2\tmFirstChar
      MetricLastChar = *lpntm2\tmLastChar
      MetricDefaultChar = *lpntm2\tmDefaultChar
      MetricBreakChar = *lpntm2\tmBreakChar
      MetricItalic = *lpntm2\tmItalic
      MetricUnderlined = *lpntm2\tmUnderlined
      MetricStruckOut = *lpntm2\tmStruckOut
      MetricPitchAndFamily = *lpntm2\tmPitchAndFamily
      MetricCharSet = *lpntm2\tmCharSet
  EndIf
  sFontAttributes.s = ""
  If FontItalic
      sFontAttributes + "I"
  EndIf
  If FontUnderline
      sFontAttributes + "U"
  EndIf
  If FontStrikeOut
      sFontAttributes + "S"
  EndIf
  If sFontAttributes <> ""
      sFontAttributes = "(" + sFontAttributes + ")"
  EndIf
  If lParam
      If FindString(LCase(FontName), LCase(PeekS(lParam)), 1)
          AddGadgetItem(#Gadget_ListIcon, -1, FontName + Chr(10) + Str(FontWidth) + Chr(10) + Str(FontHeight) + Chr(10) + Str(FontWeight) + Chr(10) + FontStyle + " " + sFontAttributes + Chr(10) + sFontType)
      EndIf
    Else
      AddGadgetItem(#Gadget_ListIcon, -1, FontName + Chr(10) + Str(FontWidth) + Chr(10) + Str(FontHeight) + Chr(10) + Str(FontWeight) + Chr(10) + FontStyle + " " + sFontAttributes + Chr(10) + sFontType)
  EndIf
  While WindowEvent()
  Wend
  FontCounter + 1
  ProcedureReturn 1
EndProcedure

Procedure DrawRotatedText(Image.l, Text.s, x.l, y.l, FontName.s, Size.l, Angle.l, Weight.l, Italic.l, Underline.l, StrikeOut.l, BackgroundColor.l, ForegroundColor.l, DrawingMode.l)
  UseImage(Image)
  ImageDC.l = StartDrawing(ImageOutput())
    hFont.l = CreateFont_(Size * GetDeviceCaps_(ImageDC, #LOGPIXELSY) / 72, 0, Angle * 10, 0, Weight, Italic, Underline, StrikeOut, #ANSI_CHARSET, #OUT_TT_PRECIS, #CLIP_LH_ANGLES, #PROOF_QUALITY, #DEFAULT_PITCH |#FF_DONTCARE, FontName)
    PreviousFont.l = SelectObject_(ImageDC, hFont)
    Locate(x, y)
    DrawingMode(DrawingMode)
    BackColor(Red(BackgroundColor), Green(BackgroundColor), Blue(BackgroundColor))
    FrontColor(Red(ForegroundColor), Green(ForegroundColor), Blue(ForegroundColor))
    DrawText(Text)
  StopDrawing()
  SelectObject_(ImageDC, PreviousFont)
  DeleteObject_(hFont)
EndProcedure

Procedure DrawBackgroundImage(ImageWidth, ImageHeight, Text.s, BackgroundColor.l, TextColor.l, Spacing.l, FontName.s, FontSize.l, Angle.l)
Static ImageNumber
  If ImageNumber
      FreeImage(ImageNumber)
  EndIf
  ImageNumber = CreateImage(#PB_Any, ImageWidth, ImageHeight)
  ImageID = UseImage(ImageNumber)
  StartDrawing(ImageOutput())
    Box(0, 0, ImageWidth, ImageHeight, BackgroundColor)
  StopDrawing()
  For x = 0 To ImageWidth
    For y = 0 To ImageHeight
      DrawRotatedText(ImageNumber, Text, x, y, FontName, FontSize, Angle, 100, #False, #False, #False, #Black, TextColor, 1)
      y + Spacing - 1
    Next
    x + Spacing - 1
  Next
  ProcedureReturn ImageID
EndProcedure

  WindowWidth = 640
  WindowHeight = 480
  WindowTitle.s = "MyWindow"
  ImageWidth = WindowWidth - 20
  ImageHeight = 120
  ImageID = CreateImage(#Image, ImageWidth, ImageHeight)
  StartDrawing(ImageOutput())
    Box(0, 0, ImageWidth, ImageHeight, $B0B0B0)
  StopDrawing()
  If OpenWindow(#Window_Main, 0, 0, WindowWidth, WindowHeight, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_Invisible, WindowTitle)
      SetWinBackgroundImage(WindowID(#Window_Main), DrawBackgroundImage(WindowWidth, WindowHeight, WindowTitle, WindowBackgroundColor = $300000, WindowFiligreeColor = $600000, Spacing = 60, "Verdana", 14, -30))
      AnimateWindow_(WindowID(#Window_Main), 1000, #AW_BLEND | #AW_ACTIVATE)
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Return, #Gadget_Button)
      If CreateGadgetList(WindowID(#Window_Main))
          StringGadget(#Gadget_String, 10, 10, 180, 20, "")
          GadgetToolTip(#Gadget_String, "Enter a font name to search and click OK")
          ButtonGadget(#Gadget_Button, 200, 10, 60, 20, "OK")
          ListIconGadget(#Gadget_ListIcon, 10, 40, WindowWidth - 20, WindowHeight - 180, "Name", 240)
          AddGadgetColumn(#Gadget_ListIcon, 1, "Width", 50)
          AddGadgetColumn(#Gadget_ListIcon, 2, "Height", 50)
          AddGadgetColumn(#Gadget_ListIcon, 3, "Weight", 50)
          AddGadgetColumn(#Gadget_ListIcon, 4, "Style & Attr.", 80)
          AddGadgetColumn(#Gadget_ListIcon, 5, "Type", 70)
          ImageGadget(#Gadget_Image, 10, WindowHeight - 130, ImageWidth, ImageHeight, ImageID, #PB_Image_Border)
          GadgetToolTip(#Gadget_Image, "Font sample display with basic width and forced 32 width")
      EndIf
      EnumFontFamilies_(GetDC_(WindowID(#Window_Main)), #Null, @EnumFontFamProc(), 0)
      Quit = #False
      Repeat
        WindowEvent = WindowEvent()
        EventType = EventType()
        Select WindowEvent
          Case #PB_Event_CloseWindow
            Quit = #True
          Case #PB_Event_Menu
            Select EventMenuID()
              Case #PB_Shortcut_Escape
                Quit = #True
              Case #PB_Shortcut_F1
                Statistics = 1 - Statistics
              Case #Gadget_Button
                ClearGadgetItemList(#Gadget_ListIcon)
                EnumFontFamilies_(GetDC_(WindowID(#Window_Main)), #Null, @EnumFontFamProc(), GetGadgetText(#Gadget_String))
            EndSelect
          Case #PB_Event_Gadget
            Select EventGadgetID()
              Case #Gadget_Button
                ClearGadgetItemList(#Gadget_ListIcon)
                EnumFontFamilies_(GetDC_(WindowID(#Window_Main)), #Null, @EnumFontFamProc(), GetGadgetText(#Gadget_String))
              Case #Gadget_ListIcon
                FontName.s = GetGadgetItemText(#Gadget_ListIcon, GetGadgetState(#Gadget_ListIcon), 0)
                FontSize.l = Val(GetGadgetItemText(#Gadget_ListIcon, GetGadgetState(#Gadget_ListIcon), 1))
                FontHeight.l = Val(GetGadgetItemText(#Gadget_ListIcon, GetGadgetState(#Gadget_ListIcon), 2))
                FontID1 = UseFont(LoadFont(#PB_Any, FontName, FontSize, #PB_Font_HighQuality))
                If FontHeight <= 24
                    FontHeight2 = 32
                  Else
                    FontHeight2 = FontHeight * 3 / 2
                EndIf
                FontID2 = UseFont(LoadFont(#PB_Any, FontName, 32, #PB_Font_HighQuality))
                ImageID1 = DrawBackgroundImage(ImageWidth, ImageHeight, FontName, $E0E0E0, $D0D0D0, FontSize * 5, FontName, FontSize, -45)
                UseImage(#Image)
                StartDrawing(ImageOutput())
                  DrawImage(ImageID1, 0, 0)
                  DrawingFont(FontID1)
                  DrawingMode(1)
                  BackColor($E0, $E0, $E0)
                  FrontColor(0, 0, 0)
                  Locate(5, 5)
                  DrawText("ABCDEFghijkl PureBasic Font display")
                  Locate(5, FontHeight + 20)
                  DrawingFont(FontID2)
                  DrawText("ABCDEFghijkl PureBasic Font display")
                StopDrawing()
                SetGadgetState(#Gadget_Image, ImageID)
            EndSelect
          Case #PB_Event_SizeWindow
            WindowWidth = WindowWidth()
            WindowHeight = WindowHeight()
            If WindowWidth < 100
                WindowWidth = 100
            EndIf
            If WindowHeight < 100
                WindowHeight = 100
            EndIf
            SetWinBackgroundImage(WindowID(#Window_Main), DrawBackgroundImage(WindowWidth, WindowHeight, WindowTitle, WindowBackgroundColor = $300000, WindowFiligreeColor = $600000, Spacing = 60, "Verdana", 14, -30))
        EndSelect
      Until Quit
      AnimateWindow_(WindowID(#Window_Main), 1000, #AW_BLEND | #AW_HIDE)
  EndIf
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

pour retirer une police de la liste il faut aussi la virer dans le registre de windows... mais je ne sais pas quelle clé...

Dri
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

@Dr.Dri,

Oui c'est bien ce que je crois, mais j'ai pas réussi à trouver de clé correspondant pour l'instant.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

ça ne serait pas la clé :
[HKEY_CURRENT_USER\Software\Microsoft\Shared Tools\Font Mapping] ?

Ou sinon celle-la : [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts] ?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

@lionel_om,

Le pb que je rencontre c'est que j'ai installé une police, que j'ai effacé le fichier, et fait un removefontresource_(), mais que la police existe toujours dans les outils office et dand le enumfont sous PB.

Par contre je ne trouve aucune occurence avec le nom du fichier ou de la police dans la registry.

Alors pour l'instant je n'y comprends que pouic !!!
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Merci fweil mais ce n''est pas ce que je cherche à faire.
Apparemment SDL permet de charger une fonte à partir d'un répertoire sans avoir besoin de l'installer et c'est ce que je cherche à faire .
3.2.1 TTF_OpenFont

TTF_Font *TTF_OpenFont(const char *file, int ptsize)

file
File name to load font from.
ptsize
Point size (based on 72DPI) to load font as. This basically translates to pixel height.

Load file for use as a font, at ptsize size. This is actually TTF_OpenFontIndex(file, ptsize, 0). This can load TTF and FON files.

Returns: a pointer to the font as a TTF_Font. NULL is returned on errors.
Sinon j'ai regardé ton code ,il est super , je vais apprendre pleins de trucs avec ça :)

Merci françois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Fweil,
sympa ton code! :D

Comtois,
J'ai déjà vu quelque part un code qui permet d'utiliser une police directement sans l'enregistrer, c'est peut-être un truc pour une ressource; je vais voir si je peux remettre la main dessus.
Oh là, je reviens de vacances, je lis à la va vite, en fait tu as posté le code que je recherchais. :lol:
Dernière modification par nico le ven. 26/août/2005 22:04, modifié 1 fois.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

nico a écrit :Comtois,
J'ai déjà vu quelque part un code qui permet d'utiliser une police directement sans l'enregistrer, c'est peut-être un truc pour une ressource; je vais voir si je peux remettre la main dessus.
ça serait cool si tu retrouves :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Désolé, j'ai rééditer mon post; en fait je n'ai rien de nouveau. :oops:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Tant pis :P

Espérons que Fred a lu ce post et qu'il fera quelque chose pour la prochaine version si c'est possible :)

Il y a aussi un autre truc que je ne comprends pas c'est qu'avec la même police "carolingia", l'affichage est correct avec un code en C qui utilise SDL , par contre l'affichage est pixellisé avec PureBasic, même en ajoutant le paramètre #PB_Font_HighQuality

Fred , il y aurait moyen d'améliorer ça ? ou je fais mal un truc ?
Répondre