Page 1 sur 2

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

Publié : lun. 25/avr./2005 23:42
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 

Publié : mar. 26/avr./2005 8:22
par Dr. Dri
Toujour pas trouvé ? t'inquiete on va trouver ca !

Dri

Publié : mar. 26/avr./2005 12:04
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

Publié : mer. 27/avr./2005 20:50
par Progi1984
Merci ! ca marche et c parfait !

Publié : jeu. 28/avr./2005 0:22
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 ?

Publié : ven. 29/avr./2005 15:22
par Progi1984
Quelqu'un aurait il un code pour les buffers de texte ?

Publié : ven. 29/avr./2005 20:27
par Dr. Dri
regarde les sources de l'éditeur pb...
moi perso j'ai pas compris...

Dri

Publié : ven. 29/avr./2005 21:42
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

Publié : sam. 30/avr./2005 11:02
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

Publié : sam. 30/avr./2005 14:12
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 !

Publié : sam. 30/avr./2005 14:16
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 

Publié : sam. 30/avr./2005 14:22
par Progi1984
J'avais pas compris mais là ca marche sans que j'ai tout compris ! Me reste juste à étudier ce #EM_HIDESELECTION

Publié : sam. 30/avr./2005 14:24
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...

Publié : sam. 30/avr./2005 14:26
par Progi1984
Ok Merci

Publié : sam. 30/avr./2005 14:43
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