Police en ASCII étendu

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Police en ASCII étendu

Message par sospel »

bonjour à tous :)

J'ai une question concernant l'utilisation d'un code ASCII. Voici ce dont il s'agit :

un de mes anciens programmes de calculs astronomiques, écrit jadis en FORTRAN, utilisait la police de caractères MS LINE DRAW car elle avait des caractères de séparation des résultats particulièrement utiles pour la lisibilité des listings : doubles lignes verticales et horizontales, coins , lignes simples continues, etc ...
Souhaitant transcrire ce programme en PureBasic (j'ai la version 5.60) pour bénéficier de ses possibilités graphiques, je bute sur le fait que je ne sais pas comment utiliser cette police, qui existe bien dans mon système sous le nom : "C:\WINDOWS\Fonts\MSLINEDRAW.TTF".

Ma question est donc celle-ci : est-il possible de choisir cette police de caractères ASCII étendue dans mon programme en PureBasic ? et si oui, comment faire ?

Merci par avance pour toute réponse à mon problème !
SosPel
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Police en ASCII étendu

Message par Zorro »

jette un oeil ici :
http://www.purebasic.fr/french/viewtopi ... ilit=fonts

sinon l'exemple de la doc est assez parlant

la fonction

Code : Tout sélectionner

LoadFont (0, "Courier", 15)
permet de charger une fonte,(ici la fonte "courier") dans le corp (taille=15 ) que tu veux
et de lui attribuer un numero (ici 0 )
la fonction "

Code : Tout sélectionner

 DrawingFont(FontID(0)) 
" permet d'utiliser cette fonte (0) comme tu veux
ici par exemple en utilisant "

Code : Tout sélectionner

DrawText(10,10, "Font: Courier - Size: 15 - Red", RGB(255, 0, 0))
"

apres ceci fait, tu peux l'utiliser avec les fonctions de la librairie "Font" (touche F1 de ton editeur pour avoir l'aide de Purebasic )

ici l'utilisation est en mode Graphique dans une image (startDrawing -StopDrawing )
mais ça marche aussi pour les gadgets utilisant du Texte

Code : Tout sélectionner

LoadFont (0, "Courier", 15)            ; Load Courrier Font, Size 15
LoadFont (1, "Arial", 24)              ; Load Arial Font, Size 30

If OpenWindow(0, 100, 200, 460, 148, "Font Test") = 0
  MessageRequester("Error", "Can't open Window", 0)
  End
EndIf

If CreateImage(0, 450, 130)

  If StartDrawing(ImageOutput(0))           ;
    Box(0, 0, 450, 130, RGB(255, 255, 255)) ; White background
  
    DrawingMode(1)                          ; Transparent TextBackground
  
    DrawingFont(FontID(0))                 ; Use the 'Courier' font
    DrawText(10,10, "Font: Courier - Size: 15 - Red", RGB(255, 0, 0))    ; Print our text
                
    DrawingFont(FontID(1))                 ; Use the Arial font
    DrawText(10,40, "Font: Arial - Size: 24", RGB(0, 0, 0))      ; Print our text

    StopDrawing()                          ; This is absolutely needed when the drawing operations are 
  EndIf                                    ; finished !!! Never forget it !

EndIf

; Display the image on the window
;
ImageGadget(0, 5, 10, 450, 130, ImageID(0))

;
; This is the 'event loop'. All the user actions are processed here.
; It's very easy to understand: when an action occurs, the Event
; isn't 0 and we just have to see what have happened...
;
Repeat

  Event = WaitWindowEvent()
  
Until Event = #PB_Event_CloseWindow    ; If the user has pressed on the close button

End                                      ; All the opened windows are closed automatically by PureBasic
  
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Police en ASCII étendu

Message par Zorro »

haaaa ! j'ai retrouvé e code que je cherchais


tiens test ça, tu verra les fameux caracteres double lignes etc ....
c'est en fait dans la Fonte "Lucida"
d'ou le

Code : Tout sélectionner

LoadFont(#font,"Lucida",10)
au debut du code

Code : Tout sélectionner


; modifié Zorro

Enumeration
      #Win
      #list
EndEnumeration

Declare.s Ascii_sous_unicode(MonMessageANSI.s)

Enumeration
      #Font
EndEnumeration

LoadFont(#font,"Lucida",10)
SetGadgetFont(#PB_Default, FontID(#font))


debug Ascii_sous_unicode(chr(203)  ) ; respecte les accents

OpenWindow(#Win , 0, 0, 880, 500, "ascii...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(#list, 0, 0, 880, 500, "0..31", 110,#PB_ListIcon_GridLines)
AddGadgetColumn(#list, 1, "32..63", 110)
AddGadgetColumn(#list, 2, "64..95", 110)
AddGadgetColumn(#list, 3, "96..127", 110)
AddGadgetColumn(#list, 4, "128..159", 110)
AddGadgetColumn(#list, 5, "160..191", 110)
AddGadgetColumn(#list, 6, "192..223", 110)
AddGadgetColumn(#list, 7, "224..255", 110)
ii.s=chr(10)
For i=0 To 31
      i$=Ascii_sous_unicode(chr(i))
      i2$=Ascii_sous_unicode(chr(i+32))
      i3$=Ascii_sous_unicode(chr(i+64))
      i4$=Ascii_sous_unicode(chr(i+96))
      i5$=Ascii_sous_unicode(chr(i+128))
      i6$=Ascii_sous_unicode(chr(i+160))
      i7$=Ascii_sous_unicode(chr(i+192))
      i8$=Ascii_sous_unicode(chr(i+224))
      AddGadgetItem(#list, -1,Str(i)+" "+i$+ii.s+Str(i+32)+" "+i2$+ii.s+ Str(i+64)+" "+i3$+ii.s+ Str(i+96)+" "+i4$+ii.s+ Str(i+128)+" "+i5$+ii.s+ Str(i+160)+" "+i6$+ii.s+ Str(i+192)+" "+i7$+ii.s+Str(i+224)+" "+i8$+#LF$)   
Next i
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Procedure.s Ascii_sous_unicode(MonMessageANSI.s)
      MonMessageASCII.s = space(Len(MonMessageANSI.s))
      ;CharToOem_(@MonMessageANSI.s, @MonMessageASCII.s)
      OemToChar_(@MonMessageANSI.s, @MonMessageASCII.s)
      ProcedureReturn MonMessageASCII.s
EndProcedure



; Epb
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Police en ASCII étendu

Message par JohnJohnsonSHERMAN »

Ces caractéres sont dans toutes les polices Unicode complétes (arial, segoe, verdana, ext...), et tu peux les trouver sur www.unicode-table.com :)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Re: Police en ASCII étendu

Message par sospel »

@ Zorro

Un grand merci pour tes réponses quasi instantanées. C'est super-sympa :D

Je vais les étudier ce prochain WE et je te dirai ce qu'il en est !!
Je pense qu'elles vont résoudre mon problème car ces caractères un peu spéciaux sont en fait très pratiques pour séparer des colonnes de résultats numériques - en l'occurrence les éphémérides d'astéroïdes dans le ciel au-dessus de ma tête ... Ensuite, j'utiliserai les possibilités des fenêtres graphiques de PB pour visualiser leurs trajectoires.
Ca sera plus "parlant" que des colonnes de nombres ...
Cordialement
SosPel
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Police en ASCII étendu

Message par falsam »

Pour une application autonome, une autre technique consiste à embarquer la police dans la DataSection et de la reconstruire dans un dossier temporaire avant son utilisation.

■ Cette technique exploite la fonction RegisterFontFile()

Help http://www.purebasic.com/french/documen ... tfile.html

■ Exemple avec une police LLPIXEL que j'ai télécharger sur dafont.com
http://www.dafont.com/fr/llpixel.font

Une fois télécharger et décompressé, faire glisser la police sur l'utilitaire Bin2Data afin d'obtenir la police encapsulé dans sa DataSection.
https://github.com/pbcodex/Bin2Data/archive/master.zip (Code source)

■ Le code de test final étant trop long, vous pouvez le télécharger sur github.
:arrow: https://github.com/pbcodex/RegisterFont ... master.zip
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Police en ASCII étendu

Message par Mesa »

Comme indiqué plus haut, le principe, c'est que si la police est reconnu par le système d'exploitation alors un simple LoadFont(PoliceID,"MSLINEDRAW",10) et SetGadgetFont(#Gadget, PoliceID) suffisent.

Sinon, tu trouveras un exemple tout fait dans ton repertoire PureBasic\Examples\Sources\FontRegister.pb ou ici
http://www.purebasic.com/french/documen ... er.pb.html


Il est multiplatforme (sans api) et provient d'un projet que j'avais fait ici:
http://www.purebasic.fr/english/viewtop ... 12&t=66614

Mesa.
sospel
Messages : 56
Inscription : ven. 05/déc./2008 21:47

Re: Police en ASCII étendu

Message par sospel »

@ JohnJohnsonSHERMAN

Merci pour ce lien multi-langages ! Je n'y ai pas encore trouvé la double séparation, mais elle doit bien être quelque part ! En tout cas je vais utiliser certains alphabets asiatiques pour mon courrier : à défaut d'être compréhensibles, ils sont très esthétiques ;)

@ falsam

bonne idée pour une application autonome. Je regarderai ceci en détail le WE prochain !

@ Mesa

je vais vérifier que le fichier "MSLINEDRAW.TTF" est reconnu par mon programme. Auquel cas, je pourrais utiliser ses caractères "graphiques" directement.

Donc, merci à vous tous pour vos conseils : je n'ai plus que l'embarras du choix :)
Cordialement
SosPel
Répondre