[RESOLU] API et coloration d'un morceau du texte

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

[RESOLU] API et coloration d'un morceau du texte

Message par Progi1984 »

ce code ne fonctionne pas
Le but étant de colorer du premier caractère de la 2eme ligne au 5e caracatère de la 3eme ligne.
Mais il me colorie tout !

Code : Tout sélectionner

ProcedureDLL Editor_ColorTest(Gadget,ydeb,xdeb,yfin,xfin,Color)
  ; Set the Text color for the Selection 
  ; in RGB format 
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_COLOR 
  format\crTextColor = Color  
  
  sel.CHARRANGE
  sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, ydeb, 0) + xdeb - 1 
  
   If yfin = -1 
     yfin = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1 
   EndIf 
  sel\cpMax =SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, yfin, 0) 
  
   If xfin = -1 
     sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0) 
   Else 
     sel\cpMax + xfin - 1 
   EndIf
  Debug sel\cpMin
  Debug sel\cpMax
  
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, sel,format) 
EndProcedure

If OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"EditorGadget") And CreateGadgetList(WindowID(0)) 
    EditorGadget (30,8,8,400,500,#PB_Container_Raised) 
    Editor_Font(30,"Comic Sans MS")
    Editor_FontSize(30,16)
    For a=0 To 5 
      AddGadgetItem(30,a,"Line "+Str(a))
    Next
    Editor_Format(30,0)
    ButtonGadget(2,610,10,150,50,"Changer la Couleur du Texte",#PB_Button_MultiLine)


    Repeat 
      EventID = WaitWindowEvent()
      If EventID = #PB_EventGadget    
        Select EventGadgetID()
          Case 2
            rgb=RGB(Random(255),Random(255),Random(255))
            Editor_ColorTest(30,1,1,2,5,rgb)
            SetGadgetText(2,"Texte (RGB) : "+Str(Red(rgb))+","+Str(Green(rgb))+","+Str(Blue(rgb)))
        EndSelect
      EndIf

   Until EventID=#PB_Event_CloseWindow 
End 
 EndIf 
Dernière modification par Progi1984 le jeu. 05/mai/2005 20:29, modifié 4 fois.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Toujour pas trouvé ? t'inquiete on va trouver ca !

Dri
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Voilas, j'ai commenté ce qu'il n'y allait pas / ce que j'ai rajouté

Code : Tout sélectionner

ProcedureDLL Editor_ColorTest(Gadget,ydeb,xdeb,yfin,xfin,Color)
  ; Set the Text color for the Selection
  ; in RGB format
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_COLOR
  format\crTextColor = Color 
 
  sel.CHARRANGE
  ; on récupere l'ancienne sélection
  oldsel.CHARRANGE
  SendMessage_(GadgetID(Gadget), #EM_GETSEL, @oldsel\cpMin, @oldsel\cpMax)
  sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, ydeb, 0) + xdeb - 1
 
   If yfin = -1
     yfin = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1
   EndIf
  sel\cpMax =SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, yfin, 0)
 
   If xfin = -1
     sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0)
   Else
     sel\cpMax + xfin - 1
   EndIf
  
  ; on sélectionne le text qu'on veux colorer
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, sel\cpMin, sel\cpMax)
  ; wParam attend le mode de formatage, et non la position
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION,@format)
  ; on replace le carret là ou il etait (ou selection si il y en avait une)
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, oldsel\cpMin, oldsel\cpMax)
EndProcedure

If OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"EditorGadget") And CreateGadgetList(WindowID(0))
    EditorGadget (30,8,8,400,500,#PB_Container_Raised)
    ;Editor_Font(30,"Comic Sans MS")
    ;Editor_FontSize(30,16)
    For a=0 To 5
      AddGadgetItem(30,a,"Line "+Str(a))
    Next
    ;Editor_Format(30,0)
    ButtonGadget(2,610,10,150,50,"Changer la Couleur du Texte",#PB_Button_MultiLine)


    Repeat
      EventID = WaitWindowEvent()
      If EventID = #PB_EventGadget   
        Select EventGadgetID()
          Case 2
            rgb=RGB(Random(255),Random(255),Random(255))
            Editor_ColorTest(30,2,1,3,5,rgb)
            SetGadgetText(2,"Texte (RGB) : "+Str(Red(rgb))+","+Str(Green(rgb))+","+Str(Blue(rgb)))
        EndSelect
      EndIf

   Until EventID=#PB_Event_CloseWindow
End
 EndIf
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Merci ! ca marche et c parfait !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Ouais mais non, en fait le probleme c'est que l'on surligne devant l'utilisateur, puis on colorie et on 'enlève ' le surlignage.
Je pense à un truc : on enregistre la ligne en cours dans un autre buffer, on colorie ce que l'on a besoin , puis on met à jour ce qui est à l'écran, comme l'user ne voit rien sur la coloration que l'on fait et il n'y a pas le clinotage du au surlignage !
Mais est ce possible ?
Quelqu'un sait il comment utiliser les buffers ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Quelqu'un aurait il un code pour les buffers de texte ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

regarde les sources de l'éditeur pb...
moi perso j'ai pas compris...

Dri
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Dr. Dri a écrit :regarde les sources de l'éditeur pb...
moi perso j'ai pas compris...

Dri
Comme ca m'intéressait, j'ai aussi jetté un coup d'oeil et c'est du RTF.
Il y a un post qui en parle ici http://purebasic.hmt-forum.com/viewtopic.php?t=2785
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Il faut désactiver l'affichage de la selection (le surlignage), fait ta modif et le remettre a l'aide du msg EM_HIDESELECTION
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

@flaith :Pas bete mais ou avoir les codes RTF ?
(PS : un site en francais si t'avias car MSDN ras le bol ... bah sinon MSDN)

@cederavic : je te comprends pas !
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Un code ça parle toujours mieu :)

Code : Tout sélectionner

ProcedureDLL Editor_ColorTest(Gadget,ydeb,xdeb,yfin,xfin,Color)
  ; Set the Text color for the Selection
  ; in RGB format
  format.CHARFORMAT
  format\cbSize = SizeOf(CHARFORMAT)
  format\dwMask = #CFM_COLOR
  format\crTextColor = Color
 
  sel.CHARRANGE
  ; on récupere l'ancienne sélection
  oldsel.CHARRANGE
  SendMessage_(GadgetID(Gadget), #EM_GETSEL, @oldsel\cpMin, @oldsel\cpMax)
  sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, ydeb, 0) + xdeb - 1
 
   If yfin = -1
     yfin = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1
   EndIf
  sel\cpMax =SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, yfin, 0)
 
   If xfin = -1
     sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0)
   Else
     sel\cpMax + xfin - 1
   EndIf
  
  ; on désactive la sélection
  SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, #TRUE, #NULL)
  ; on sélectionne le text qu'on veux colorer
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, sel\cpMin, sel\cpMax)
  ; wParam attend le mode de formatage, et non la position
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION,@format)
  ; on replace le carret là ou il etait (ou selection si il y en avait une)
  SendMessage_(GadgetID(Gadget), #EM_SETSEL, oldsel\cpMin, oldsel\cpMax)
  ; on active la sélection
  SendMessage_(GadgetID(Gadget), #EM_HIDESELECTION, #FALSE, #NULL)
EndProcedure

If OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"EditorGadget") And CreateGadgetList(WindowID(0))
    EditorGadget (30,8,8,400,500,#PB_Container_Raised)
    ;Editor_Font(30,"Comic Sans MS")
    ;Editor_FontSize(30,16)
    For a=0 To 20
      AddGadgetItem(30,a,"Line "+Str(a))
    Next
    ;Editor_Format(30,0)
    ButtonGadget(2,610,10,150,50,"Changer la Couleur du Texte",#PB_Button_MultiLine)


    Repeat
      EventID = WaitWindowEvent()
      If EventID = #PB_EventGadget   
        Select EventGadgetID()
          Case 2
            rgb=RGB(Random(255),Random(255),Random(255))
            Editor_ColorTest(30,3,1,17,5,rgb)
            SetGadgetText(2,"Texte (RGB) : "+Str(Red(rgb))+","+Str(Green(rgb))+","+Str(Blue(rgb)))
        EndSelect
      EndIf

   Until EventID=#PB_Event_CloseWindow
End
 EndIf 
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

J'avais pas compris mais là ca marche sans que j'ai tout compris ! Me reste juste à étudier ce #EM_HIDESELECTION
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Enfait ça active/desactive le surlignage de la selection (le montre ou le montre pas) donc on a juste a le descativer le temps de notre modification (vu qu'on change la selection) et le reactiver apres...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Ok Merci
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Progi1984 a écrit :@flaith :Pas bete mais ou avoir les codes RTF ?
(PS : un site en francais si t'avias car MSDN ras le bol ... bah sinon MSDN)
j'ai trouvé "Rich Text Format (RTF) Specification" télécharge ici (format doc)

RTF SPEC
Répondre