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