Je crois que vous confondez tabulation avec taquet de tabulation.
Ça se passe en 2 temps:
Il faut d'abord poser des taquets de tabulations à une distance voulu puis quand on ajoute une tabulation avec la touche Tab, on ajoute un "caractère" qui prendra toute la place jusqu'au prochain taquet.
Le code suivant devrait marcher aussi avec le richedit que l'on trouve dans le forum anglais car richedt est un descendant de "editorgadget".
Code : Tout sélectionner
text.settextex
#ST_SELECTION=2
text\flags=#ST_SELECTION
text\codepage=#CP_ACP
Texte.s="{\rtf\tab "
; Macro LOWORD(Value)
; Value & $FFFF
; EndMacro
;
; Macro HIWORD(Value)
; (Value >> 16) & $FFFF
; EndMacro
;
; Macro MAKELONG(a,b)
; ((a&$ffff)+b<<16)
; EndMacro
Procedure LOWORD(Value)
ProcedureReturn Value & $FFFF
EndProcedure
Procedure HIWORD(Value)
ProcedureReturn (Value >> 16) & $FFFF
EndProcedure
Procedure MAKELONG(low, high)
ProcedureReturn low | (high<<16)
EndProcedure
Procedure.f initTaquetTab()
Value=GetDialogBaseUnits_()
;Debug Value
baseunitX=LOWORD(Value)
baseunitY=HIWORD(Value)
; Debug LOWORD(Value);horizontal dialog box base unit
; Debug HIWORD(Value);vertical dialog box base unit
;The horizontal base unit returned by GetDialogBaseUnits is equal to the average
;width, in pixels, of the characters in the system font;
;the vertical base unit is equal To the height, in pixels, of the font.
hdc = GetDC_(GetDesktopWindow_())
If hdc
Ecrdpihz.l = GetDeviceCaps_(hdc, #LOGPIXELSX)
EndIf
; If hdc
; Ecrdpivt.l = GetDeviceCaps_(hdc, #LOGPIXELSY)
; EndIf
ReleaseDC_(GetDesktopWindow_(), hdc)
; 1 horizontal Dialog Template Unit = (DPI écran / 96 * baseunitX)/4
; 1 vertical Dialog Template Unit = (DPI écran / 96 * baseunitY)/8
pixelX.f = (Ecrdpihz/96)*baseunitX/4
; pixelY.f = (Ecrdpihz/96)*baseunitX/8
; Debug pixelX
; Debug pixelY
ProcedureReturn pixelX
EndProcedure
facteur.f=initTaquetTab() ; transforme un nombre de caractère en dialog template units
;Debug facteur
; Si ModeTabulation = 0 alors taquets de tabulation tous les 32 dialog template units
; Si ModeTabulation = 1 alors taquets de tabulation tous les "taquet1" dialog template units
; Si ModeTabulation > 1 alors x taquets de tabulation chacun à la distance "taquets(x)"
;ModeTabulation = 0
ModeTabulation = 1
;ModeTabulation = 5 ; 5 taquets de tabulation
taquet1=5*facteur ; 1 taquet de tabulation à 5 caractères
Dim taquets(5) ; 5 taquets de tabulation en nombre de caractères
taquets(0) = 5*facteur
taquets(1) = 10*facteur
taquets(2) = 15*facteur
taquets(3) = 20*facteur
taquets(4) = 25*facteur
;Debug taquets(0)
If OpenWindow(0,0,0,320,220,"Simulate Tab",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget (0,10,60,300,140)
CreateImage(0,300,20)
StartDrawing(ImageOutput(0))
Box(0,0,300,20,#White)
Line(0,10,300,1,0)
For i=0 To 30
Line(10*i,0,1,20,0)
Next i
StopDrawing()
ImageGadget(1, 10, 40, 300, 20,ImageID(0))
SetWindowLong_(GadgetID(0),#GWL_STYLE,GetWindowLong_(GadgetID(0),#GWL_STYLE)-#WS_TABSTOP)
SendMessage_(GadgetID(0),#EM_SETTABSTOPS,ModeTabulation,@taquet1)
;SendMessage_(GadgetID(0),#EM_SETTABSTOPS,ModeTabulation,@taquets())
; ModeTabulation
; The number of tab stops contained in the Array. If this parameter is zero,
; @taquet1 parameter is ignored And Default tab stops are set at every 32 dialog
; template units. If this parameter is 1, tab stops are set at every n dialog
; template units, where n is the distance pointed To by the @taquet1 parameter.
; If this parameter is greater than 1, @taquets() is a pointer To an Array of tab stops.
;
; @taquet1 ou @taquets()
; A pointer To an Array of unsigned integers specifying the tab stops, in dialog
; template units. If the ModeTabulation parameter is 1, this parameter is a pointer To an
; unsigned integer containing the distance between all tab stops, in dialog template
; units.
AddGadgetItem(0, -1, "Texte$")
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Gadget
Select EventGadget
Case 0
EndSelect
Case #WM_KEYDOWN
If EventwParam()=9
; Simulation du Tab avec du tag Rich Edit
SendMessage_(GadgetID(0), #EM_SETTEXTEX, text.settextex, @Texte)
EndIf
Case #WM_CLOSE
Quit=1
EndSelect
Until Quit=1
EndIf
La petite grille noire = 1 trait tous les 10 pixels
On peut simplifier le code en se passant de Procedure.f initTaquetTab() et de facteur.f et en definissant taquet1 ou taquets() au pif et voir ce que ça donne.
Si vous attrapez un mal de tête en lisant ce code, c'est normal, c'est l'effet que ça m'a fait en l'écrivant.
Mesa.