si vous trouvezz par exemple qu'il ne dis pas bien une lettre par exemple "on Vera"
si vous voulez faire ressortir le "RRA" , il suffit d'ecrire plusieurs fois la lettre
ps: Nono met un certain temps a se mettre en route, patientez un peut (surtout en mode Debugger ON ) apres avoir cliqué sur le bouton "Lire"
Code : Tout sélectionner
;***********************************************
;Titre :*editeur_nono
;Auteur : Zorro
;Date :19/10/2017
;Heure :14:39:47
;Version Purebasic : PureBasic 5.60 (Windows - x86)
;Version de l'editeur :EPB V2.68
; Libairies necessaire : Aucune
;***********************************************
; v pb 4.10
; cet éditeur permet de tester la Dll de Nono
; il permet aussi de coder/décoder un message
; et aussi de cacher un message dans une image BMP
;- Window Constants
;
Import "nono.lib"
nono(phrase.s,panoramique,Frequence,vitesse,tete)
Endimport
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#Editor_0
#lire
#clipboard
#nettoie
#chekbox
#Police
#couleur
#sauve
#charge
#message
#code
#sauve_image
#charge_image
#compile_prog
EndEnumeration
;{; code a Nico pour lancer le program qu'une seul fois !!
#MUTEX_ALL_ACCESS = $1F0001
Application.s="Nono éditeur by Dobro (michel.dobro@free.fr)"
If SetForegroundWindow_(FindWindow_(#Null,Application.s))<> 0
End
EndIf
;}
;{ ; Initialisation
Declare wndProc(WindowID, message, wParam, lParam)
Declare SaveContent(ThisFileName.s)
Declare.s code(sortie$, Password.s)
Global fonte$, taille_fonte.w, Couleur_fonte.l, fichiersav
NewList oc.l() ; ceci sert pour ranger dedans les données de l'image (les pixels)
InitSprite()
file_existe = FileSize("configediteurnono.ini")
If file_existe =-1
fonte$="arial"
taille_fonte.w=14
Couleur_fonte.l=0
Goto azerty
EndIf
handl_fichier = OpenFile(#PB_Any ,"configediteurnono.ini")
fonte$=ReadString(handl_fichier )
taille_fonte.w=ReadWord( handl_fichier )
Couleur_fonte.l=ReadLong(handl_fichier )
CloseFile( handl_fichier)
If handl_fichier =0
fonte$="arial"
taille_fonte.w=14
Couleur_fonte.l=0
EndIf
azerty:
LoadFont(#Police, fonte$, taille_fonte.w, #PB_Font_HighQuality )
; UseFont(#Police)
;} ; fin initialisation
Procedure Open_Window_0() ; creer une fenetre avec les gadgets !!
hauteur=400
If OpenWindow(#Window_0, 233, 50, 610, hauteur, "Nono éditeur by Dobro " ,#PB_Window_SystemMenu | #PB_Window_SizeGadget |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget | #PB_Window_TitleBar )
; WindowID = WindowID(#Window_0)
; SetWindowCallback(@wndProc()) ; callback
;If CreateGadgetList(WindowID(#Window_0))
SetGadgetFont(#PB_Default, LoadFont(#Police,fonte$, taille_fonte, #PB_Font_HighQuality ) ) ; Change la valeur de la police pour les gadgets.
handle_editor=EditorGadget(#Editor_0, 2, 50, 606, hauteur-70) ;#PB_Container_Raised
; ****couleur des charactere de l'éditeur****
couleur_text=Couleur_fonte
format.CHARFORMAT\cbSize = SizeOf(CHARFORMAT) ; Prépare les attributs de couleur dans la structure appropriée pour envoyer les informations au gadget.
format\dwMask = #CFM_COLOR ; Constante API. Le membre crTextColor et la valeur #CFE_AUTOCOLOR du membre dwEffects sont valides.
format\crTextColor = couleur_text ; Couleur du texte. Ce membre est ignoré si #CFE_AUTOCOLOR est spécifié. Met à jour la police après appel du FontRequester.
SendMessage_(handle_editor, #EM_SETCHARFORMAT, 0, @format) ; Envoie l'information de couleur pour le gadget. Appel API.
; ************************************************
SetGadgetFont(#PB_Default, LoadFont(#Police, "arial", 8, #PB_Font_HighQuality ) ) ; Change la valeur de la police pour les gadgets.
Debug GetCurrentDirectory()+"nono.dll"
if FileSize("nono.dll")<>-1
librairie=1
Else
librairie=0
Endif
If librairie<>0 ; ouvre nono si la phrase est supérieur a 1
startbouttonlire=10
startbouttonclip=startbouttonlire+90
startbouttonvide=startbouttonvide+210
startbouttonchec=startbouttonlire+310
ButtonGadget(#lire, startbouttonlire, 10, 80, 30, "Lire")
ButtonGadget(#clipboard, startbouttonclip, 10, 100, 30, "Lire le press papier")
ButtonGadget(#nettoie, startbouttonvide, 10, 100, 30, "vider l'éditeur")
CheckBoxGadget(#chekbox, startbouttonchec, 10,50, 20, "Nono",#PB_CheckBox_Right ) :SetGadgetState(#chekbox,1)
Else
nono_absent=1 ; nono n'est pas actif
startbouttonvide=10
startbouttonchec=startbouttonlire+90
ButtonGadget(#nettoie, startbouttonvide, 10, 100, 30, "vider l'éditeur")
Resultat = TextGadget(#message, startbouttonvide+210, 10, 100, 30, " la DLL Nono n'est pas présente !",#PB_Text_Center )
EndIf
ButtonGadget(#sauve, 110, WindowHeight(#Window_0) - 20, 100, 20, "sauve text")
ButtonGadget(#charge, 10, WindowHeight(#Window_0) - 20, 100, 20, "charge text")
ButtonGadget(#code, WindowWidth(#Window_0) -110, WindowHeight(#Window_0) - 20, 100, 20, "code/décode")
ButtonGadget(#sauve_image, WindowWidth(#Window_0) -380, WindowHeight(#Window_0) - 20, 150, 20, "sauve dans une image")
ButtonGadget(#charge_image, WindowWidth(#Window_0) -220, WindowHeight(#Window_0) - 20, 100, 20, "charge d'une image")
ButtonGadget(#couleur, 500, 10, 100, 30, "couleur et fonte")
;EndIf
EndIf
EndProcedure
Open_Window_0() ; on ouvre la fenetre
Repeat ; boucle principale
;{ ; boucle principale
eventi = WaitWindowEvent()
If eventi= #WM_SIZING
Debug "c'est cool"
ResizeGadget( #Editor_0, 2,50, WindowWidth(#Window_0) - 4, WindowHeight(#Window_0) - 80) ; Modifie la taille du gadget.
;UpdateWindow_(WindowID)
EndIf
If eventi = #PB_Event_Gadget
;Debug "WindowID: " + Str(EventWindowID())
GadgetID = EventGadget()
Select GadgetID
Case #Editor_0
Case #lire
;{ ; Lire
phrase.s = GetGadgetText(#Editor_0) ; récupere le contenu du l'editeur
If Len(phrase.s)>0 ; ouvre nono si la phrase est supérieur a 1
;************************
panoramique=100:; le son sera sur les 2 haut-parleurs (0 tout a gauche) (255 tout a droite)
tete_active= GetGadgetState( #chekbox )
If tete_active=1
tete=0; on montre la tete
Else
tete=1; on cache la tete
EndIf
Result=nono(phrase.s,panoramique,11,70,0) ;appel la dll et lui passe la phrase a dire
; If Result=13
; MessageRequester("Dobro"," sortie reussi ", #PB_MessageRequester_Ok )
; EndIf
Else
If nono_absent=0 ; nono est actif
nono( "il n'y a rien na lire" ,100,11,70,1) ;appel la dll et lui passe la phrase a dire
EndIf
MessageRequester("Erreur"," il n'y a rien a lire ", #PB_MessageRequester_Ok )
EndIf
;}
Case #clipboard
;{ ; Clipboard
phrase.s = GetClipboardText()
; librairie=OpenLibrary(0, GetCurrentDirectory()+"nono.dll")
If Len(phrase.s)>0 ; ouvre nono si la phrase est superieur a 1
;************************
panoramique=100 :; le son sera sur les 2 haut-parleurs (0 tout a gauche) (200 tout a droite)
tete_active= GetGadgetState( #chekbox )
If tete_active=1
tete=0; on montre la tete
Else
tete=1; on cache la tete
EndIf
nono( phrase.s,100,11,70,1) ;appel la dll et lui passe la phrase a dire
; CallFunction(0, "nono", "/.",Frequence,panoramique) ;appel la dll et lui passe la phrase a dire
; SetGadgetText(#Editor_0, "")
Else
; Global librairie=OpenLibrary(0,GetCurrentDirectory()+ "nono.dll")
nono( " il n'y a rien a lire" ,100,11,70,1) ;appel la dll et lui passe la phrase a dire
; MessageRequester("Erreur"," il n'y a rien a lire", #PB_MessageRequester_Ok )
EndIf
;}
Case #nettoie
ClearGadgetItemList(#Editor_0)
Case #chekbox
tete_active= GetGadgetState( #chekbox )
Case#couleur
;{ ;couleur
Texte_sauve$ = GetGadgetText(#Editor_0) ; on met le contenu de l'éditeur dans un buffer
Debug "couleur"
Result = FontRequester("arial", 12, #PB_FontRequester_Effects)
fonte$=SelectedFontName() :Debug fonte$
taille_fonte.w=SelectedFontSize() :Debug taille_fonte
Couleur_fonte.l= SelectedFontColor() :Debug Couleur_fonte
handl_fichier = OpenFile(#PB_Any ,"configediteurnono.ini")
WriteStringN(handl_fichier, fonte$)
WriteWord( handl_fichier, taille_fonte.w)
WriteLong( handl_fichier,Couleur_fonte.l)
CloseFile ( handl_fichier)
; *************redessine les gadget avec les nouveau parrametre de fonte et de couleur****************
SetGadgetFont(#PB_Default, LoadFont(#Police,fonte$, taille_fonte, #PB_Font_HighQuality ) ) ; Change la valeur de la police pour les gadgets.
; ****couleur des charactere de l'éditeur****
handle_editor=EditorGadget(#Editor_0, 2, 50, 606, hauteur-70,#PB_Container_Raised)
couleur_text=Couleur_fonte
format.CHARFORMAT\cbSize = SizeOf(CHARFORMAT) ; Prépare les attributs de couleur dans la structure appropriée pour envoyer les informations au gadget.
format\dwMask = #CFM_COLOR ; Constante API. Le membre crTextColor et la valeur #CFE_AUTOCOLOR du membre dwEffects sont valides.
format\crTextColor = couleur_text ; Couleur du texte. Ce membre est ignoré si #CFE_AUTOCOLOR est spécifié. Met à jour la police après appel du FontRequester.
SendMessage_(handle_editor, #EM_SETCHARFORMAT, 0, @format) ; Envoie l'information de couleur pour le gadget. Appel API.
wndProc(WindowID, #WM_SIZING, wParam, lParam) ; force le redessin en faisant croire a un redimentionnement
; *******************************
; ************************************************
SetGadgetFont(#PB_Default, LoadFont(#Police, "arial", 8, #PB_Font_HighQuality ) ) ; Change la valeur de la police pour les gadgets.
ButtonGadget(#lire, 20, 10, 80, 30, "Lire")
ButtonGadget(#clipboard, 140, 10, 100, 30, "Lire le press papier")
ButtonGadget(#nettoie, 260, 10, 100, 30, "vider l'éditeur")
ButtonGadget(#couleur, 500, 10, 100, 30, "couleur et fonte")
CheckBoxGadget(#chekbox, 380, 10,50, 20, "Nono",#PB_CheckBox_Right ) :SetGadgetState(#chekbox,1)
SetGadgetText(#Editor_0, Texte_sauve$) ; on réécrit le contenu du buffer dans l'éditeur
;}
Case #charge
;{ ; charge
NomFichier$ = OpenFileRequester("Charge un fichier", " ", "Fichiers Textes|*.txt;*.doc", 0 )
file=ReadFile(#PB_Any, NomFichier$)
If file<>0
Repeat
a$ = ReadString(file)
AddGadgetItem(0, NLines, a$)
NLines + 1 ; NLines et NChars sont des variables statistiques, mais servent également à la fonction recherche.
Until Eof(file)
CloseFile(file)
EndIf
;}
Case #sauve
If nono_absent=0 ; nono est actif
; Global librairie=OpenLibrary(0,GetCurrentDirectory()+ "nono.dll")
nono("Choisir le nom du fichier à enregistrer" ,100,11,70,1) ;appel la dll et lui passe la phrase a dire
EndIf
fichier_save$=SaveFileRequester("Choisir le nom du fichier à enregistrer", " ", "*.txt", 0)
SaveContent( fichier_save$)
Case #code
;{ ; code
Texte_sauve2$ = GetGadgetText(#Editor_0) ; on met le contenu de l'éditeur dans un buffer
Pass$ = InputRequester("un mot pour encoder","entrez un mot de pass:","")
If Len( Pass$) >1 And Len( Pass$) <255
; on encode le texte
textacoder$=Texte_sauve2$
Password$=Pass$
result$=code(textacoder$,Password$) ; on code le text
Texte_sauve2$=result$
SetGadgetText(#Editor_0, Texte_sauve2$) ; on réécrit le contenu du buffer Codé ou décodé dans l'éditeur
Else
Resultat = MessageRequester(" erreur ", "le mot de pass doit avoir entre 1et 255 characteres ", #PB_MessageRequester_Ok )
EndIf
su2:
;}
Case #charge_image
;{; charge image
ClearGadgetItemList(#Editor_0)
NLines=0
phrase.s=""
ligne$=""
NomFichier$ = OpenFileRequester("Charge une image BMP", " ", "image|*.bmp", 0 )
file= ReadFile(#PB_Any, NomFichier$)
Signature.w =ReadWord(file)
taille_total_fichier.l=ReadLong(file)
champ_reserve.l=ReadLong(file)
offset_image.l=ReadLong(file)
taille_entete_image.l=ReadLong(file)
largeur_image.l=ReadLong(file)
hauteur_image.l=ReadLong(file)
nombre_de_plan.w=ReadWord(file)
profondeur_encodage.w=ReadWord(file)
methode_de_compression.l=ReadLong(file)
taille_total_image.l=ReadLong(file)
resolution_horiz_metre.l=ReadLong(file)
resolution_vert_metre.l=ReadLong(file)
nombre_de_couleur_palette.l=ReadLong(file)
nombre_de_couleur_import.l=ReadLong(file)
flag1.b=ReadByte(file)
flag2.b=ReadByte(file)
flag3.b=ReadByte(file)
flag4.b=ReadByte(file)
If flag1.b=$64 And flag2=$6F And flag3=$62
Longueur_text= ReadLong(file)
For t=0 To Longueur_text-1 :Debug Longueur_text
a$=Chr( ReadByte(file))
If a$=Chr(10)
AddGadgetItem(0, NLines, "")
Else
ligne$=ligne$+a$
EndIf
Next t
AddGadgetItem(0, NLines, ligne$)
Else
MessageRequester("Erreur"," il n'y a rien a lire"+Chr(10)+" dans cette image", #PB_MessageRequester_Ok )
EndIf
CloseFile( file)
;}
Case #sauve_image
;{; sauve Image
phrase.s = GetGadgetText(#Editor_0) ; récupere le contenu du l'editeur
Longueur_text=Len( phrase.s)
NomFichier$ = SaveFileRequester("sauve dans une image BMP", " ", "image|*.bmp", 0 )
; on lit quelques infos interréssante dans l'image
file= ReadFile(#PB_Any, NomFichier$)
CallDebugger
Signature.w =ReadWord(file)
If Signature.w <>$4D42
MessageRequester("Erreur"," ce n'est pas une image BMP", #PB_MessageRequester_Ok )
CloseFile(file) : Goto dd
EndIf
taille_total_fichier.l=ReadLong(file)
champ_reserve.l=ReadLong(file)
offset_image.l=ReadLong(file)
taille_entete_image.l=ReadLong(file)
largeur_image.l=ReadLong(file)
hauteur_image.l=ReadLong(file)
nombre_de_plan.w=ReadWord(file)
profondeur_encodage.w=ReadWord(file)
methode_de_compression.l=ReadLong(file)
taille_total_image.l=ReadLong(file)
resolution_horiz_metre.l=ReadLong(file)
resolution_vert_metre.l=ReadLong(file)
nombre_de_couleur_palette.l=ReadLong(file)
nombre_de_couleur_import.l=ReadLong(file)
flag1.b=ReadByte(file)
flag2.b=ReadByte(file)
flag3.b=ReadByte(file)
flag4.b=ReadByte(file)
If flag1.b=$64 And flag2=$6F And flag3=$62 ; il y a eu une ecriture dans l'image
anc_longueur_text=ReadLong(file)
result1=MessageRequester("Bouh !"," il y a déja du text dans cette image"+Chr(10)+" on ecrit par dessus ?", #PB_MessageRequester_YesNo )
If result1=6 ; yes
Position_p = Loc(file)
FileSeek( file,offset_image.l) ; on saute a l'image
offset_image.l= offset_image.l-anc_longueur_text ; on change la place de l'image (on la ramene a sa valeur d'origine )
taille_total_fichier.l=taille_total_fichier.l-anc_longueur_text
offset_image.l= offset_image.l+Longueur_text ; on change la place de l'image (on la repousse plus loin de la longueur du message )
taille_total_fichier.l=taille_total_fichier.l+Longueur_text
Else ; no
CloseFile(file) : Goto dd
EndIf
Else ; si il n'y a pas eu d'ecriture precedante (on a une image vierge)
Position_p = Loc(file):Position_p=Position_p-4
FileSeek(file,Position_p) ; on recule la tete de lecture de 4 octets (car les flags que l'on a lu on fait avancer la tete !)
offset_image.l= offset_image.l+Longueur_text+8 ; on change la place de l'image (on la repousse plus loin )
taille_total_fichier.l=taille_total_fichier.l+Longueur_text+8
EndIf
ResetList(oc.l())
Repeat ; lit les données de l'image
AddElement(oc.l())
oc.l()=ReadLong(file)
Until Eof(file)
CloseFile(file)
file= OpenFile(#PB_Any, NomFichier$)
WriteWord(file,Signature.w)
WriteLong(file,taille_total_fichier.l)
WriteLong(file,champ_reserve.l)
WriteLong(file,offset_image.l)
WriteLong(file,taille_entete_image.l)
WriteLong(file,largeur_image.l)
WriteLong(file,hauteur_image.l)
WriteWord(file,nombre_de_plan.w)
WriteWord(file,profondeur_encodage.w)
WriteLong(file,methode_de_compression.l)
WriteLong(file,taille_total_image.l)
WriteLong(file,resolution_horiz_metre.l-16)
WriteLong(file,resolution_vert_metre.l-16)
WriteLong(file,nombre_de_couleur_palette.l)
WriteLong(file,nombre_de_couleur_import.l)
; voila la cause du "offset_image.l+longueur_text+8 "
WriteByte(file,$64)
WriteByte(file,$6F)
WriteByte(file,$62)
WriteByte(file,$FF)
WriteLong(file, Longueur_text) ; on insere la taille tu text
; ************ voila 8 octets ajoutés ***********************
For t=1 To Longueur_text
caractere.b= Asc(Mid(phrase.s, t, 1))
WriteByte( file,caractere.b) ; on insere notre text !! ;-D
Next t
; maintenant on reconstitue le reste du fichier en l'ajoutant a la fin ; l'air de rien :-D
ResetList(oc.l())
While NextElement(oc.l()) ; Process all the elements...
WriteLong(file,oc.l())
Wend
CloseFile(file)
dd:
;}
;#compile_prog ; en cours de developement
EndSelect
EndIf
;}; fin de boucle principale
Until eventi = #PB_Event_CloseWindow ; fin de boucle principale
CloseLibrary(0)
End
; CloseHandle_(Hmutex)
Procedure wndProc(WindowID, message, wParam, lParam)
Resultat = #PB_ProcessPureBasicEvents
Select message
Case #WM_SIZING ; Cet évènement est le redimensionnement de la fenêtre. #WM_SIZE est une constante API.
ResizeGadget(#Editor_0, 2, 50, WindowWidth(#Window_0) - 4, WindowHeight(#Window_0) - 80) ; Modifie la taille du gadget.
ButtonGadget(#sauve, 110, WindowHeight(#Window_0) - 20, 100, 20, "sauve text")
ButtonGadget(#charge, 10, WindowHeight(#Window_0) - 20, 100, 20, "charge text")
ButtonGadget(#sauve_image, WindowWidth(#Window_0) -380, WindowHeight(#Window_0) - 20, 150, 20, "sauve dans une image")
ButtonGadget(#charge_image, WindowWidth(#Window_0) -220, WindowHeight(#Window_0) - 20, 100, 20, "charge d'une image")
ButtonGadget(#code, WindowWidth(#Window_0) -110, WindowHeight(#Window_0) - 20, 100, 20, "code/décode")
UpdateWindow_(WindowID)
Case #PB_Event_SizeWindow
ResizeGadget(#Editor_0, 2, 50, WindowWidth(#Window_0) - 4, WindowHeight(#Window_0) - 80) ; Modifie la taille du gadget.
ButtonGadget(#sauve, 110, WindowHeight(#Window_0) - 20, 100, 20, "sauve text")
ButtonGadget(#charge, 10, WindowHeight(#Window_0) - 20, 100, 20, "charge text")
ButtonGadget(#sauve_image, WindowWidth(#Window_0) -380, WindowHeight(#Window_0) - 20, 150, 20, "sauve dans une image")
ButtonGadget(#charge_image, WindowWidth(#Window_0) -220, WindowHeight(#Window_0) - 20, 100, 20, "charge d'une image")
ButtonGadget(#code, WindowWidth(#Window_0) -110, WindowHeight(#Window_0) - 20, 100, 20, "code/décode")
UpdateWindow_(WindowID)
EndSelect
ProcedureReturn Resultat
EndProcedure
;
Procedure SaveContent(ThisFileName.s) ; Vérifie si le contenu du gadget peut être sauvegardé et effectue la sauvegarde
; on compte les characteres pour pas dépasser 64000 (64kilo par fichier !)
compte$ = GetGadgetText(#Editor_0);
compteur=Len(compte$);
Debug "il y a "+Str(compteur)+" charactere" ;
fichiersav=CreateFile(#PB_Any, ThisFileName.s) ;
If fichiersav<>0 And compteur <= 64000;
WriteString(fichiersav,GetGadgetText(#Editor_0));
CloseFile( fichiersav) ;|
Else
MessageRequester("erreur", "le fichier " + ThisFileName.s + " ne peut être créé ", #PB_MessageRequester_Ok);
EndIf ;
EndProcedure ;
Procedure.s code(sortie$, Password.s)
text.s=sortie$
Password.s=UCase(Password.s)
p=0
long_or = Len(text.s)
long_pass = Len(Password.s)
For i=1 To long_or
p=p+1 : If p= long_pass:p=1:EndIf
car_pass.l=Asc( Mid(Password.s, p, 1)) ; recupere une lettre (son code ascii)du mot de pass
car_text.l= Asc(Mid(text.s, i, 1)) ; recupere une lettre (son code ascii) du text a coder
If car_text.l=car_pass.l
car_pass.l=car_text.l ; echange
car_text.l=254 ; si 254 , c'est le code choisi pour dire que la lettre a coder est egal a
sorti.l=car_pass.l ; la lettre du mot de pass , donc on prend directement cette lettre
Goto su
EndIf
sorti.l= car_pass ! car_text ; un petit XOR
If sorti.l=0 ; si par hazard la lettre du mot de pass est egal a la lettre a coder
sorti.l=254 ; cela donnerai 0 !! donc on force un 254
EndIf
su:
text_sorti.s=text_sorti.s+Chr(sorti)
Next i
text.s= text_sorti.s
text_sorti.s=""
ProcedureReturn text.s
EndProcedure
; Epb