Table de caractères

Programmation d'applications complexes
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Table de caractères

Message par Chris »

Parce que j'aime pas celle de jaPBe, j'ai fait celle-là.

Au moins, là, on la voit bien la lettre qui est sous le curseur! :lol:

[Edit]
Ajouté.
- Copie directe dans jaPBe à la position du curseur. (Désactivable)
- Fenêtre toujours au premier plan. (Désactivable)
- Ajout de la commande "Chr()". (Désactivable)

Corrigé.
- Un bug qui empêchait le caractère "&" d'apparaître

Modifié.
- Mode de détection de l'index du gadget contenant le caractère à afficher dans l'image.

[Edit2]
Ajouté.
- Les caractères de commande (de 0 à 32)
- Sauvegarde de la dernière police utilisée, et des règlages

Code : Tout sélectionner

;{- Constantes
Enumeration
  #Win_Main
EndEnumeration

Enumeration
  #Cmb_Fonts
  #Img_Preview
  #Txt_Result
  #TxtCopie
  #Chk_Japbe
  #Chk_InsertChr
  #Chk_Sticky
  
  #Btn_CopyAsString
  #Btn_CopyAsChar
  #Btn_CopyAsHex
  #Btn_CopyAsBin
  #Btn_CopyAsDec
  #Btn_CopyAsCar
  #Btn_Erase
EndEnumeration

#STN_CLICKED     = 0
#WMCD_InsertText = 2
;}

;{- Variables, Listes tableaux
Global NewList Fontes.s()
Global NewList Texts.l()
Global CurPos.POINT
Global Dim CommanChars.s(32)

;}

;{- Déclarations
Declare Create_Image(Lettre.s)
Declare EnumFontProc(*lpelf.ENUMLOGFONT, *lpntm.NEWTEXTMETRIC, FontType, lParam)
Declare GetFont_Info()
Declare Hi_Word(Long)
Declare Open_Window_0()
Declare WinCallback(Hwn, Msge, wParam, lParam)
Declare UpdateTexts()
;}

;{- Image vide
CreateImage(10, 255, 250)
StartDrawing(ImageOutput(10))
Box(0, 0, 255, 250, $FFFFFF)
StopDrawing()
;}

;{- Procédures
Procedure Open_Window_0()
  x_Text = 270 : y_Text = 5 : IdTxt = 1000
  
  If OpenWindow(#Win_Main, 5, 5, 655, 385, "Table des caractères",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Win_Main))
      ImageGadget(#Img_Preview, 5, 30, 255, 250, ImageID(10), #PB_Image_Border)
      ComboBoxGadget(#Cmb_Fonts, 5, 5, 260, 200)
      TextGadget(#Txt_Result, 5, 290, 645, 25, "", #PB_Text_Center | #PB_Text_Border | #SS_NOPREFIX)
      SetGadgetFont(#Txt_Result, FontID(2))
      
      TextGadget(#TxtCopie, 5, 320, 100, 25, "", #PB_Text_Center | #PB_Text_Border | #SS_NOPREFIX)
      SetGadgetFont(#TxtCopie, FontID(2))
      
      CheckBoxGadget(#Chk_Sticky, 330, 320, 100, 25, "Toujours devant")
      CheckBoxGadget(#Chk_InsertChr, 435, 320, 100, 25, "Ajouter le ''Chr()''")
      CheckBoxGadget(#Chk_Japbe, 540, 320, 150, 25, "Copier dans JaPBe")
      
      ButtonGadget(#Btn_CopyAsDec, 5, 355, 80, 25, "Décimal")
      ButtonGadget(#Btn_CopyAsChar, 85, 355, 80, 25, "Char")
      ButtonGadget(#Btn_CopyAsBin, 165, 355, 80, 25, "Binaire")
      ButtonGadget(#Btn_CopyAsHex, 245, 355, 80, 25, "Hexadécimal")
      ButtonGadget(#Btn_CopyAsString, 325, 355, 80, 25, "Chaine")
      ; ButtonGadget(#Btn_CopyAsCar, 405, 355, 80, 25, "Caractère")
      ButtonGadget(#Btn_Erase, 560, 355, 80, 25, "Effacer")
      
      For i = 0 To 255
        AddElement(Texts())
        TextGadget(IdTxt, x_Text, y_Text, 20, 20, "", #PB_Text_Center | #PB_Text_Border | #SS_NOTIFY | #SS_NOPREFIX)
        
        Texts() = IdTxt : IdTxt + 1
        x_Text + 20 : If x_Text > 640 : x_Text = 270 : y_Text + 20 : EndIf
        SetGadgetFont(Texts(), FontID(0))
      Next
      
    EndIf
    
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure EnumFontProc(*lpelf.ENUMLOGFONT, *lpntm.NEWTEXTMETRIC, FontType, lParam)
  FnN$ = PeekS(@*lpelf\elfLogFont\lfFaceName[0])
  
  AddElement(Fontes())
  Fontes() = FnN$
  ProcedureReturn #True
EndProcedure

Procedure GetFont_Info()
  hdc = GetDC_(GetDesktopWindow_())
  EnumFontFamilies_(hdc, 0, @EnumFontProc(),0)
  ReleaseDC_ (GetDesktopWindow_(), hdc)
EndProcedure

Procedure UpdateTexts()
  ForEach Texts()
    i = ListIndex(Texts())
    
    SetGadgetFont(Texts(), FontID(0))
    SetGadgetText(Texts(), Chr(i))
  Next
EndProcedure

Procedure Hi_Word(Long)
  ProcedureReturn (Long >>16) & $FFFF
EndProcedure

Procedure WinCallback(Hwn, Msge, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  Select Msge
    Case #WM_COMMAND
      If Hi_Word(wParam) = #STN_CLICKED
        ForEach Texts()
          If GadgetID(Texts()) = lParam
            SetGadgetText(#TxtCopie, GetGadgetText(Texts()))
            
            If Texts() >= 1000 And Texts() <= 1031
              DisableGadget(#Btn_CopyAsChar, 1)
            Else
              DisableGadget(#Btn_CopyAsChar, 0)
            EndIf
            
          EndIf
        Next
      EndIf
  EndSelect
  
  ProcedureReturn Result
EndProcedure

Procedure Create_Image(Lettre.s)
  If CreateImage(0, 255, 250)
    StartDrawing(ImageOutput(0))
    DrawingMode(1) : DrawingFont(FontID(1))
    W_Lettre = TextWidth(Lettre) : H_Lettre = TextHeight(Lettre)
    Box(0, 0, 255, 250, $FFFFFF)
    DrawText(128 - W_Lettre/2, 128 - H_Lettre / 2, Lettre)
    StopDrawing()
    
    SetGadgetState(#Img_Preview, ImageID(0))
  EndIf
  
EndProcedure

Procedure SendDatasToEditor(MainWin, Datas$, Mode.l)
  RunOneWin = FindWindow_(@"WindowClass_0",@"jaPBe-RunOneWindow")
  If RunOneWin
    If Datas$
      cd.COPYDATASTRUCT
      cd\dwData = Mode
      cd\cbData = Len(Datas$)+1
      cd\lpData = @Datas$
      SendMessage_(RunOneWin, #WM_COPYDATA, MainWin, cd)  
    EndIf
  EndIf
EndProcedure

;}

;{- Initialisation
GetFont_Info() : SortList(Fontes(), 2)
OpenPreferences("CharMap.pref")
CmbState = ReadPreferenceLong("IdFont", 19)
StickyState = ReadPreferenceLong("OnTop", 1)
ChrState = ReadPreferenceLong("AddChr", 0)
JapbeState = ReadPreferenceLong("Japbe", 1)
ClosePreferences()

SelectElement(Fontes(), CmbState) : LoadFont(0, Fontes(), 9) : LoadFont(1, Fontes(), 140) : LoadFont(2, "Courier New", 10, #PB_Font_Bold)

Restore CommandChar
For i = 0 To 32
  Read CommanChars(i)
Next

If Open_Window_0()
  ForEach Fontes()
    AddGadgetItem(#Cmb_Fonts, -1, Fontes())
  Next
  
  SetGadgetState(#Cmb_Fonts, CmbState)
  SetGadgetState(#Chk_Sticky, StickyState)
  SetGadgetState(#Chk_InsertChr, ChrState)
  SetGadgetState(#Chk_Japbe, JapbeState)
  
  StickyWindow(#Win_Main, GetGadgetState(#Chk_Sticky))
  
  SetWindowCallback(@WinCallback())
Else
  End
EndIf

UpdateTexts()

If FindWindow_("WindowClass_7", "jaPBe V3")
  DisableGadget(#Chk_Japbe, 0)
Else
  DisableGadget(#Chk_Japbe, 1)
  SetGadgetState(#Chk_Japbe, 0)
EndIf
;}

;{- Boucle
Repeat;{
  GetCursorPos_(CurPos)
  HObjet = WindowFromPoint_(CurPos\x, CurPos\y) : IDWindow = GetWindowLong_(HObjet, #GWL_ID)
  
  If IDWindow >= 1000
    If IDWindow >= 1000 And IDWindow <=1032
      c = IDWindow - 1000
      Ms1$ = CommanChars(IDWindow - 1000) + "     "
      Ms2$ = "Ascii = " + RSet(Str(c), 3, "0") + "     "
      Ms3$ = "Hex = $" + RSet(Hex(c), 2, "0") + "     "
      Ms4$ = "Bin = %" + RSet(Bin(c), 8, "0")
      SetGadgetText(#Txt_Result, Ms1$ + Ms2$ + Ms3$ + Ms4$)
      SetGadgetState(#Img_Preview, ImageID(10))
    Else
      SelectElement(Texts(), IDWindow - 1000)
      C$ = GetGadgetText(Texts()) : c = Asc(C$)
      Ms1$ = "Car. = " + RSet(C$, 1, " ") + "     "
      Ms2$ = "Ascii = " + RSet(Str(c), 3, "0") + "     "
      Ms3$ = "Hex = $" + RSet(Hex(c), 2, "0") + "     "
      Ms4$ = "Bin = %" + RSet(Bin(c), 8, "0")
      SetGadgetText(#Txt_Result, Ms1$ + Ms2$ + Ms3$ + Ms4$)
      Create_Image(GetGadgetText(Texts()))
    EndIf
  EndIf
  
  Select WaitWindowEvent();{
    Case #PB_Event_Gadget
      
      Select EventGadget();{
        
        Case #Cmb_Fonts;{
          If EventType() = #CBN_SELCHANGE
            SelectElement(Fontes(), GetGadgetState(#Cmb_Fonts))
            LoadFont(0, Fontes(), 9) : LoadFont(1, Fontes(), 140)
            UpdateTexts()
            SetGadgetState(#Img_Preview, ImageID(10))
          EndIf;}
          
        Case #Btn_CopyAsBin;{
            c = Asc(GetGadgetText(#TxtCopie))
            
            If GetGadgetState(#Chk_InsertChr) = 1
              Res$ = "chr(%" + Bin(c) + ")"
            Else
              Res$ = "%" + Bin(c)
            EndIf
            
            If GetGadgetState(#Chk_Japbe) = 0
              SetClipboardText(Res$)
            Else
              SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
            EndIf;}
          
        Case #Btn_CopyAsChar;{
            If GetGadgetState(#Chk_InsertChr) = 1
              Res$ = "Chr('"+ GetGadgetText(#TxtCopie) + "')"
            Else
              Res$ = "'"+GetGadgetText(#TxtCopie)+"'"
            EndIf
            
            If GetGadgetState(#Chk_Japbe) = 0
              SetClipboardText(Res$)
            Else
              SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
            EndIf;}
          
        Case #Btn_CopyAsDec;{
            c = Asc(GetGadgetText(#TxtCopie))
            
            If GetGadgetState(#Chk_InsertChr) = 1
              Res$ = "chr("+Str(c)+")"
            Else
              Res$ =Str(c)
            EndIf
            
            If GetGadgetState(#Chk_Japbe) = 0
              SetClipboardText(Res$)
            Else
              SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
            EndIf;}
          
        Case #Btn_CopyAsHex;{
            c = Asc(GetGadgetText(#TxtCopie))
            
            If GetGadgetState(#Chk_InsertChr) = 1
              Res$ = "chr($"+Hex(c)+")"
            Else
              Res$ = "$"+Hex(c)
            EndIf
            
            If GetGadgetState(#Chk_Japbe) = 0
              SetClipboardText(Res$)
            Else
              SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
            EndIf;}
          
        Case #Btn_CopyAsString;{
            Res$ = Chr(34) + GetGadgetText(#TxtCopie) + Chr(34)
            
            If GetGadgetState(#Chk_Japbe) = 0
              SetClipboardText(Res$)
            Else
              SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
            EndIf;}
            
          Case #Btn_CopyAsCar;{
            Res$ = GetGadgetText(#TxtCopie)
            
            If GetGadgetState(#Chk_Japbe) = 0
              SetClipboardText(Res$)
            Else
              SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
            EndIf;}
            
        Case #Btn_Erase;{
          SetGadgetText(#TxtCopie, "");}
          
        Case #Chk_Sticky;{
          StickyWindow(#Win_Main, GetGadgetState(#Chk_Sticky));}
          
      EndSelect;}
      
    Case #PB_Event_CloseWindow;{
      CreatePreferences("CharMap.pref")
      WritePreferenceLong("IdFont", GetGadgetState(#Cmb_Fonts))
      WritePreferenceLong("OnTop", GetGadgetState(#Chk_Sticky))
      WritePreferenceLong("AddChr", GetGadgetState(#Chk_InsertChr))
      WritePreferenceLong("Japbe", GetGadgetState(#Chk_Japbe))
      ClosePreferences()
      
      Quit =#True;}
      
  EndSelect;}
Until Quit;}

End;}

;{- Datas

DataSection
CommandChar:
Data.s "NUL - Null","SOH - Start Of Header", "STX - Start Of Text", "ETX - End Of Text", "EOT - End Of Transmission", "ENQ - Enquiry", "ACK - Acknowledge", "BEL - Bell"
Data.s "BS - BackSpace", "HT - Horizontal Tab", "LF - Line Feed", "VT - Vertical Tab", "FF - Form Feed", "CR - Carriage Return", "SO - Shift Out", "SI - Shift In", "DLE - Data Link Escape"
Data.s "DC1 - (XON) Device Control 1", "DC2 - Device Control 2", "DC3 - (XOFF) Device Control 3", "DC4 - Device Control 4", "NAK - Negative Acknowledge", "SYN - Synchronous IDLE"
Data.s "ETB - End of Trans. Block", "CAN - Cancel", "EM - End of Medium", "SUB - Substitute", "ESC - Escape", "FS - File Separator", "GS - Group Separator"
Data.s "RS - Request to Send", "US - Unit Separator", "SP - Space"
EndDataSection;}


; IDE Options = PureBasic Visual Designer v4.0 Alpha 15 build 651
; VD_UsePB_Any = 0
; VD_IncludeBinaryBitmaps = 1
; VD_IncludeXPskins = 0
Dernière modification par Chris le dim. 02/sept./2007 11:35, modifié 1 fois.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

sympatoche
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Vi c'est bien fichu ça
merci bien !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Du bon boulot 8)
Un nouvel outil a mettre dans notre caisse :wink:

Merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

comment integrer cette oeuvre d'art dans Japbe ??

faudrai en parler a Gnozal, je pense qu'il ne verrai pas d'inconvénients a le mettre dans JAPBE au Packtage (a la place de l'autre ):D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Qui est LE createur de Japbe ?
J'entend pas mal de nom, je sais que GNOZAL est dedans, mais c'est pas vraiment clair.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Kwai chang caine a écrit :Qui est LE createur de Japbe ?
J'entend pas mal de nom, je sais que GNOZAL est dedans, mais c'est pas vraiment clair.
c'est pourtant ecris dedans !! menu "aide"--->"a propos"

la réponse est G P I(Original version)
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Kwai chang caine a écrit :Qui est LE createur de Japbe ?
J'entend pas mal de nom, je sais que GNOZAL est dedans, mais c'est pas vraiment clair.
- GPI a créé jaPBe et s'en est occupé jusqu'à la version 2 (pour PB3.93) ; puis il a commencé à jouer à WOW et a disparu ...
- jaPBe est resté compatible avec PB3.94, mais quand PB4.00 est arrivé, çà ne fonctionnait plus
- J'ai repris jaPBe à ce moment là (c'est le seul éditeur que j'utilise), ajouté quelques fonctions dont la compatiblité avec PB4.00.
- Puis PB4.10 beta est arrivé, à nouveau jaPBe était incompatible, j'ai donc (re)mis à jour jaPBe pour être compatible avec le nouveau système de communication avec le compilateur

A propos de l'afficheur de tables ASCII, la différence essentielle c'est la taille du caractère affiché ? C'est du beau travail mais j'avoue que j'aime bien la version de GPI.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

gnozal a écrit : A propos de l'afficheur de tables ASCII, la différence essentielle c'est la taille du caractère affiché ? C'est du beau travail mais j'avoue que j'aime bien la version de GPI.

ben oui, mais alors faudrai peut etre trouver un moyen de pouvoir facilement
le remplacer, ou bien l'ajouter a la liste , bref virer la "protection"
qui aujourd'hui empeche le remplacement d'un outils présent :)
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Dobro a écrit :
gnozal a écrit : A propos de l'afficheur de tables ASCII, la différence essentielle c'est la taille du caractère affiché ? C'est du beau travail mais j'avoue que j'aime bien la version de GPI.
ben oui, mais alors faudrai peut etre trouver un moyen de pouvoir facilement
le remplacer, ou bien l'ajouter a la liste , bref virer la "protection"
qui aujourd'hui empeche le remplacement d'un outils présent :)
Il n'y a pas de protection, simplement la table ASCII est un outil interne, qu'on ne peut pas supprimer, par opposition aux plugins externes qui sont des fichiers séparés.
Mais tu peux la rendre invisible (bouton '(In)visible') et donc elle n'apparaîtra plus dans le menu 'Outils'.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Merci Gnozal :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci beaucoup GNOZAL pour l'historique de japbe 8)
Bonne journée a toi
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Bon. je crois que j'ai réussi à faire un plugin pour jaPBe avec cette appli. En tout cas, chez moi, ça fonctionne.

Si quelqu'un voulait tester, ce serait sympa.

D'abord, il faut enregistrer ce code sous "Charmap.pbi"

Code : Tout sélectionner

;{- Image vide 
CreateImage(10, 255, 250) 
StartDrawing(ImageOutput(10)) 
Box(0, 0, 255, 250, $FFFFFF) 
StopDrawing() 
;}

;{- Initialisation 
jaPBe_EnablejaPBe()

GetFont_Info() : SortList(Fontes(), 2) 
OpenPreferences("CharMap.pref") 
CmbState = ReadPreferenceLong("IdFont", 19) 
StickyState = ReadPreferenceLong("OnTop", 1) 
ChrState = ReadPreferenceLong("AddChr", 0) 
JapbeState = ReadPreferenceLong("Japbe", 1) 
ClosePreferences() 

SelectElement(Fontes(), CmbState) : LoadFont(0, Fontes(), 9) : LoadFont(1, Fontes(), 140) : LoadFont(2, "Courier New", 10, #PB_Font_Bold) 

Restore CommandChar 
For i = 0 To 32 
  Read CommanChars(i) 
Next 

If Open_Window_0() 
  ForEach Fontes() 
    AddGadgetItem(#Cmb_Fonts, -1, Fontes()) 
  Next 
  
  SetGadgetState(#Cmb_Fonts, CmbState) 
  SetGadgetState(#Chk_Sticky, StickyState) 
  SetGadgetState(#Chk_InsertChr, ChrState) 
  SetGadgetState(#Chk_Japbe, JapbeState) 
  
  StickyWindow(#Win_Main, GetGadgetState(#Chk_Sticky)) 
  
  SetWindowCallback(@WinCallback()) 
Else 
  End 
EndIf 

UpdateTexts() 

If FindWindow_("WindowClass_7", "jaPBe V3") 
  DisableGadget(#Chk_Japbe, 0) 
Else 
  DisableGadget(#Chk_Japbe, 1) 
  SetGadgetState(#Chk_Japbe, 0) 
EndIf 
;} 

;{- Boucle 
Repeat;{ 
  GetCursorPos_(CurPos) 
  HObjet = WindowFromPoint_(CurPos\x, CurPos\y) : IDWindow = GetWindowLong_(HObjet, #GWL_ID) 
  
  If IDWindow >= 1000 
    If IDWindow >= 1000 And IDWindow <=1032 
      c = IDWindow - 1000 
      Ms1$ = CommanChars(IDWindow - 1000) + "     " 
      Ms2$ = "Ascii = " + RSet(Str(c), 3, "0") + "     " 
      Ms3$ = "Hex = $" + RSet(Hex(c), 2, "0") + "     " 
      Ms4$ = "Bin = %" + RSet(Bin(c), 8, "0") 
      SetGadgetText(#Txt_Result, Ms1$ + Ms2$ + Ms3$ + Ms4$) 
      SetGadgetState(#Img_Preview, ImageID(10)) 
    Else 
      SelectElement(Texts(), IDWindow - 1000) 
      C$ = GetGadgetText(Texts()) : c = Asc(C$) 
      Ms1$ = "Car. = " + RSet(C$, 1, " ") + "     " 
      Ms2$ = "Ascii = " + RSet(Str(c), 3, "0") + "     " 
      Ms3$ = "Hex = $" + RSet(Hex(c), 2, "0") + "     " 
      Ms4$ = "Bin = %" + RSet(Bin(c), 8, "0") 
      SetGadgetText(#Txt_Result, Ms1$ + Ms2$ + Ms3$ + Ms4$) 
      Create_Image(GetGadgetText(Texts())) 
    EndIf 
  EndIf 
  
  Select WaitWindowEvent();{ 
    Case #PB_Event_Gadget 
      
      Select EventGadget();{ 
        
        Case #Cmb_Fonts;{ 
          If EventType() = #CBN_SELCHANGE 
            SelectElement(Fontes(), GetGadgetState(#Cmb_Fonts)) 
            LoadFont(0, Fontes(), 9) : LoadFont(1, Fontes(), 140) 
            UpdateTexts() 
            SetGadgetState(#Img_Preview, ImageID(10)) 
          EndIf;} 
          
        Case #Btn_CopyAsBin;{ 
          c = Asc(GetGadgetText(#TxtCopie)) 
          
          If GetGadgetState(#Chk_InsertChr) = 1 
            Res$ = "chr(%" + Bin(c) + ")" 
          Else 
            Res$ = "%" + Bin(c) 
          EndIf 
          
          If GetGadgetState(#Chk_Japbe) = 0 
            SetClipboardText(Res$) 
          Else 
            SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText) 
          EndIf;} 
          
        Case #Btn_CopyAsChar;{ 
          If GetGadgetState(#Chk_InsertChr) = 1 
            Res$ = "Chr('"+ GetGadgetText(#TxtCopie) + "')" 
          Else 
            Res$ = "'"+GetGadgetText(#TxtCopie)+"'" 
          EndIf 
          
          If GetGadgetState(#Chk_Japbe) = 0 
            SetClipboardText(Res$) 
          Else 
            SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
          EndIf;} 
          
        Case #Btn_CopyAsDec;{ 
          c = Asc(GetGadgetText(#TxtCopie)) 
          
          If GetGadgetState(#Chk_InsertChr) = 1 
            Res$ = "chr("+Str(c)+")" 
          Else 
            Res$ =Str(c) 
          EndIf 
          
          If GetGadgetState(#Chk_Japbe) = 0 
            SetClipboardText(Res$) 
          Else 
            SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
          EndIf;} 
          
        Case #Btn_CopyAsHex;{ 
          c = Asc(GetGadgetText(#TxtCopie)) 
          
          If GetGadgetState(#Chk_InsertChr) = 1 
            Res$ = "chr($"+Hex(c)+")" 
          Else 
            Res$ = "$"+Hex(c) 
          EndIf 
          
          If GetGadgetState(#Chk_Japbe) = 0 
            SetClipboardText(Res$) 
          Else 
            SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
          EndIf;} 
          
        Case #Btn_CopyAsString;{ 
          Res$ = Chr(34) + GetGadgetText(#TxtCopie) + Chr(34) 
          
          If GetGadgetState(#Chk_Japbe) = 0 
            SetClipboardText(Res$) 
          Else 
            SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
          EndIf;} 
          
        Case #Btn_CopyAsCar;{ 
          Res$ = GetGadgetText(#TxtCopie) 
          
          If GetGadgetState(#Chk_Japbe) = 0 
            SetClipboardText(Res$) 
          Else 
            SendDatasToEditor(WindowID(#Win_Main), Res$, #WMCD_InsertText)
          EndIf;} 
          
        Case #Btn_Erase;{ 
          SetGadgetText(#TxtCopie, "");} 
          
        Case #Chk_Sticky;{ 
          StickyWindow(#Win_Main, GetGadgetState(#Chk_Sticky));} 
          
      EndSelect;} 
      
    Case #PB_Event_CloseWindow;{ 
      CreatePreferences("CharMap.pref") 
      WritePreferenceLong("IdFont", GetGadgetState(#Cmb_Fonts)) 
      WritePreferenceLong("OnTop", GetGadgetState(#Chk_Sticky)) 
      WritePreferenceLong("AddChr", GetGadgetState(#Chk_InsertChr)) 
      WritePreferenceLong("Japbe", GetGadgetState(#Chk_Japbe)) 
      ClosePreferences() 
      
      Quit =#True;} 
      
  EndSelect;} 
Until Quit;} 

End;} 

;{- Datas 

DataSection 
CommandChar: 
Data.s "NUL - Null","SOH - Start Of Header", "STX - Start Of Text", "ETX - End Of Text", "EOT - End Of Transmission", "ENQ - Enquiry", "ACK - Acknowledge", "BEL - Bell" 
Data.s "BS - BackSpace", "HT - Horizontal Tab", "LF - Line Feed", "VT - Vertical Tab", "FF - Form Feed", "CR - Carriage Return", "SO - Shift Out", "SI - Shift In", "DLE - Data Link Escape" 
Data.s "DC1 - (XON) Device Control 1", "DC2 - Device Control 2", "DC3 - (XOFF) Device Control 3", "DC4 - Device Control 4", "NAK - Negative Acknowledge", "SYN - Synchronous IDLE" 
Data.s "ETB - End of Trans. Block", "CAN - Cancel", "EM - End of Medium", "SUB - Substitute", "ESC - Escape", "FS - File Separator", "GS - Group Separator" 
Data.s "RS - Request to Send", "US - Unit Separator", "SP - Space" 
EndDataSection;} 
Ensuite, dans le dossier de jaPBe, il doit y avoir un répertoire "\Sources\Plugin" qui contient un fichier nommé "Base.pb".

Faites en une copie que vous appelez comme vous voulez.

Tout en haut de ce fichier, vous collez le code qui suit.

Code : Tout sélectionner

;{/ ************************** Début de la partie "Charmap *******************************

;{- Constantes de programme "Charmap"
Enumeration 
  #Win_Main 
EndEnumeration 

Enumeration 
  #Cmb_Fonts 
  #Img_Preview 
  #Txt_Result 
  #TxtCopie 
  #Chk_Japbe 
  #Chk_InsertChr 
  #Chk_Sticky 
  
  #Btn_CopyAsString 
  #Btn_CopyAsChar 
  #Btn_CopyAsHex 
  #Btn_CopyAsBin 
  #Btn_CopyAsDec 
  #Btn_CopyAsCar 
  #Btn_Erase 
EndEnumeration 

#STN_CLICKED     = 0 
#WMCD_InsertText = 2 
;}

;{- Variables, Listes tableaux du programme "Charmap"
Global NewList Fontes.s() 
Global NewList Texts.l() 
Global CurPos.POINT 
Global Dim CommanChars.s(32) 
;}

;{- Procédures du programme "Charmap"
Procedure Open_Window_0() 
  x_Text = 270 : y_Text = 5 : IdTxt = 1000 
  
  If OpenWindow(#Win_Main, 5, 5, 655, 385, "Table des caractères",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar ) 
    If CreateGadgetList(WindowID(#Win_Main)) 
      ImageGadget(#Img_Preview, 5, 30, 255, 250, ImageID(10), #PB_Image_Border) 
      ComboBoxGadget(#Cmb_Fonts, 5, 5, 260, 200) 
      TextGadget(#Txt_Result, 5, 290, 645, 25, "", #PB_Text_Center | #PB_Text_Border | #SS_NOPREFIX) 
      SetGadgetFont(#Txt_Result, FontID(2)) 
      
      TextGadget(#TxtCopie, 5, 320, 100, 25, "", #PB_Text_Center | #PB_Text_Border | #SS_NOPREFIX) 
      SetGadgetFont(#TxtCopie, FontID(2)) 
      
      CheckBoxGadget(#Chk_Sticky, 330, 320, 100, 25, "Toujours devant") 
      CheckBoxGadget(#Chk_InsertChr, 435, 320, 100, 25, "Ajouter le ''Chr()''") 
      CheckBoxGadget(#Chk_Japbe, 540, 320, 150, 25, "Copier dans JaPBe") 
      
      ButtonGadget(#Btn_CopyAsDec, 5, 355, 80, 25, "Décimal") 
      ButtonGadget(#Btn_CopyAsChar, 85, 355, 80, 25, "Char") 
      ButtonGadget(#Btn_CopyAsBin, 165, 355, 80, 25, "Binaire") 
      ButtonGadget(#Btn_CopyAsHex, 245, 355, 80, 25, "Hexadécimal") 
      ButtonGadget(#Btn_CopyAsString, 325, 355, 80, 25, "Chaine") 
      ; ButtonGadget(#Btn_CopyAsCar, 405, 355, 80, 25, "Caractère") 
      ButtonGadget(#Btn_Erase, 560, 355, 80, 25, "Effacer") 
      
      For i = 0 To 255 
        AddElement(Texts()) 
        TextGadget(IdTxt, x_Text, y_Text, 20, 20, "", #PB_Text_Center | #PB_Text_Border | #SS_NOTIFY | #SS_NOPREFIX) 
        
        Texts() = IdTxt : IdTxt + 1 
        x_Text + 20 : If x_Text > 640 : x_Text = 270 : y_Text + 20 : EndIf 
        SetGadgetFont(Texts(), FontID(0)) 
      Next 
      
    EndIf 
    
    ProcedureReturn #True 
  Else 
    ProcedureReturn #False 
  EndIf 
EndProcedure 

Procedure EnumFontProc(*lpelf.ENUMLOGFONT, *lpntm.NEWTEXTMETRIC, FontType, lParam) 
  FnN$ = PeekS(@*lpelf\elfLogFont\lfFaceName[0]) 
  
  AddElement(Fontes()) 
  Fontes() = FnN$ 
  ProcedureReturn #True 
EndProcedure 

Procedure GetFont_Info() 
  hdc = GetDC_(GetDesktopWindow_()) 
  EnumFontFamilies_(hdc, 0, @EnumFontProc(),0) 
  ReleaseDC_ (GetDesktopWindow_(), hdc) 
EndProcedure 

Procedure UpdateTexts() 
  ForEach Texts() 
    i = ListIndex(Texts()) 
    
    SetGadgetFont(Texts(), FontID(0)) 
    SetGadgetText(Texts(), Chr(i)) 
  Next 
EndProcedure 

Procedure Hi_Word(Long) 
  ProcedureReturn (Long >>16) & $FFFF 
EndProcedure 

Procedure WinCallback(Hwn, Msge, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents 
  Select Msge 
    Case #WM_COMMAND 
      If Hi_Word(wParam) = #STN_CLICKED 
        ForEach Texts() 
          If GadgetID(Texts()) = lParam 
            SetGadgetText(#TxtCopie, GetGadgetText(Texts())) 
            
            If Texts() >= 1000 And Texts() <= 1031 
              DisableGadget(#Btn_CopyAsChar, 1) 
            Else 
              DisableGadget(#Btn_CopyAsChar, 0) 
            EndIf 
            
          EndIf 
        Next 
      EndIf 
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure 

Procedure Create_Image(Lettre.s) 
  If CreateImage(0, 255, 250) 
    StartDrawing(ImageOutput(0)) 
    DrawingMode(1) : DrawingFont(FontID(1)) 
    W_Lettre = TextWidth(Lettre) : H_Lettre = TextHeight(Lettre) 
    Box(0, 0, 255, 250, $FFFFFF) 
    DrawText(128 - W_Lettre/2, 128 - H_Lettre / 2, Lettre) 
    StopDrawing() 
    
    SetGadgetState(#Img_Preview, ImageID(0)) 
  EndIf 
  
EndProcedure 

Procedure SendDatasToEditor(MainWin, Datas$, Mode.l) 
  RunOneWin = FindWindow_(@"WindowClass_0",@"jaPBe-RunOneWindow") 
  If RunOneWin 
    If Datas$ 
      cd.COPYDATASTRUCT 
      cd\dwData = Mode 
      cd\cbData = Len(Datas$)+1 
      cd\lpData = @Datas$ 
      SendMessage_(RunOneWin, #WM_COPYDATA, MainWin, cd)  
    EndIf 
  EndIf 
EndProcedure 
;} 

;}/ ******************************* Fin de la partie "CharMap" *************************************
En bas de ce fichier, il y a une ligne ";- here is space for your plugin".

Vous collez la commande suivante.

Code : Tout sélectionner

    XIncludeFile "Charmap.pbi"
Vous faites un exe avec tout ça, et vous le mettez dans le repertoire "Plugins" de jaPBe, vous relancez jaPBe, et il devrait apparaitre comme "Charmap Plugin" dans la liste des plugins.

Voilà.

Par contre, il y a deux questions que je me pose.

1 - Dans mon programme, il y avait une callback. Je l'ai laissée. Est-ce que ça pose un problème, ou bien est-ce qu'il faut utiliser la callback du fichier "base.pb"?

2 - La procédure qui sert à copier le caractère dans l'éditeur de jaPBe (SendDatasToEditor()) est restée aussi. Dans le fichier "base.pb", il y a deux procédures qui lui ressemblent. Est-ce qu'il faut les utiliser?

Bref. si quelqu'un se sent le courage de tester, et si Gnozal passe par là pour répondre à mes deux questions.... :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bon ça marche !!

pour l'ensemble et pour ceux que cela interresse
récuperez ceci

http://michel.dobro.free.fr/Forum_PB/charmap.zip

décompressez l'archive et mettez "charmap.exe" dans le dossier plugin de japbe , et voila grace a Chris on a un superbe visualisateur de code ascii :D


ps : pas besoin du pbi, je l'ai intégré dans le prg ! :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'ai fait un ".pbi" parce que c'est plus simple pour le mettre dans le forum. Ca évite de coller 800 lignes de code. (600 pour le plugin, et 200 pour mon code).

Il y a eu des modifs, depuis tout à l'heure, j'ai la réponse à mes deux questions.

1 - On peut utiliser la callback du fichier plugin. Il faut donc virer l'autre, et coller ce qu'il y a dedans dans la callback du fichier "base.pb"

Code : Tout sélectionner

  ;- Partie "CharMap" de la callback *************
  If message = #WM_COMMAND And WindowId = WindowID(#Win_Main)
    If Hi_Word(wParam) = #STN_CLICKED 
      ForEach Texts() 
        If GadgetID(Texts()) = lParam 
          SetGadgetText(#TxtCopie, GetGadgetText(Texts())) 
          
          If Texts() >= 1000 And Texts() <= 1031 
            DisableGadget(#Btn_CopyAsChar, 1) 
          Else 
            DisableGadget(#Btn_CopyAsChar, 0) 
          EndIf 
          
        EndIf 
      Next 
    EndIf 
  EndIf
  ;- Fin de la partie "CharMap **************
2 - Il existe une fonction tout prète pour copier du texte dans l'éditeur, à la position du curseur.
Il faut donc supprimer la procédure "SendDataToEditor", et dans les évènement des gadgets qui l'appellent, il faut mettre

Code : Tout sélectionner

jaPBe_InsertTextS(Res$)
Répondre