le format RTF

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

le format RTF

Message par jbernard13 »

Bonjour à tous


je recherche un bout de code sur le format RTF , Dobro avez posté un exellent tuto mais il l'as effacer alors je cherche un exemple .

merci
Jbernard13
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: le format RTF

Message par Micoute »

Code : Tout sélectionner

;RichEdit.pbi
#CFM_ALLCAPS = $80
#CFM_ANIMATION = $40000
#CFM_BACKCOLOR = $4000000
#CFM_BOLD = $1
#CFM_CHARSET = $8000000
#CFM_COLOR = $40000000
#CFM_DISABLED = $2000
#CFM_EMBOSS = $800
#CFM_FACE = $20000000
#CFM_HIDDEN = $100
#CFM_IMPRINT = $1000
#CFM_ITALIC = $2
#CFM_KERNING = $100000
#CFM_LCID = $2000000
#CFM_LINK = $20
#CFM_OFFSET = $10000000
#CFM_OUTLINE = $200
#CFM_PROTECTED = $10
#CFM_REVAUTHOR = $8000
#CFM_REVISED = $4000
#CFM_SHADOW = $400
#CFM_SIZE = $80000000
#CFM_SMALLCAPS = $40
#CFM_SPACING = $200000
#CFM_STRIKEOUT = $8
#CFM_STYLE = $80000
#CFM_SUPERSCRIPT =  $20000; #CFM_SUBSCRIPT
#CFM_UNDERLINE = $4
#CFM_UNDERLINETYPE = $800000
#CFM_WEIGHT = $400000

#CFE_ALLCAPS = #CFM_ALLCAPS
#CFE_AUTOBACKCOLOR = #CFM_BACKCOLOR
#CFE_AUTOCOLOR = $40000000
#CFE_BOLD = #CFM_BOLD
#CFE_DISABLED = #CFM_DISABLED
#CFE_EMBOSS = #CFM_EMBOSS
#CFE_HIDDEN = #CFM_HIDDEN
#CFE_IMPRINT = #CFM_IMPRINT
#CFE_ITALIC = #CFM_ITALIC
#CFE_LINK = #CFM_LINK
#CFE_OUTLINE = #CFM_OUTLINE
#CFE_PROTECTED = #CFM_PROTECTED
#CFE_REVISED = #CFM_REVISED
#CFE_SHADOW = #CFM_SHADOW
#CFE_SMALLCAPS = #CFM_SMALLCAPS
#CFE_STRIKEOUT = $8
#CFE_SUBSCRIPT = $10000
#CFE_SUPERSCRIPT = $20000
#CFE_UNDERLINE = $4
#CFM_SUBSCRIPT = #CFE_SUBSCRIPT | #CFE_SUPERSCRIPT

#ENM_LINK = $04000000

#PFA_JUSTIFY = 4  ;Nouvelle option d'alignement du paragraphe 2.0

#ST_DEFAULT = 0
#ST_KEEPUNDO = 1
#ST_SELECTION = 2



Structure RichEditOle 
	*pIntf.IRicheditOle 
	Refcount.l 
	hwnd.i 
EndStructure

Interface RichEdit
	Free(); libère le gadget et le conteneur d'objets
	GetID.i(); renvoie l'ID PB
	GethWnd.i(); renvoie le handle OS
	GetX.i(); Abscisse
	GetY.i(); Ordonnée
	GetWidth.i(); Largeur Editeur
	GetHeight.i(); Hauteur Editeur
	GetReadOnly.i(); déterminer si ReadOnly oui ou non
	GetCursorX.i(); Rangée du curseur
	GetCursorY.i(); Colonne du curseur
	GetFont.s()
	GetFontSize.i()
	GetFontStyle.l()
	GetZoom.i(); Pourcentage Zoom
	Resize(x.l, y.l, w.l, h.l)
	DisableRedraw.i(bVal.i = #True);Empêche la redéfinition de l'éditeur
	Clear(); Vider Editeur
	GetText.s()
	GetRTFText.s(); Est le flux RTF en tant que chaîne
	GetSelText.s()
	FindText.i(Texte.s,Drapeaux.l = #FR_DOWN);Drapeaux: #FR_DOWN, #FR_MATCHCASE, #FR_WHOLEWORD
	CountWords.i()
	Cut()
	Copy()
	Paste()
	BeginUndo(); démarre l'annulation d'enregistrement
	StopUndo(); termine l'annulation d'enregistrement
	CanUndo.i()
	Undo()
	Redo()
	LoadRTF(NomFichier.s, insert.l = #False)
	LoadText(NomFichier.s, insert.l = #False)
	SaveRTF(NomFichier.s)
	SaveText(NomFichier.s)
	Print(NomDoc.s = "pbprint", Dialogue.i = #False)
	SetFont.i(Nom.s)
	SetFontSize.i(Taille.l)
	SetFontStyle.i(Style.l = 0)
	SetZoom.i(zoom.i); Définir Zoom (en pour cent)
	SetAlignment(Drapeau.l = #PB_Default); #PB_Text_Center, #PB_Text_Right
	SetLeftMargin(pixel.w)
	SetRightMargin(pixel.w)  
	SetCtrlBackColor.i(Couleur.l)
	SetTextBackColor.i(Couleur.l)
	GetTextBackColor.i()
	ClearTextBackColor.i()  
	SetTextColor.i(CouleurTexte.l, CouleurFond.l = #PB_Default)
	SetSelection.i(LigneDebut.l, CarDebut.l, LigneFin.l = #PB_Default, CarFin.l = #PB_Default)
	IsTextSelected.i(); #True, lorsqu'une sélection est disponible
	SetText.i(Texte.s); insère le texte à la position du curseur, ou remplace la sélection-
	SetReadOnly.i(Drapeau.l); activer ou désactiver ReadOnly
	SetCursorPos.i(x.l, y.l); curseur de texte
	SetWordWrap.i(Drapeau.l); sur une nouvelle ligne (standard) ou à partir de
	SelectAll.i(); Sélectionne tout le texte
	Unselect()
	Indent.i(mm.i = 10); Indentation en mm (à droite)
	Outdent.i(mm.i = 10); Désengagement en mm (à gauche)
	ScrollToLine(Ligne.i)
	GetParagraphAlign.l()
	GetLineSpacing.f()
	SetLineSpacing.i(vInter.f)
	IsModified.i()
	SetModified.i()
	IsLink.i()                          ;; Parce que GetFontStyle prend uniquement en charge la constante PB, mais aucune liste de liens disponibles
	GetWordUnderMouse.s(x.i, y.i)       ; x,y = Position de la souris par rapport au gadget!!!
	GetCurrentWord.s()    
	Replace.i(A_Remplacer.s, Texte.s,Drapeaux.i = 0)
	ReplaceAll.i(A_Remplacer.s, Texte.s,Drapeaux.i = 0)
	SetBulleted.i()  
	GetLineCount.i()  
	IsSuperscript()
	SetSuperscript()
	IsSubscript()
	SetSubscript()
	ChangeFontSize(iDelta.i=1)
	LimitText(iLimiter_A.i)
	HideSelection(bVal.i=#True)
	SetUnderlineWave()
	ClearUnderlineWave()
	Redraw()
	GetTextLength.i()
	GetTextColor.i()
	IsSmallCaps()
	SetSmallCaps(bVal.i = #True)
	IsAllCaps()
	SetAllCaps(bVal.i = #True)
	CanPaste()
	GetCursorPosition()
	GetWordAtPosition.s(Pos.i)
	GetFirstVisibleLineNumber.i()
	GetFirstVisibleLinePos.i()
	GetFirstVisibleLineText.s()
	GetLastVisibleLineNumber.i()  
	GetLastVisibleLinePos.i()
	GetLastVisibleLineText.s()  
	GetCharPosOfPreviousWord.i(Pos.i)
	GetCharPosOfNextWord.i( Pos.i )
	EmptyUndoBuffer()
	GetFirstCharPosOnLine(iLigne.i)  
	GetLineLength(iLigne.i)
	IsAlignLeft()
	IsAlignCenter()
	IsAlignRight()
	IsAlignJustify() 
	GetWordUnderCursorStart()
	GetWordUnderCursorEnd()
	GetScrollPosX()
	GetScrollPosY()
	SetScrollPos(x.i, y.i)
	SetLink(bVal = #True)
	SetUndoLimit(Limite.i)  
	AppendText(Texte.s)   ; ajoute du texte à la fin
	SetHidden(bVal.i = #True)
	IsHidden.i()
	SetTextEx.i(sTexte.s)  ;Travaux pour Unicode
	SetInterface.i()
	SetImage.i(hImage)
EndInterface

Structure RichEditClassTemplate
	*vTable
	ID.i
	hWnd.i
	TextInterface.ITextDocument
	RTFStreamTextResult.s; Si le flux 'RTF' doit être lu dans une chaîne
	TwipsPeSpaceUnit.f
	WordUnderCursorRange.CHARRANGE
	RichComObject.RichEditOle
EndStructure

ProcedureDLL.i New_RichEdit(x.l, y.l, w.l, h.l)
	Protected *obj.RichEditClassTemplate
	Protected RichEditOleObject.IRichEditOle
	
	*obj = AllocateMemory(SizeOf(RichEditClassTemplate))
	If *obj
		With *obj
			\vTable = ?vTable_RichEditClassTemplate
			\ID = EditorGadget(#PB_Any, x, y, w, h)
			\hWnd = GadgetID(\ID)
			SetGadgetColor(\ID, #PB_Gadget_BackColor, #White)
			SetGadgetFont(\ID, FontID(LoadFont(#PB_Any, "Arial", 10)))
			SendMessage_(\hWnd, #EM_SETEVENTMASK, 0, #ENM_KEYEVENTS | #ENM_MOUSEEVENTS | #ENM_SELCHANGE | #ENM_CHANGE | #ENM_LINK)      
			SendMessage_(\hWnd, #EM_SETTARGETDEVICE, 0, 0)
			SendMessage_(\hWnd, #EM_GETOLEINTERFACE, 0, @RichEditOleObject)
			SendMessage_(\hWnd, #EM_AUTOURLDETECT  , #True, 0)      
			If RichEditOleObject
				RichEditOleObject\QueryInterface(?IID_ITextDocument, @\TextInterface)
				RichEditOleObject\Release()
			EndIf
			SendMessage_(\hWnd, #EM_EMPTYUNDOBUFFER, 0, 0) 
			SetActiveGadget(\ID)
		EndWith
	EndIf
	
	ProcedureReturn *obj
EndProcedure

ProcedureDLL RichEdit_Free(*Ceci.RichEditClassTemplate)
	FreeGadget(*Ceci\ID)
	FreeMemory(*Ceci)
EndProcedure

ProcedureDLL.i RichEdit_GetID(*Ceci.RichEditClassTemplate)
	ProcedureReturn *Ceci\ID
EndProcedure

ProcedureDLL.i RichEdit_GethWnd(*Ceci.RichEditClassTemplate)
	ProcedureReturn *Ceci\hWnd
EndProcedure

ProcedureDLL.i RichEdit_GetX(*Ceci.RichEditClassTemplate)
	ProcedureReturn GadgetX(*Ceci\ID)
EndProcedure

ProcedureDLL.i RichEdit_GetY(*Ceci.RichEditClassTemplate)
	ProcedureReturn GadgetY(*Ceci\ID)
EndProcedure

ProcedureDLL.i RichEdit_GetWidth(*Ceci.RichEditClassTemplate)
	ProcedureReturn GadgetWidth(*Ceci\ID)
EndProcedure

ProcedureDLL.i RichEdit_GetHeight(*Ceci.RichEditClassTemplate)
	ProcedureReturn GadgetHeight(*Ceci\ID)
EndProcedure

ProcedureDLL.i RichEdit_GetReadOnly(*Ceci.RichEditClassTemplate)
	Protected Style.l = GetWindowLongPtr_(*Ceci\hWnd, #GWL_STYLE)
	If Style & #ES_READONLY : ProcedureReturn #True : EndIf
	ProcedureReturn #False
EndProcedure

ProcedureDLL.i RichEdit_GetCursorX(*Ceci.RichEditClassTemplate)
	Protected.CHARRANGE Domaine
	
	SendMessage_(*Ceci\hWnd, #EM_EXGETSEL, 0, @Domaine)
	ProcedureReturn Domaine\cpMax - (SendMessage_(*Ceci\hWnd, #EM_LINEINDEX, SendMessage_(*Ceci\hWnd, #EM_EXLINEFROMCHAR, 0, Domaine\cpMin), 0)) + 1
EndProcedure

ProcedureDLL.i RichEdit_GetCursorY(*Ceci.RichEditClassTemplate)
	Protected.CHARRANGE Domaine
	
	SendMessage_(*Ceci\hWnd, #EM_EXGETSEL, 0, @Domaine)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_EXLINEFROMCHAR, 0, Domaine\cpMin) + 1 
EndProcedure

ProcedureDLL.s RichEdit_GetFont(*Ceci.RichEditClassTemplate)
	Protected.CHARFORMAT2 Format
	Protected Police.s
	
	Format\cbSize = SizeOf(CHARFORMAT2)
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, #SCF_SELECTION, @Format)
	Police = PeekS(@Format\szFaceName[0])
	If Police = ""
		SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, #SCF_DEFAULT, @Format)
		Police = PeekS(@Format\szFaceName[0])
	EndIf
	ProcedureReturn Police
EndProcedure

ProcedureDLL.i RichEdit_GetFontSize(*Ceci.RichEditClassTemplate)
	Protected.CHARFORMAT2 Format
	
	Format\cbSize = SizeOf(CHARFORMAT2)
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, #SCF_SELECTION, @Format)
	ProcedureReturn Format\yHeight / 20
EndProcedure

ProcedureDLL.l RichEdit_GetFontStyle(*Ceci.RichEditClassTemplate)
	Protected.CHARFORMAT2 Format
	Protected Resultat.l = 0
	
	With Format
		\cbSize = SizeOf(CHARFORMAT2)
		\dwMask = #CFM_BOLD | #CFM_ITALIC | #CFM_STRIKEOUT | #CFM_UNDERLINE
	EndWith
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, #SCF_SELECTION, @Format)
	If Format\dwEffects & #CFM_BOLD
		Resultat | #PB_Font_Bold
	EndIf
	If Format\dwEffects & #CFM_ITALIC
		Resultat | #PB_Font_Italic
	EndIf
	If Format\dwEffects & #CFM_STRIKEOUT
		Resultat | #PB_Font_StrikeOut
	EndIf
	If Format\dwEffects & #CFM_UNDERLINE
		Resultat | #PB_Font_Underline
	EndIf
	
	ProcedureReturn Resultat
EndProcedure

ProcedureDLL.i RichEdit_GetZoom(*Ceci.RichEditClassTemplate)
	Protected wParam.l, hParam.l, Resultat.l
	Resultat =  SendMessage_(*Ceci\hWnd, #EM_GETZOOM, @wParam, @hParam)
	ProcedureReturn Int((wParam * 100) / hParam )
EndProcedure

ProcedureDLL RichEdit_Resize(*Ceci.RichEditClassTemplate, x.l, y.l, w.l, h.l)
	ResizeGadget(*Ceci\ID, x, y, w, h)
EndProcedure

ProcedureDLL.i RichEdit_DisableRedraw(*Ceci.RichEditClassTemplate, bVal.i = #True)
	; Description:  Lors de l'exécution de plusieurs actions, ou d'actions sur le texte qui
	;                       n'est pas visible dans la fenêtre, ou en cas de changement
	;                       à plusieurs reprises de sélections - un Editeur peut scintiller
	;                       Désactiver le gadget avec WM_SETREDRAW avant de faire les
	;                       actions, puis en inversant permettant après aux actions qui ont
	;                       été prises peut améliorer considérablement les performances ..
	;
	; Paramètre(s) ......:  bVal      - #True (par défaut) pour désactiver Redessiner
	;                                 - #False pour activer / réactiver Redessiner
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #WM_SETREDRAW, 1 ! bVal, 0)
EndProcedure

ProcedureDLL RichEdit_Clear(*Ceci.RichEditClassTemplate)
	ClearGadgetItems(*Ceci\ID)
	SendMessage_(*Ceci\hWnd, #EM_EMPTYUNDOBUFFER, 0, 0)
EndProcedure

ProcedureDLL.s RichEdit_GetText(*Ceci.RichEditClassTemplate)
	ProcedureReturn GetGadgetText(*Ceci\ID)
EndProcedure

ProcedureDLL.i RichEdit_GetRTFStreamCallback(dwCookie, *pbBuff, cb, *pcb.Long)  
	Protected *Ceci.RichEditClassTemplate = dwCookie  
	*Ceci\RTFStreamTextResult + PeekS(*pbBuff, cb)
	*pcb\l = cb
	ProcedureReturn 0
EndProcedure

ProcedureDLL.s RichEdit_GetRTFText(*Ceci.RichEditClassTemplate)
	Protected Flux.EDITSTREAM
	
	Flux\dwCookie = *Ceci
	Flux\pfnCallback = @RichEdit_GetRTFStreamCallback()
	
	SendMessage_(*Ceci\hWnd, #EM_STREAMOUT, #SF_RTF | #SFF_PLAINRTF, @Flux)
	
	ProcedureReturn *Ceci\RTFStreamTextResult
EndProcedure

ProcedureDLL.s RichEdit_GetSelText(*Ceci.RichEditClassTemplate)
	Protected PosDebut.l, PosFin.l, Taille.l, *mem, Resultat.s
	
	If SendMessage_(*Ceci\hWnd, #EM_GETSEL, @PosDebut, @PosFin)
		Taille = PosFin - PosDebut + 1
		Taille * SizeOf(Character)
		*mem = AllocateMemory(Taille)
		If *mem
			SendMessage_(*Ceci\hWnd, #EM_GETSELTEXT, 0, *mem)
			Resultat = PeekS(*mem)
			FreeMemory(*mem)
		EndIf
	EndIf
	
	ProcedureReturn Resultat
EndProcedure

ProcedureDLL.i RichEdit_FindText(*Ceci.RichEditClassTemplate, Texte.s,Drapeaux.l = #FR_DOWN)
	Protected.FINDTEXTEX ChaineAChercher
	Protected.l PosActuelleCurseur
	
	If Texte <> ""
		SendMessage_(*Ceci\hWnd, #EM_GETSEL, @PosActuelleCurseur, 0)
		With ChaineAChercher
			\chrg\cpMin = PosActuelleCurseur
			\chrg\cpMax = GetWindowTextLength_(*Ceci\hWnd)
			\lpstrText = @Texte
		EndWith
		If SendMessage_(*Ceci\hWnd, #EM_FINDTEXTEX,Drapeaux, @ChaineAChercher) <> -1
			SendMessage_(*Ceci\hWnd, #EM_SETSEL, ChaineAChercher\chrgText\cpMin, ChaineAChercher\chrgText\cpMax)
			ProcedureReturn #True
		EndIf
	EndIf
	ProcedureReturn #False
EndProcedure

ProcedureDLL.i RichEdit_CountWords(*Ceci.RichEditClassTemplate)
	Protected Texte.s = GetGadgetText(*Ceci\ID)
	Protected Compte.i = 0
	Protected DernMotCar.i = 0
	Protected *p.CHARACTER
	
	If Len(Trim(Texte)) = 0 : ProcedureReturn 0 : EndIf  
	*p = @Texte
	While *p\c <> 0
		If *p\c = ' ' Or *p\c = 9 Or *p\c = 10 Or *p\c = 13
			If DernMotCar
				If DernMotCar > 1
					Compte + 1
				EndIf
				DernMotCar = 0
			EndIf
		Else
			DernMotCar + 1
		EndIf
		
		*p + SizeOf(CHARACTER)
	Wend
	
	If Not DernMotCar : Compte - 1 : EndIf
	
	ProcedureReturn Compte + 1
EndProcedure

ProcedureDLL RichEdit_Cut(*Ceci.RichEditClassTemplate)
	SendMessage_(*Ceci\hWnd, #WM_CUT, 0, 0) 
EndProcedure

ProcedureDLL RichEdit_Copy(*Ceci.RichEditClassTemplate)
	SendMessage_(*Ceci\hWnd, #WM_COPY, 0, 0) 
EndProcedure

ProcedureDLL RichEdit_Paste(*Ceci.RichEditClassTemplate)
	SendMessage_(*Ceci\hWnd, #WM_PASTE, 0, 0) 
EndProcedure

ProcedureDLL RichEdit_BeginUndo(*Ceci.RichEditClassTemplate)
	If *Ceci\TextInterface
		*Ceci\TextInterface\Undo(-9999994, 0)
	EndIf
EndProcedure

ProcedureDLL RichEdit_StopUndo(*Ceci.RichEditClassTemplate)
	If *Ceci\TextInterface
		*Ceci\TextInterface\Undo(-9999995, 0)
	EndIf
EndProcedure

ProcedureDLL.i RichEdit_CanUndo(*Ceci.RichEditClassTemplate)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_CANUNDO, 0, 0)
EndProcedure

ProcedureDLL RichEdit_Undo(*Ceci.RichEditClassTemplate)
	SendMessage_(*Ceci\hWnd, #EM_UNDO, 0, 0)
EndProcedure

ProcedureDLL RichEdit_Redo(*Ceci.RichEditClassTemplate)
	SendMessage_(*Ceci\hWnd, #EM_REDO, 0, 0)
EndProcedure

ProcedureDLL RichEdit_StreamInCallback(dwCookie, *pbBuff, cb, *pcb.Long)
	Protected Longueur.q
	
	Longueur = Lof(dwCookie) - Loc(dwCookie)
	If Longueur > cb
		ReadData(dwCookie, *pbBuff, cb)
		*pcb\l = cb
	Else
		ReadData(dwCookie, *pbBuff, Longueur)
		*pcb\l = Longueur
	EndIf
	
	ProcedureReturn 0
EndProcedure

ProcedureDLL RichEdit_StreamOutCallback(dwCookie, *pbBuff, cb, *pcb.Long)
	
	WriteData(dwCookie, *pbBuff, cb)
	*pcb\l = cb
	
	ProcedureReturn 0
EndProcedure

ProcedureDLL RichEdit_LoadRTF(*Ceci.RichEditClassTemplate, NomFichier.s, insert.l = #False)
	Protected.EDITSTREAM Flux
	Protected Drapeau.l = #SF_RTF
	
	If insert : Drapeau | #SFF_SELECTION : EndIf
	
	With Flux
		\dwCookie = ReadFile(#PB_Any, NomFichier)
		If \dwCookie
			\pfnCallback = @RichEdit_StreamInCallback()
			SendMessage_(*Ceci\hWnd, #EM_STREAMIN, Drapeau, @Flux)
			CloseFile(\dwCookie)
			SendMessage_(*Ceci\hWnd, #EM_EMPTYUNDOBUFFER, 0, 0) 
		EndIf
	EndWith
EndProcedure

ProcedureDLL RichEdit_LoadText(*Ceci.RichEditClassTemplate, NomFichier.s, insert.l = #False)
	Protected.EDITSTREAM Flux
	Protected Drapeau.l = #SF_TEXT
	
	If insert : Drapeau | #SFF_SELECTION : EndIf
	CompilerIf #PB_Compiler_Unicode : Drapeau | #SF_UNICODE : CompilerEndIf
	
	With Flux
		\dwCookie = ReadFile(#PB_Any, NomFichier)
		If \dwCookie
			\pfnCallback = @RichEdit_StreamInCallback()
			SendMessage_(*Ceci\hWnd, #EM_STREAMIN, Drapeau, @Flux)
			CloseFile(\dwCookie)
			SendMessage_(*Ceci\hWnd, #EM_EMPTYUNDOBUFFER, 0, 0) 
		EndIf
	EndWith
EndProcedure

ProcedureDLL RichEdit_SaveRTF(*Ceci.RichEditClassTemplate, NomFichier.s)
	Protected.EDITSTREAM Flux
	
	With Flux
		\dwCookie = CreateFile(#PB_Any, NomFichier+".Rtf")
		If \dwCookie
			\pfnCallback = @RichEdit_StreamOutCallback()
			SendMessage_(*Ceci\hWnd, #EM_STREAMOUT, #SF_RTF, @Flux)
			CloseFile(\dwCookie)
			SendMessage_(*Ceci\hWnd, #EM_EMPTYUNDOBUFFER, 0, 0) 
		EndIf
	EndWith
EndProcedure

ProcedureDLL RichEdit_SaveText(*Ceci.RichEditClassTemplate, NomFichier.s)
	Protected.EDITSTREAM Flux
	Protected Drapeau.l = #SF_TEXT
	
	CompilerIf #PB_Compiler_Unicode : Drapeau | #SF_UNICODE : CompilerEndIf
	
	With Flux
		\dwCookie = CreateFile(#PB_Any, NomFichier)
		If \dwCookie
			\pfnCallback = @RichEdit_StreamOutCallback()
			SendMessage_(*Ceci\hWnd, #EM_STREAMOUT, Drapeau, @Flux)
			CloseFile(\dwCookie)
			SendMessage_(*Ceci\hWnd, #EM_EMPTYUNDOBUFFER, 0, 0) 
		EndIf
	EndWith
EndProcedure

ProcedureDLL RichEdit_Print(*Ceci.RichEditClassTemplate, NomDoc.s = "pbprint", Dialogue.i = #False)
	Protected.PRINTDLG lppd
	Protected.RECT cRect
	Protected.FORMATRANGE FormatRange 
	Protected.Docinfo Docinfo
	Protected DernierCar.l, LongueurMax.l, AncienModeMap.l, OffsetX.l, OffsetY.l, HorzRes.l, VertRes.l
	Protected DC.i, i.i = 1
	
	If Dialogue
		lppd\lStructsize = SizeOf(PRINTDLG)
		lppd\Flags = #PD_ALLPAGES | #PD_HIDEPRINTTOFILE | #PD_NOSELECTION | #PD_RETURNDC
		If PrintDlg_(@lppd)
			DC = lppd\hDC
		EndIf
	Else
		DC = DefaultPrinter()
	EndIf
	
	If DC
		Docinfo\cbSize = SizeOf(Docinfo) 
		Docinfo\lpszDocName = @NomDoc 
		
		StartDoc_(DC, Docinfo) 
		
		LongueurMax = Len(GetGadgetText(*Ceci\ID)) - SendMessage_(*Ceci\hWnd, #EM_GETLINECOUNT, 0, 0) 
		AncienModeMap = GetMapMode_(DC) 
		SetMapMode_(DC, #MM_TWIPS) 
		OffsetX = GetDeviceCaps_(DC, #PHYSICALOFFSETX) 
		OffsetY = - GetDeviceCaps_(DC, #PHYSICALOFFSETY) 
		HorzRes = GetDeviceCaps_(DC, #HORZRES) 
		VertRes = - GetDeviceCaps_(DC, #VERTRES) 
		SetRect_(cRect, OffsetX, OffsetY, HorzRes, VertRes) 
		DPtoLP_(DC, cRect, 2) 
		SetMapMode_(DC, AncienModeMap) 
		FormatRange\hDC = DC 
		FormatRange\hdcTarget = DC 
		FormatRange\rc\left = cRect\left 
		FormatRange\rc\top = cRect\top 
		FormatRange\rc\right = cRect\right 
		FormatRange\rc\bottom = cRect\bottom 
		FormatRange\rcPage\left = cRect\left 
		FormatRange\rcPage\top = cRect\top 
		FormatRange\rcPage\right = cRect\right 
		FormatRange\rcPage\bottom = cRect\bottom 
		
		Repeat 
			StartPage_(DC) 
			FormatRange\chrg\cpMax = - 1 
			DernierCar = SendMessage_(*Ceci\hWnd, #EM_FORMATRANGE, #True, @FormatRange) 
			FormatRange\chrg\cpMin = DernierCar 
			SendMessage_(*Ceci\hWnd, #EM_DISPLAYBAND, 0, cRect) 
			i + 1 
			EndPage_(DC) 
		Until DernierCar >= LongueurMax Or DernierCar = -1 
		
		EndDoc_(DC) 
		SendMessage_(*Ceci\hWnd, #EM_FORMATRANGE, 0, 0)
	EndIf
EndProcedure

ProcedureDLL.i RichEdit_SetFont(*Ceci.RichEditClassTemplate, Nom.s)
	Protected.CHARFORMAT Format
	
	With Format
		\cbSize = SizeOf(CHARFORMAT)
		\dwMask = #CFM_FACE
		PokeS(@\szFaceName[0], Nom)
	EndWith
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure

ProcedureDLL.i RichEdit_SetFontSize(*Ceci.RichEditClassTemplate, Taille.l)
	Protected.CHARFORMAT Format
	
	With Format
		\cbSize = SizeOf(CHARFORMAT)
		\dwMask = #CFM_SIZE
		\yHeight = Taille * 20
	EndWith
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure

ProcedureDLL RichEdit_SetFontStyle(*Ceci.RichEditClassTemplate, Style.l = 0)
	Protected Format.CHARFORMAT
	Protected Drapeaux.l = 0
	
	If Style & #PB_Font_Bold :Drapeaux | #CFM_BOLD : EndIf
	If Style & #PB_Font_Italic :Drapeaux | #CFM_ITALIC : EndIf
	If Style & #PB_Font_StrikeOut :Drapeaux | #CFM_STRIKEOUT : EndIf
	If Style & #PB_Font_Underline :Drapeaux | #CFM_UNDERLINE : EndIf
	
	With Format
		\cbSize = SizeOf(CHARFORMAT)
		\dwMask = #CFM_ITALIC | #CFM_BOLD | #CFM_STRIKEOUT | #CFM_UNDERLINE
		\dwEffects =Drapeaux
	EndWith
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure

ProcedureDLL.i RichEdit_SetZoom(*Ceci.RichEditClassTemplate, zoom.i)  
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETZOOM, zoom, 100)
EndProcedure

ProcedureDLL.i RichEdit_SetAlignment(*Ceci.RichEditClassTemplate, Drapeau.l = #PB_Default)
	Protected.PARAFORMAT Format
	
	Select Drapeau
		Case #PB_Text_Center : Drapeau = #PFA_CENTER
		Case #PB_Text_Right : Drapeau = #PFA_RIGHT
		Default : Drapeau = #PFA_LEFT
	EndSelect
	
	With Format
		\cbSize = SizeOf(PARAFORMAT)
		\dwMask = #PFM_ALIGNMENT
		\wAlignment = Drapeau
	EndWith
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETPARAFORMAT, 0, @Format)
EndProcedure

ProcedureDLL RichEdit_SetLeftMargin(*Ceci.RichEditClassTemplate, pixel.w)
	SendMessage_(*Ceci\hWnd, #EM_SETMARGINS, #EC_LEFTMARGIN, $FFFF + pixel)
EndProcedure

ProcedureDLL RichEdit_SetRightMargin(*Ceci.RichEditClassTemplate, pixel.w)
	SendMessage_(*Ceci\hWnd, #EM_SETMARGINS, #EC_RIGHTMARGIN, $FFFF * pixel)
EndProcedure

ProcedureDLL.i RichEdit_SetCtrlBackColor(*Ceci.RichEditClassTemplate, Couleur.l)
	ProcedureReturn SetGadgetColor(*Ceci\ID, #PB_Gadget_BackColor, Couleur)
EndProcedure

ProcedureDLL.i RichEdit_SetTextBackColor(*Ceci.RichEditClassTemplate, Couleur.l)  
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)
	format\dwMask = #CFM_BACKCOLOR
	format\crBackColor = Couleur
	SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)  
EndProcedure

ProcedureDLL.i RichEdit_SetTextColor(*Ceci.RichEditClassTemplate, CouleurTexte.l, CouleurFond.l = #PB_Default)
	Protected.CHARFORMAT2 Format
	
	With Format
		\cbSize = SizeOf(CHARFORMAT2)
		\dwMask = #CFM_COLOR | #CFM_BACKCOLOR
		\crTextColor = CouleurTexte
		If CouleurFond = #PB_Default
			\crBackColor = GetGadgetColor(*Ceci\ID, #PB_Gadget_BackColor)
		Else
			\crBackColor = CouleurFond      
		EndIf
	EndWith
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)
EndProcedure

ProcedureDLL.i RichEdit_GetTextBackColor(*Ceci.RichEditClassTemplate)
	Protected CouleurRetournee.i = #White  
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)  
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, #SCF_SELECTION, @format)  
	; Is AutoColor?
	If (format\dwEffects & #CFE_AUTOBACKCOLOR) = #CFE_AUTOBACKCOLOR
		CouleurRetournee = GetSysColor_(#COLOR_WINDOW)
	Else
		CouleurRetournee = format\crBackColor  
	EndIf  
	ProcedureReturn CouleurRetournee
EndProcedure  

ProcedureDLL.i RichEdit_ClearTextBackColor(*Ceci.RichEditClassTemplate)
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)
	format\dwMask = #CFM_BACKCOLOR
	format\dwEffects = #CFE_AUTOBACKCOLOR
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

ProcedureDLL.i RichEdit_SetSelection(*Ceci.RichEditClassTemplate, LigneDebut.l, CarDebut.l, LigneFin.l = #PB_Default, CarFin.l = #PB_Default)
	Protected.CHARRANGE sel
	Protected.i hWnd = *Ceci\hWnd
	
	With sel
		\cpMin = SendMessage_(hWnd, #EM_LINEINDEX, LigneDebut, 0) + CarDebut - 1
		
		If LigneFin = #PB_Default
			LigneFin = SendMessage_(hWnd, #EM_GETLINECOUNT, 0, 0) - 1
		EndIf
		\cpMax = SendMessage_(hWnd, #EM_LINEINDEX, LigneFin, 0)
		
		If CarFin = #PB_Default
			\cpMax + SendMessage_(hWnd, #EM_LINELENGTH, \cpMax, 0)
		Else
			\cpMax + CarFin - 1
		EndIf
	EndWith
	ProcedureReturn SendMessage_(hWnd, #EM_EXSETSEL, 0, @sel)
EndProcedure

ProcedureDLL.i RichEdit_IsTextSelected(*Ceci.RichEditClassTemplate)
	Protected cr.CHARRANGE
	SendMessage_(*Ceci\hWnd, #EM_EXGETSEL, 0, @cr)
	If cr\cpMin <> cr\cpMax
		ProcedureReturn #True
	EndIf
	ProcedureReturn #False
EndProcedure

ProcedureDLL.i RichEdit_SetText(*Ceci.RichEditClassTemplate, Texte.s)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_REPLACESEL, 0, Texte) 
EndProcedure

ProcedureDLL.i RichEdit_SetReadOnly(*Ceci.RichEditClassTemplate, Drapeau.l)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETREADONLY, Drapeau, 0)
EndProcedure

ProcedureDLL.i RichEdit_SetCursorPos(*Ceci.RichEditClassTemplate, x.l, y.l)
	Protected.CHARRANGE Domaine
	Protected.l char, lenght
	
	char = SendMessage_(*Ceci\hWnd, #EM_LINEINDEX, y - 1, 0)
	lenght = SendMessage_(*Ceci\hWnd, #EM_LINELENGTH, char, 0)
	If lenght >= x - 1
		char + x - 1
	EndIf
	Domaine\cpMin = char
	Domaine\cpMax = char
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_EXSETSEL, 0, @Domaine) 
EndProcedure

ProcedureDLL.i RichEdit_SetWordWrap(*Ceci.RichEditClassTemplate, Drapeau.l)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETTARGETDEVICE, 0, Drapeau | 1)
EndProcedure

ProcedureDLL.i RichEdit_SelectAll(*Ceci.RichEditClassTemplate)
	;Sélectionner tout le contenu du gadget éditeur.
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETSEL, 0, -1)
EndProcedure

ProcedureDLL.i RichEdit_Unselect(*Ceci.RichEditClassTemplate)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETSEL, -1, 0)
EndProcedure

ProcedureDLL.i RichEdit_Indent(*Ceci.RichEditClassTemplate, mm.i = 10)
	Protected format.PARAFORMAT2
	format\cbSize = SizeOf(PARAFORMAT2)
	;A lire en premier
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT, 0, @format)
	
	format\dxStartIndent = Int(mm * (1440/25.4)); Millimètres juste
	format\dwMask = #PFM_OFFSETINDENT
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETPARAFORMAT, 0, @format)
EndProcedure

ProcedureDLL.i RichEdit_Outdent(*Ceci.RichEditClassTemplate, mm.i = 10)
	Protected format.PARAFORMAT2
	format\cbSize = SizeOf(PARAFORMAT2)
	;A lire en premier
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT, 0, @format)
	
	format\dxStartIndent = 0 - Int(mm * (1440/25.4))     ; Millimètres juste
	format\dwMask = #PFM_OFFSETINDENT
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETPARAFORMAT, 0, @format)
EndProcedure

ProcedureDLL.i RichEdit_ScrollToLine(*Ceci.RichEditClassTemplate, Ligne.i)
	ProcedureReturn SendMessage_(*Ceci\hWnd,#EM_LINESCROLL,#Null,Ligne)
EndProcedure

ProcedureDLL.l RichEdit_GetParagraphAlign(*Ceci.RichEditClassTemplate)
	; Retour #PFA_LEFT   - justifié à gauche
	;         #PFA_CENTER - Centré
	;         #PFA_Right  - justifié à droite
	Protected paraf.PARAFORMAT2\cbSize = SizeOf(PARAFORMAT2)
	Protected bRet.i = #False
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT ,#Null, @paraf)  
	ProcedureReturn paraf\wAlignment
EndProcedure

ProcedureDLL.i RichEdit_SetLineSpacing(*Ceci.RichEditClassTemplate, vInter.f)
	; Description .......:  Changer Interligne
	;  
	; Paramètre(s) ......:  vInter.f  1.0 - Interligne Normal
	;                                 1.5 - Interligne 1.5
	;                                 2.0 - Interligne 2.0
	;                                 d'autres modifications des valeurs de l'interligne sur ​​mesure
	Protected paraf.PARAFORMAT2\cbSize = SizeOf(PARAFORMAT2)
	If vInter >= 1.0
		If vInter = 1.0
			paraf\bLineSpacingRule = 0
		ElseIf vInter = 1.5
			paraf\bLineSpacingRule = 1
		ElseIf vInter = 2.0
			paraf\bLineSpacingRule = 2
		Else
			paraf\bLineSpacingRule = 5 ; espacement en lignes
			paraf\dyLineSpacing = Int(vInter * 20)
		EndIf
		paraf\dwMask = #PFM_LINESPACING
		SendMessage_(*Ceci\hWnd, #EM_SETPARAFORMAT,0, @paraf)    
	Else
		Debug("Editor_SetParaSpacing() - Interligne trop faible (< 1.0) !")
	EndIf
EndProcedure

ProcedureDLL.f RichEdit_GetLineSpacing(*Ceci.RichEditClassTemplate)
	; Description .......:  Obtenir une sélection d'interligne
	; Valeur(s) retournée(s) ...:  1.0 - Interligne Normal
	;                       1.5 - Interligne 1.5
	;                       2.0 - Interligne 2.0
	;                      autres valeurs sont l'interligne personnalisé
	Protected paraf.PARAFORMAT2\cbSize = SizeOf(PARAFORMAT2)
	Protected ValeurRetournee.f
	
	paraf\dwMask = #PFM_LINESPACING
	
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT,0, @paraf)  
	Select paraf\bLineSpacingRule
		Case 0
			ValeurRetournee = 1.0
		Case 1
			ValeurRetournee = 1.5
		Case 2
			ValeurRetournee = 2.0
		Default
			ValeurRetournee =( paraf\dyLineSpacing / 20)
	EndSelect
	
	ProcedureReturn  ValeurRetournee
EndProcedure

ProcedureDLL.i RichEdit_IsModified(*Ceci.RichEditClassTemplate)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_GETMODIFY, 0, 0)
EndProcedure

ProcedureDLL.i RichEdit_IsLink(*Ceci.RichEditClassTemplate)
	Protected cf2.CHARFORMAT2\cbsize = SizeOf(CHARFORMAT2)
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT ,#SCF_SELECTION, @cf2)
	If cf2\dwEffects &#CFM_LINK : ProcedureReturn #True : EndIf
	ProcedureReturn #False
	
	
EndProcedure

ProcedureDLL.s RichEdit_GetWordUnderMouse( *Ceci.RichEditClassTemplate, x.i, y.i )
	; x,y = Position de la souris par rapport au gadget !!!
	
	Protected.TEXTRANGE TR
	Protected.s          Resultat
	Protected.POINT ps
	Protected.i          Pos, Debut, Longueur, Taille
	
	; Peut-être que nous avons besoin de quelques astuces d'ajustements.
	ps\x = X  ;* GetTwipsPerPixelX()      
	ps\y = Y  ;* GetTwipsPerPixelY()
	
	;obtenir le caractère à la position des coordonnées
	Pos = SendMessage_(*Ceci\hWnd, #EM_CHARFROMPOS, 0,@ps)
	
	;si rien, retourner chaîne vide
	If pos <= 0 : ProcedureReturn ""  : EndIf
	
	Debut  =     SendMessage_(*Ceci\hWnd, #EM_FINDWORDBREAK, #WB_LEFTBREAK, Pos)
	Longueur =     SendMessage_(*Ceci\hWnd, #EM_FINDWORDBREAK, #WB_RIGHTBREAK,Pos) - Debut
	
	If Longueur<=0 : ProcedureReturn "" : EndIf
	
	
	TR\chrg\cpMin = Debut
	TR\chrg\cpMax = Debut+Longueur
	
	*Ceci\WordUnderCursorRange\cpMin = TR\chrg\cpMin
	*Ceci\WordUnderCursorRange\cpMax = TR\chrg\cpMax
	
	
	Taille = Longueur * SizeOf(Character)
	TR\lpstrText = AllocateMemory(128+Taille)
	
	
	SendMessage_(*Ceci\hWnd, #EM_GETTEXTRANGE, 0, @TR)
	
	
	Resultat = PeekS(TR\lpstrText,Longueur)
	FreeMemory(TR\lpstrText)  
	
	ProcedureReturn Trim(ReplaceString(ReplaceString(ReplaceString(Resultat,Chr(9)," "),Chr(13)," "),Chr(10)," "))
EndProcedure

ProcedureDLL.s RichEdit_GetCurrentWord(*Ceci.RichEditClassTemplate)
	Protected TR.TEXTRANGE
	Protected Resultat.s
	Protected SelDebut.l
	Protected SelFin.l
	
	SendMessage_(*Ceci\hWnd, #EM_GETSEL, @SelDebut, @SelFin)
	
	Protected Debut.i  =     SendMessage_(*Ceci\hWnd, #EM_FINDWORDBREAK, #WB_LEFTBREAK, SelDebut)
	Protected Longueur.i =     SendMessage_(*Ceci\hWnd, #EM_FINDWORDBREAK, #WB_RIGHTBREAK,SelDebut) - Debut
	Protected Taille.i
	
	If Longueur=0 : ProcedureReturn "" : EndIf
	
	TR\chrg\cpMin = Debut
	TR\chrg\cpMax = Debut+Longueur
	Taille = Longueur* SizeOf(Character)
	TR\lpstrText = AllocateMemory(128+Taille)
	
	SendMessage_(*Ceci\hWnd, #EM_GETTEXTRANGE, 0, @TR)
	Resultat = PeekS(TR\lpstrText,Longueur)
	FreeMemory(TR\lpstrText)
	
	ProcedureReturn  Trim(ReplaceString(ReplaceString(ReplaceString(Resultat,Chr(9)," "),Chr(13)," "),Chr(10)," "))
EndProcedure

ProcedureDLL.i RichEdit_Replace(*Ceci.RichEditClassTemplate, A_Remplacer.s, Texte.s,Drapeaux.i = 0)
	; Description .......:  Remplacer un mot (pas tout le texte!)
	; Paramètre(s) ......:  A_Remplacer.s   - Texte à Remplacé
	;                       Texte.s        - Nouveau Texte, Remplace le Texte dans 'A_Remplacer'
	;                      Drapeaux.i       - Options recherche:
	;                                         0              - Normal
	;                                         #FR_MATCHCASE  - Recherche correspondante
	;                                         #FR_Wholeword  - Mots entiers, pas de sous-mots
	; Valeur(s) retournée(s) ...:  #True si remplacer quelque chose
	
	Protected Info.FINDTEXT, TextLength.i = Len(A_Remplacer)
	Protected Compte.i, Domaine.CHARRANGE,Trouve
	Protected ValeurRetournee = #False
	
	Info\lpstrText  = @A_Remplacer
	Info\chrg\cpMin = 0
	Info\chrg\cpMax = -1
	
	Drapeaux|#FR_DOWN
	
	SendMessage_(*Ceci\hWnd, #EM_SETSEL, 0, 0)
	
	Trouve = SendMessage_(*Ceci\hWnd, #EM_FINDTEXT,Drapeaux, @Info)
	If Trouve > -1
		Info\chrg\cpMin = Trouve + 1
		
		Domaine\cpMin = Trouve
		Domaine\cpMax = Trouve + TextLength
		SendMessage_(*Ceci\hWnd, #EM_EXSETSEL, 0, @Domaine)
		SendMessage_(*Ceci\hWnd, #EM_REPLACESEL, 0, @Texte)
		ValeurRetournee = #True
	EndIf
	ProcedureReturn ValeurRetournee
EndProcedure

ProcedureDLL.i RichEdit_ReplaceAll(*Ceci.RichEditClassTemplate, A_Remplacer.s, Texte.s,Drapeaux.i = 0)
	; Description .......:  Remplacer un mot dans le Texte complet
	; Paramètre(s) ......:  A_Remplacer.s   - Texte à Remplacer
	;                       Texte.s        - Nouveau Texte, Remplace le Texte dans 'A_Remplacer'
	;                      Drapeaux.i       - Options recherche:
	;                                         0              - Normal
	;                                         #FR_MATCHCASE  - Rechercher correspondante
	;                                         #FR_Wholeword  - Mots entiers, pas de sous-mots
	; Valeur(s)  retournée(s) ...:  Nombre de Remplacements
	
	Protected Info.FINDTEXT, LongueurTexte.i = Len(A_Remplacer)
	Protected Compte.i, Domaine.CHARRANGE,Trouve
	
	Info\lpstrText  = @A_Remplacer
	Info\chrg\cpMin = 0
	Info\chrg\cpMax = -1
	
	Drapeaux|#FR_DOWN
	
	SendMessage_(*Ceci\hWnd, #EM_SETSEL, 0, 0)
	
	Repeat
		Trouve = SendMessage_(*Ceci\hWnd, #EM_FINDTEXT,Drapeaux, @Info)
		If Trouve > -1
			Info\chrg\cpMin = Trouve + 1
			
			Domaine\cpMin = Trouve
			Domaine\cpMax = Trouve + LongueurTexte
			SendMessage_(*Ceci\hWnd, #EM_EXSETSEL, 0, @Domaine)
			SendMessage_(*Ceci\hWnd, #EM_REPLACESEL, 0, @Texte)
			Compte + 1
		Else
			ProcedureReturn Compte
		EndIf
	ForEver
EndProcedure

ProcedureDLL.i RichEdit_SetBulleted(*Ceci.RichEditClassTemplate)  
	
	; Description .......:  Démarrer / Modifier la sélection des puces
	
	Protected format.PARAFORMAT
	format\cbSize = SizeOf(PARAFORMAT)
	format\dwMask = #PFM_NUMBERING
	format\wNumbering = #PFN_BULLET
	;A lire en premier
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT, 0, @format)
	
	format\dwMask = #PFM_NUMBERING
	If format\wNumbering = #PFN_BULLET
		format\wNumbering = #Null
	Else
		format\wNumbering = #PFN_BULLET
	EndIf
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETPARAFORMAT, 0, @format)
EndProcedure

ProcedureDLL.i RichEdit_InsertTable(*Ceci.RichEditClassTemplate, cols, rows, cellWidth)
	Protected  i, j, rtfTable.s  
	;initial \par ajoute un saut de ligne POUR ASSURER départs de table sur une nouvelle ligne.
	;trgaph définit marginLeft dans les cellules, en twips (ici 30 twips)
	
	rtfTable = "{\par \trgaph30 "
	For i = 1 To cols
		rtfTable + "\cellx" + Str(i * cellWidth)
	Next
	
	For j = 1 To rows
		rtfTable  + "\intbl "
		For i = 1 To cols
			rtfTable + "\cell "
			
			; Si vous voulez insérer directement du texte, placez-le juste avant \cell 
			; Utilisez la ligne suivante à la place de ce qui précède, pour voir ce que je veux dire
			; rtfTable + "\cellx" + Str(i * cellWidth)
		Next
		rtfTable = rtfTable + "\row"
	Next
	
	rtfTable = rtfTable + "\pard}"
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_REPLACESEL, 0, rtfTable) 
EndProcedure  

ProcedureDLL.i RichEdit_SetModified(*Ceci.RichEditClassTemplate, state.i=#True)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETMODIFY, state ,0) 
EndProcedure  

ProcedureDLL.i RichEdit_GetLineCount(*Ceci.RichEditClassTemplate)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_GETLINECOUNT, 0, 0) 
EndProcedure  

ProcedureDLL.i RichEdit_IsSuperscript(*Ceci.RichEditClassTemplate)
	Protected cf2.CHARFORMAT2\cbsize = SizeOf(CHARFORMAT2)
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT ,#SCF_SELECTION, @cf2)
	
	If cf2\dwEffects &#CFM_SUPERSCRIPT : ProcedureReturn #True : EndIf
	ProcedureReturn #False
	
EndProcedure

ProcedureDLL.i RichEdit_SetSuperscript(*Ceci.RichEditClassTemplate)
	Protected format.CHARFORMAT2
	Protected.i Drapeaux
	format\cbSize = SizeOf(CHARFORMAT2)
	
	;bascule
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, 1, @format)
	Drapeaux=format\dwEffects!Drapeaux
	
	format\dwMask = #CFM_SUPERSCRIPT
	format\dwEffects =Drapeaux
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

ProcedureDLL.i RichEdit_IsSubscript(*Ceci.RichEditClassTemplate)
	Protected cf2.CHARFORMAT2\cbsize = SizeOf(CHARFORMAT2)
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT ,#SCF_SELECTION, @cf2)
	
	If cf2\dwEffects &#CFM_SUBSCRIPT : ProcedureReturn #True : EndIf
	ProcedureReturn #False
	
EndProcedure

ProcedureDLL.i RichEdit_SetSubscript(*Ceci.RichEditClassTemplate)
	Protected format.CHARFORMAT2
	Protected.i Drapeaux
	
	format\cbSize = SizeOf(CHARFORMAT2)
	
	;bascule
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, 1, @format)
	Drapeaux=format\dwEffects!Drapeaux
	
	format\dwMask = #CFM_SUBSCRIPT
	format\dwEffects =Drapeaux
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

ProcedureDLL.i RichEdit_ChangeFontSize(*Ceci.RichEditClassTemplate, iDelta.i=1)
	; Description .......: Augmenter ou diminuer la taille de la police
	; Paramètre .........:  Delta   - Valeur d'incrémentation, Négatif ==> décrémentation 
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETFONTSIZE, iDelta,0)
EndProcedure

ProcedureDLL.i RichEdit_LimitText(*Ceci.RichEditClassTemplate, iLimiter_A.i)
	; Description .......:  Limiter le contrôle à N caractères
	; Paramètre(s) ......:  iLimiter_A - Nombre de caractères
	Protected.i Resultat
	If iLimiter_A > 64000
		Resultat = SendMessage_(*Ceci\hWnd, #EM_EXLIMITTEXT, iLimiter_A, 0)
	Else
		Resultat = SendMessage_(*Ceci\hWnd, #EM_LIMITTEXT, iLimiter_A, 0)
	EndIf
	ProcedureReturn Resultat
EndProcedure

ProcedureDLL.i RichEdit_HideSelection(*Ceci.RichEditClassTemplate, bVal.i=#True)
	; Description .......:  Définit si la marque de sélection est visible.
	; Paramètre(s) ......:  bVal.i - #True pour cacher, #False pour décaché
	ProcedureReturn  SendMessage_(*Ceci\hWnd, #EM_HIDESELECTION, bVal, 0)
EndProcedure

ProcedureDLL.i RichEdit_SetUnderlineWave(*Ceci.RichEditClassTemplate)
	; Description .......:  Pour marquer les passages ou des mots spéciaux avec une ligne ondulée rouge
	;                       soulignée, vous pouvez utiliser cette procédure. 
	;                       L'utilisation est prévue pour ce correcteur orthographique, il est donc toujours
	;                       souligner 'red'. Mais ce n'est qu'un "hack", et la
	;                       coloration du soulignement n'a pas été documentée par ms.
	
	Protected format.CHARFORMAT2
	
	format\cbSize         = SizeOf(CHARFORMAT2)
	format\dwMask         = #CFM_UNDERLINETYPE
	format\dwEffects      = #CFE_UNDERLINE
	format\bUnderlineType = #CFU_UNDERLINEWAVE | $50
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

ProcedureDLL.i Richedit_ClearUnderlineWave(*Ceci.RichEditClassTemplate)
	; Description .......:  Comme la procédure ci-dessus, elle supprime la ligne ondulée rouge
	;                       du texte sélectionné.
	
	Protected format.CHARFORMAT2
	
	format\cbSize     = SizeOf(CHARFORMAT2)
	format\dwMask     = #CFM_UNDERLINETYPE
	format\dwEffects  = 0
	format\bUnderlineType = 0;
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

ProcedureDLL.i RichEdit_Redraw( *Ceci.RichEditClassTemplate )
	; Description .......:  Envoie un message 'RedrawWindow()' pour le gadget.
	;                       Utile après la désactivation / activation du dessin d'un
	;                       Gadget.
	ProcedureReturn RedrawWindow_(*Ceci\hWnd,0,0,#RDW_UPDATENOW|#RDW_ERASE|#RDW_INVALIDATE)          
EndProcedure

ProcedureDLL.i RichEdit_GetTextLength( *Ceci.RichEditClassTemplate )
	Protected LongueurTexte.GETTEXTLENGTHEX
	LongueurTexte\flags = #GTL_NUMCHARS | #GTL_DEFAULT
	
	;suivant le document MS, utiliser 1200 pour Unicode
	CompilerIf #PB_Compiler_Unicode
		LongueurTexte\codepage = 1200
	CompilerElse
		LongueurTexte\codepage = #CP_ACP
	CompilerEndIf
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_GETTEXTLENGTHEX, @LongueurTexte, 0)
	
EndProcedure

ProcedureDLL.i RichEdit_GetTextColor(*Ceci.RichEditClassTemplate)
	Protected CouleurRetournee.i = #White  
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)  
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT,#SCF_SELECTION, @format)  
	
	If (format\dwEffects & #CFE_AUTOCOLOR) = #CFE_AUTOCOLOR
		CouleurRetournee = GetSysColor_(#COLOR_WINDOWTEXT)
	Else
		CouleurRetournee = format\crTextColor
	EndIf  
	ProcedureReturn CouleurRetournee
EndProcedure  

ProcedureDLL.i RichEdit_IsSmallCaps(*Ceci.RichEditClassTemplate)
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)  
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT, #SCF_SELECTION, @format)       
	
	If format\dwEffects & #CFE_SMALLCAPS : ProcedureReturn #True : EndIf
	ProcedureReturn #False 
EndProcedure

ProcedureDLL.i RichEdit_SetSmallCaps(*Ceci.RichEditClassTemplate, bVal.i = #True)
	;Les caractères sont composés en petites capitales. La valeur n'a aucune incidence 
	;sur le comment contrôle affiche le texte.
	
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)  
	format\dwMask = #CFM_SMALLCAPS
	If bVal
		format\dwEffects = #CFE_SMALLCAPS
	EndIf  
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

ProcedureDLL.i RichEdit_IsAllCaps(*Ceci.RichEditClassTemplate)
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)  
	
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT,#SCF_SELECTION, @format)       
	
	If format\dwEffects &#CFE_ALLCAPS : ProcedureReturn #True : EndIf
	ProcedureReturn #False
EndProcedure

ProcedureDLL.i RichEdit_SetAllCaps(*Ceci.RichEditClassTemplate, bVal.i = #True)
	;Les caractères sont en majuscules. La valeur n'affecte pas la façon dont le 
	;contrôle affiche le texte. Cette valeur s'applique uniquement aux versions 
	;antérieures à Microsoft Rich Edit 3.0
	
	Protected format.CHARFORMAT2
	format\cbSize = SizeOf(CHARFORMAT2)  
	format\dwMask = #CFM_ALLCAPS
	If bVal
		format\dwEffects = #CFE_ALLCAPS
	EndIf  
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

ProcedureDLL.i RichEdit_CanPaste(*Ceci.RichEditClassTemplate)
	; Description....: Le contenu du presse-papiers peut-il être collé dans le contrôle?
	;
	; Remarques .......: Des données dans deux formats presse-papiers peuvent être collées. RTF et RTF avec des objets
	;                  Cette fonction détermine si les données sont soit au format soit dans le presse-papiers.
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_CANPASTE, 0, 0)
EndProcedure

ProcedureDLL.i RichEdit_GetCursorPosition(*Ceci.RichEditClassTemplate)
	Protected SelDebut.l
	Protected SelFin.l
	SendMessage_(*Ceci\hWnd, #EM_GETSEL, @SelDebut, @SelFin)
	ProcedureReturn SelDebut
EndProcedure

ProcedureDLL.s RichEdit_GetWordAtPosition(*Ceci.RichEditClassTemplate, Pos.i)
	Protected TR.TEXTRANGE
	Protected Resultat.s
	Protected Debut.i  =      SendMessage_(*Ceci\hWnd, #EM_FINDWORDBREAK, #WB_LEFTBREAK, Pos)
	Protected Longueur.i =  SendMessage_(*Ceci\hWnd, #EM_FINDWORDBREAK, #WB_RIGHTBREAK,Pos) - Debut
	Protected Taille.i
	
	If Longueur<=0 : ProcedureReturn "" : EndIf
	
	
	TR\chrg\cpMin = Debut
	TR\chrg\cpMax = Debut+Longueur
	
	Taille = Longueur * SizeOf(Character)
	TR\lpstrText = AllocateMemory(128+Taille)
	
	SendMessage_(*Ceci\hWnd, #EM_GETTEXTRANGE, 0, @TR)
	
	
	Resultat = PeekS(TR\lpstrText,Longueur)
	FreeMemory(TR\lpstrText)  
	
	ProcedureReturn Trim(ReplaceString(ReplaceString(ReplaceString(Resultat,Chr(9)," "),Chr(13)," "),Chr(10)," "))
EndProcedure

ProcedureDLL.i RichEdit_GetFirstVisibleLineNumber(*Ceci.RichEditClassTemplate)
	Protected Resultat=SendMessage_(*Ceci\hWnd,#EM_GETFIRSTVISIBLELINE,0 ,0)
	ProcedureReturn Resultat
EndProcedure 

ProcedureDLL.i RichEdit_GetFirstVisibleLinePos(*Ceci.RichEditClassTemplate)
	Protected Resultat.i
	Protected iLigneHaut.i= SendMessage_(*Ceci\hWnd,#EM_GETFIRSTVISIBLELINE,0 ,0)
	
	;position du 1er car en ligne iLigneHaut
	Resultat = SendMessage_(*Ceci\hWnd, #EM_LINEINDEX, iLigneHaut ,0) 
	ProcedureReturn Resultat
EndProcedure 

ProcedureDLL.s RichEdit_GetFirstVisibleLineText(*Ceci.RichEditClassTemplate)
	Protected iLigneHaut.i, iLongueurLigne.i, iPosCar.i, Resultat.s
	iLigneHaut=SendMessage_(*Ceci\hWnd, #EM_GETFIRSTVISIBLELINE, 0 ,0)
	iPosCar=SendMessage_(*Ceci\hWnd, #EM_LINEINDEX, iLigneHaut ,0)
	iLongueurLigne=SendMessage_(*Ceci\hWnd, #EM_LINELENGTH ,iPosCar ,0)
	Resultat = Space(iLongueurLigne)
	SendMessage_(*Ceci\hWnd, #EM_GETLINE, iLigneHaut ,@Resultat)
	ProcedureReturn Resultat
EndProcedure 

ProcedureDLL.i RichEdit_GetLastVisibleLineNumber(*Ceci.RichEditClassTemplate)  
	Protected iPremiereLigne.i, iDerniereLigne.i
	Protected p.POINT
	
	p\x = GadgetWidth(*Ceci\ID)
	p\y = GadgetHeight(*Ceci\ID)
	
	iPremiereLigne = SendMessage_(*Ceci\hWnd, #EM_GETFIRSTVISIBLELINE, 0 ,0)
	iDerniereLigne  = SendMessage_(*Ceci\hWnd, #EM_CHARFROMPOS, 0, @p)
	iDerniereLigne   = SendMessage_(*Ceci\hWnd, #EM_LINEFROMCHAR, iDerniereLigne, 0)
	
	ProcedureReturn  iDerniereLigne    
EndProcedure  

ProcedureDLL.i RichEdit_GetLastVisibleLinePos(*Ceci.RichEditClassTemplate)
	Protected *self.RichEdit = *Ceci  ;L'accès à leurs propres fonctions de classe
	Protected Resultat.i  
	Protected iLigneBas.i= *self\GetLastVisibleLineNumber()  
	
	Resultat = SendMessage_(*Ceci\hWnd, #EM_LINEINDEX, iLigneBas+1 ,0) 
	ProcedureReturn Resultat
EndProcedure 

ProcedureDLL.s RichEdit_GetLastVisibleLineText(*Ceci.RichEditClassTemplate)  
	Protected *Auto.RichEdit = *Ceci  ;L'accès à leurs propres fonctions de classe
	Protected iLongueurLigne.i, iPosCar.i, Resultat.s  
	Protected iLigneBas.i = *Auto\GetLastVisibleLineNumber()
	
	iPosCar=SendMessage_(*Ceci\hWnd  , #EM_LINEINDEX, iLigneBas ,0)
	iLongueurLigne=SendMessage_(*Ceci\hWnd, #EM_LINELENGTH ,iPosCar ,0)
	Resultat = Space(iLongueurLigne)
	SendMessage_(*Ceci\hWnd, #EM_GETLINE, iLigneBas ,@Resultat)
	
	ProcedureReturn Resultat     
EndProcedure  

ProcedureDLL.i RichEdit_GetCharPosOfPreviousWord(*Ceci.RichEditClassTemplate, Pos.i)
	ProcedureReturn SendMessage_( *Ceci\hWnd, #EM_FINDWORDBREAK, #WB_MOVEWORDLEFT, pos)
EndProcedure  

ProcedureDLL.i RichEdit_GetCharPosOfNextWord(*Ceci.RichEditClassTemplate, pos)
	ProcedureReturn SendMessage_( *Ceci\hWnd, #EM_FINDWORDBREAK, #WB_MOVEWORDRIGHT, pos)
EndProcedure  

ProcedureDLL.i RichEdit_EmptyUndoBuffer(*Ceci.RichEditClassTemplate)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_EMPTYUNDOBUFFER, 0, 0) 
EndProcedure

ProcedureDLL.i RichEdit_GetFirstCharPosOnLine(*Ceci.RichEditClassTemplate, iLigne.i)  
	If iLigne > 0 : iLigne -1 : EndIf
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_LINEINDEX, iLigne, 0)   
EndProcedure

ProcedureDLL.i RichEdit_GetLineLength(*Ceci.RichEditClassTemplate, iLigne.i)
	Protected.RichEdit *Auto     = *Ceci  ;L'accès à leurs propres fonctions de classe
	Protected.i        PosCar
	
	PosCar = *Auto\GetFirstCharPosOnLine(iLigne)
	
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_LINELENGTH, PosCar, 0) 
EndProcedure

ProcedureDLL.i RichEdit_IsAlignLeft(*Ceci.RichEditClassTemplate)
	;Vérifie si le paragraphe est aligné à gauche
	Protected paraf.PARAFORMAT2\cbSize = SizeOf(PARAFORMAT2)
	Protected bRet.i = #False
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT ,#Null, @paraf)  
	If paraf\wAlignment = #PFA_LEFT : bRet = #True: EndIf  
	ProcedureReturn bRet  
EndProcedure

ProcedureDLL.i RichEdit_IsAlignCenter(*Ceci.RichEditClassTemplate)
	;Vérifie si le paragraphe est centré
	Protected paraf.PARAFORMAT2\cbSize = SizeOf(PARAFORMAT2)
	Protected bRet.i = #False
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT ,#Null, @paraf)
	If paraf\wAlignment = #PFA_CENTER : bRet = #True: EndIf  
	ProcedureReturn bRet  
EndProcedure

ProcedureDLL.i RichEdit_IsAlignRight(*Ceci.RichEditClassTemplate)
	;Vérifie si le paragraphe est aligné à droite
	Protected paraf.PARAFORMAT2\cbSize = SizeOf(PARAFORMAT2)
	Protected bRet.i = #False
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT ,#Null, @paraf)
	If paraf\wAlignment = #PFA_RIGHT : bRet = #True: EndIf  
	ProcedureReturn bRet  
EndProcedure

ProcedureDLL.i RichEdit_IsAlignJustify(*Ceci.RichEditClassTemplate)
	;Vérifie si le paragraphe est justifié Aligner à droite
	Protected paraf.PARAFORMAT2\cbSize = SizeOf(PARAFORMAT2)
	Protected bRet.i = #False
	SendMessage_(*Ceci\hWnd, #EM_GETPARAFORMAT ,#Null, @paraf)
	If paraf\wAlignment = #PFA_JUSTIFY : bRet = #True: EndIf  
	ProcedureReturn bRet  
EndProcedure

ProcedureDLL.i RichEdit_GetWordUnderCursorStart(*Ceci.RichEditClassTemplate)
	ProcedureReturn *Ceci\WordUnderCursorRange\cpMin
EndProcedure

ProcedureDLL.i RichEdit_GetWordUnderCursorEnd(*Ceci.RichEditClassTemplate)
	ProcedureReturn *Ceci\WordUnderCursorRange\cpMax
EndProcedure

ProcedureDLL.i RichEdit_GetScrollPosX(*Ceci.RichEditClassTemplate)
	Protected pt.POINT
	SendMessage_(*Ceci\hWnd, #EM_GETSCROLLPOS, 0 , @pt)  
	ProcedureReturn pt\x
EndProcedure

ProcedureDLL.i RichEdit_GetScrollPosY(*Ceci.RichEditClassTemplate)
	Protected pt.POINT
	SendMessage_(*Ceci\hWnd, #EM_GETSCROLLPOS, 0 , @pt)  
	ProcedureReturn pt\y
EndProcedure

ProcedureDLL.i RichEdit_SetScrollPos(*Ceci.RichEditClassTemplate,x.i,y.i)
	Protected pt.POINT
	pt\x = x
	pt\y = y  
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETSCROLLPOS, 0 , @pt)   
EndProcedure

ProcedureDLL.i RichEdit_SetLink(*Ceci.RichEditClassTemplate, bVal.i = #True)
	Protected Format.CHARFORMAT
	With Format
		\cbSize = SizeOf(CHARFORMAT)
		\dwMask = #CFM_LINK
		If bVal        
			\dwEffects = #CFE_LINK
		EndIf    
	EndWith  
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION, @Format)   
EndProcedure

ProcedureDLL.i RichEdit_SetUndoLimit(*Ceci.RichEditClassTemplate, Limite.l)
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETUNDOLIMIT, Limite, 0)   
EndProcedure

ProcedureDLL.i RichEdit_AppendText(*Ceci.RichEditClassTemplate, sTexte.s)
	Protected.SETTEXTEX DefinirTexte  
	Protected.i NbreLignes  = SendMessage_(*Ceci\Hwnd, #EM_GETLINECOUNT, 0, 0)
	Protected.i IndexLigne  = SendMessage_(*Ceci\Hwnd, #EM_LINEINDEX, NbreLignes-1, 0)
	Protected.i LongueurLigne = SendMessage_(*Ceci\Hwnd, #EM_LINELENGTH, IndexLigne, 0)
	
	LongueurLigne + IndexLigne
	
	SendMessage_(*Ceci\Hwnd, #EM_SETSEL, LongueurLigne, LongueurLigne)
	SendMessage_(*Ceci\Hwnd, #EM_HIDESELECTION, 0, 0)
	
	;Suivant la doc MS, 1200 pour Unicode
	CompilerIf #PB_Compiler_Unicode
		DefinirTexte\codepage = 1200
	CompilerElse
		DefinirTexte\codepage = #CP_ACP
	CompilerEndIf
	
	DefinirTexte\flags = #ST_SELECTION
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETTEXTEX, @DefinirTexte, @sTexte)
EndProcedure

ProcedureDLL.i RichEdit_SetHidden(*Ceci.RichEditClassTemplate, bVal.i = #True)
	Protected Format.CHARFORMAT2
	With Format
		\cbSize = SizeOf(CHARFORMAT2)
		\dwMask = #CFM_HIDDEN
		If bVal       
			\dwEffects = #CFE_HIDDEN
		EndIf    
	EndWith  
	ProcedureReturn SendMessage_(*Ceci\hWnd, #EM_SETCHARFORMAT, #SCF_SELECTION | #SCF_USEUIRULES, @Format)   
EndProcedure

ProcedureDLL.i RichEdit_IsHidden(*Ceci.RichEditClassTemplate)
	Protected Format.CHARFORMAT2
	With Format
		\cbSize = SizeOf(CHARFORMAT2)
		\dwMask = #CFM_HIDDEN
	EndWith  
	
	
	SendMessage_(*Ceci\hWnd, #EM_GETCHARFORMAT ,#SCF_SELECTION | #SCF_USEUIRULES , @format)
	If format\dwEffects & #CFE_HIDDEN : ProcedureReturn #True : EndIf
	ProcedureReturn #False   
EndProcedure

ProcedureDLL.i RichEdit_SetTextEx(*Ceci.RichEditClassTemplate, sTexte.s)
	Protected tx.SETTEXTEX
	Protected *mem
	Protected.SETTEXTEX DefinirTexte
	
	;;Suivant la doc MS, 1200 pour Unicode
	CompilerIf #PB_Compiler_Unicode
		DefinirTexte\codepage = 1200
		*mem = AllocateMemory(MemoryStringLength(@sTexte , #PB_Unicode) + 1)
	CompilerElse
		DefinirTexte\codepage = #CP_ACP
		*mem = AllocateMemory(MemoryStringLength(@sTexte , #PB_UTF8) + 1)
	CompilerEndIf  
	
	If *mem 
		
		PokeS(*mem , sTexte , -1 , #PB_UTF8) 
		SendMessage_(*Ceci\hwnd, #EM_SETTEXTEX , tx , *mem) 
		FreeMemory(*mem)
	EndIf
EndProcedure

ProcedureDLL.i RichEdit_SetInterface(*Ceci.RichEditClassTemplate) 
	*Ceci\RichComObject\pIntf = ?vTable_RichEditOle
	*Ceci\RichComObject\hwnd = *Ceci\hWnd
	SendMessage_(*Ceci\hWnd, #EM_SETOLECALLBACK, 0, *Ceci\RichComObject)
	
	ProcedureReturn *Ceci\RichComObject
EndProcedure

ProcedureDLL RichEdit_SetImage(*Ceci.RichEditClassTemplate, hImage)
	Protected rtf$, bitmap.BITMAP, screenDC, hdcMF, hMF, hdc 
	Protected oldImage, widthTwips, heightTwips, numBytes, mem, *bytes.BYTE, *string.WORD, i, low, high 
	Protected tx.SETTEXTEX
	Protected *mem
	
	If GetObject_(hImage, SizeOf(BITMAP), bitmap) 
		If bitmap\bmWidth And bitmap\bmHeight 
			screenDC = GetDC_(0) 
			;Créer un EMF pour tenir le bitmap.
			hdcMF = CreateMetaFile_(0) 
			If hdcMF 
				SetMapMode_(hdcMF, #MM_ANISOTROPIC) 
				SetWindowOrgEx_(hdcMF, 0, 0, 0) 
				SetWindowExtEx_(hdcMF, bitmap\bmWidth, bitmap\bmHeight, 0) 
				hdc = CreateCompatibleDC_(screenDC) 
				If hdc 
					oldImage = SelectObject_(hdc, hImage) 
					BitBlt_(hdcMF, 0, 0, bitmap\bmWidth, bitmap\bmHeight, hdc, 0, 0, #SRCCOPY) 
					SelectObject_(hdc, oldImage) 
					DeleteDC_(hdc) 
					hMF = CloseMetaFile_(hdcMF) 
					If hMF 
						;Avant de créer l'en-tête RTF nous devons calculer la largeur d'image / taille en twips.
						widthTwips = MulDiv_(bitmap\bmWidth,1440,GetDeviceCaps_(screenDC, #LOGPIXELSX)) 
						heightTwips = MulDiv_(bitmap\bmHeight,1440,GetDeviceCaps_(screenDC, #LOGPIXELSY)) 
						;Maintenant, l'en-tête RTF.
						rtf$ = "{\rtf1{\pict\wmetafile8\picw" + Str(bitmap\bmWidth) + "\pich" + Str(bitmap\bmHeight) + "\picwgoal" + Str(widthTwips) + "\pichgoal" + Str(heightTwips) + " " 
						;Ajouter les bits MF comme double caractère hexadécimal.
						;D'abord récupérer les bits MF.
						numBytes = GetMetaFileBitsEx_(hMF, 0, 0) 
						mem = AllocateMemory(numBytes*3) 
						If mem 
							If GetMetaFileBitsEx_(hMF, numBytes, mem) = numBytes 
								*bytes=mem : *string = mem + numBytes 
								For i = 0 To numBytes-1 
									low = (*bytes\b)&$f + '0': high = (*bytes\b)>>4&$f + '0' 
									If low > '9' 
										low + 7 
									EndIf 
									If high > '9' 
										high + 7 
									EndIf 
									*string\w = low<<8 + high 
									*string + 2 
									*bytes + 1 
								Next 
								rtf$ + PeekS(mem + numBytes, numBytes<<1, #PB_Ascii) + "}}" 
							Else 
								rtf$ = "" 
							EndIf 
							FreeMemory(mem) 
						Else 
							rtf$ = "" 
						EndIf 
						DeleteMetaFile_(hMF) 
					EndIf      
				Else 
					hMF = CloseEnhMetaFile_(hdcMF) 
					DeleteEnhMetaFile_(hMF) 
				EndIf 
			EndIf 
			ReleaseDC_(0, screenDC) 
		EndIf 
	EndIf
	If rtf$
		*mem = AllocateMemory(StringByteLength(rtf$ , #PB_UTF8) + 1) 
		tx\flags = #ST_SELECTION
		If *mem
			PokeS(*mem , rtf$ , -1 , #PB_UTF8)
			SendMessage_(*Ceci\hwnd, #EM_SETTEXTEX , tx , *mem)
			FreeMemory(*mem)
		EndIf
		ProcedureReturn #True
	EndIf
	
	ProcedureReturn #False
EndProcedure

;{ Interface pour rappel OLE
ProcedureDLL RichEdit_QueryInterface(*pObject.RichEditOle, REFIID, *ppvObj.Integer) 
	Protected *pointeur.IRicheditOle 
	*pointeur=*pObject 
	If CompareMemory(REFIID, ?IID_IUnknown, 16) = 1 Or CompareMemory(REFIID, ?IID_IRichEditOleCallback, 16) = 1 
		*ppvObj\i = *pObject 
		*pointeur\AddRef() 
		ProcedureReturn #S_OK 
	Else 
		*ppvObj=0 
		ProcedureReturn #E_NOINTERFACE 
	EndIf 
EndProcedure

ProcedureDLL RichEdit_AddRef(*pObject.RichEditOle) 
	*pObject\Refcount + 1 
	ProcedureReturn *pObject\Refcount 
EndProcedure 

ProcedureDLL RichEdit_Release(*pObject.RichEditOle) 
	*pObject\Refcount - 1 
	If *pObject\Refcount > 0 
		ProcedureReturn *pObject\Refcount 
	Else 
		*pObject = 0 
	EndIf 
EndProcedure 

ProcedureDLL RichEdit_GetInPlaceContext(*pObject.RichEditOle, lplpFrame, lplpDoc, lpFrameInfo) 
	ProcedureReturn #E_NOTIMPL 
EndProcedure 

ProcedureDLL RichEdit_ShowContainerUI(*pObject.RichEditOle, fShow) 
	ProcedureReturn #E_NOTIMPL 
EndProcedure 

ProcedureDLL RichEdit_QueryInsertObject(*pObject.RichEditOle, lpclsid, lpstg, cp) 
	ProcedureReturn #S_OK 
EndProcedure 

ProcedureDLL RichEdit_DeleteObject(*pObject.RichEditOle, lpoleobj) 
	ProcedureReturn #E_NOTIMPL 
EndProcedure 

ProcedureDLL RichEdit_QueryAcceptData(*pObject.RichEditOle, lpdataobj, lpcfFormat, reco, fReally, hMetaPict) 
	ProcedureReturn #S_OK 
EndProcedure 

ProcedureDLL RichEdit_ContextSensitiveHelp(*pObject.RichEditOle, fEnterMode) 
	ProcedureReturn #E_NOTIMPL 
EndProcedure 

ProcedureDLL RichEdit_GetClipboardData(*pObject.RichEditOle, lpchrg, reco, lplpdataobj) 
	ProcedureReturn #E_NOTIMPL 
EndProcedure 

ProcedureDLL RichEdit_GetDragDropEffect(*pObject.RichEditOle, fDrag, grfKeyState, pdwEffect) 
	ProcedureReturn #E_NOTIMPL 
EndProcedure 

ProcedureDLL RichEdit_GetContextMenu(*pObject.RichEditOle, seltype.w, lpoleobj, lpchrg, lphmenu) 
	ProcedureReturn #E_NOTIMPL 
EndProcedure

ProcedureDLL RichEdit_GetNewStorage(*pObject.RichEditOle, lplpstg) 
	Protected sc, lpLockBytes, t.ILockBytes 
	;Essayer de créer un objet tableau d'octets qui agit en tant que «fondation» pour le fichier composé à venir.
	sc = CreateILockBytesOnHGlobal_(#Null, #True, @lpLockBytes) 
	If sc ;Cela signifie que l'allocation a échoué.
		ProcedureReturn sc 
	EndIf 
	;Allocation réussie si nous essayons maintenant de créer un objet de stockage composé de fichier.
	sc=StgCreateDocfileOnILockBytes_(lpLockBytes, #STGM_SHARE_EXCLUSIVE|#STGM_READWRITE|#STGM_CREATE, 0, lplpstg) 
	t = lpLockBytes 
	t\Release()  
EndProcedure 
;}
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: le format RTF

Message par Micoute »

Suite

Code : Tout sélectionner

DataSection
	IID_ITextDocument:  ; {8CC497C0-A1DF-11ce-8098-00AA0047BE5D}
	Data.l $8CC497C0
	Data.w $A1DF, $11ce
	Data.b $80, $98, $00, $AA, $00, $47, $BE, $5D
	
	IID_IRichEditOleCallback: ;" 0x00020D03, 0, 0, 0xC0,0,0,0,0,0,0,0x46" 
	Data.l $00020D03 
	Data.w $0000,$0000 
	Data.b $C0,$00,$00,$00,$00,$00,$00,$46  
	
	IID_IUnknown:   ;"{00000000-0000-0000-C000-000000000046}" 
	Data.l $00000000 
	Data.w $0000,$0000 
	Data.b $C0,$00,$00,$00,$00,$00,$00,$46  
	
	vTable_RichEditOle: 
	Data.i @RichEdit_QueryInterface(), @RichEdit_AddRef(), @RichEdit_Release(), @RichEdit_GetNewStorage() 
	Data.i @RichEdit_GetInPlaceContext(), @RichEdit_ShowContainerUI(), @RichEdit_QueryInsertObject() 
	Data.i @RichEdit_DeleteObject(), @RichEdit_QueryAcceptData(), @RichEdit_ContextSensitiveHelp(), @RichEdit_GetClipboardData() 
	Data.i @RichEdit_GetDragDropEffect(), @RichEdit_GetContextMenu() 
	
	
	
	vTable_RichEditClassTemplate:
	Data.i @RichEdit_Free()
	Data.i @RichEdit_GetID()
	Data.i @RichEdit_GethWnd()
	Data.i @RichEdit_GetX()
	Data.i @RichEdit_GetY()
	Data.i @RichEdit_GetWidth()
	Data.i @RichEdit_GetHeight()
	Data.i @RichEdit_GetReadOnly()
	Data.i @RichEdit_GetCursorX()
	Data.i @RichEdit_GetCursorY()
	Data.i @RichEdit_GetFont()
	Data.i @RichEdit_GetFontSize()
	Data.i @RichEdit_GetFontStyle()
	Data.i @RichEdit_GetZoom()
	Data.i @RichEdit_Resize()
	Data.i @RichEdit_DisableRedraw()
	Data.i @RichEdit_Clear()
	Data.i @RichEdit_GetText()
	Data.i @RichEdit_GetRTFText()
	Data.i @RichEdit_GetSelText()
	Data.i @RichEdit_FindText()
	Data.i @RichEdit_CountWords()
	Data.i @RichEdit_Cut()
	Data.i @RichEdit_Copy()
	Data.i @RichEdit_Paste()
	Data.i @RichEdit_BeginUndo()
	Data.i @RichEdit_StopUndo()
	Data.i @RichEdit_CanUndo()
	Data.i @RichEdit_Undo()
	Data.i @RichEdit_Redo()
	Data.i @RichEdit_LoadRTF()
	Data.i @RichEdit_LoadText()
	Data.i @RichEdit_SaveRTF()
	Data.i @RichEdit_SaveText()
	Data.i @RichEdit_Print()
	Data.i @RichEdit_SetFont()
	Data.i @RichEdit_SetFontSize()
	Data.i @RichEdit_SetFontStyle()
	Data.i @RichEdit_SetZoom()
	Data.i @RichEdit_SetAlignment()
	Data.i @RichEdit_SetLeftMargin()
	Data.i @RichEdit_SetRightMargin()
	Data.i @RichEdit_SetCtrlBackColor()
	
	Data.i @RichEdit_SetTextBackColor()
	Data.i @RichEdit_GetTextBackColor()
	Data.i @RichEdit_ClearTextBackColor() 
	Data.i @RichEdit_SetTextColor()
	Data.i @RichEdit_SetSelection()
	Data.i @RichEdit_IsTextSelected()
	Data.i @RichEdit_SetText()
	Data.i @RichEdit_SetReadOnly()
	Data.i @RichEdit_SetCursorPos()
	Data.i @RichEdit_SetWordWrap()
	Data.i @RichEdit_SelectAll()
	Data.i @RichEdit_Unselect()
	Data.i @RichEdit_Indent()
	Data.i @RichEdit_Outdent()
	
	Data.i @RichEdit_ScrollToLine()
	Data.i @RichEdit_GetParagraphAlign()
	
	Data.i @RichEdit_GetLineSpacing()
	Data.i @RichEdit_SetLineSpacing()
	Data.i @RichEdit_IsModified()
	Data.i @RichEdit_SetModified()
	Data.i @RichEdit_IsLink()
	
	Data.i @RichEdit_GetWordUnderMouse()
	Data.i @RichEdit_GetCurrentWord()
	Data.i @RichEdit_Replace()
	Data.i @RichEdit_ReplaceAll()
	Data.i @RichEdit_SetBulleted()
	
	Data.i @RichEdit_GetLineCount()
	
	Data.i @RichEdit_IsSuperscript()
	Data.i @RichEdit_SetSuperscript()
	Data.i @RichEdit_IsSubscript()
	Data.i @RichEdit_SetSubscript()
	Data.i @RichEdit_ChangeFontSize()
	Data.i @RichEdit_LimitText()
	Data.i @RichEdit_HideSelection()
	Data.i @RichEdit_SetUnderlineWave()
	Data.i @Richedit_ClearUnderlineWave()
	Data.i @RichEdit_Redraw()
	Data.i @RichEdit_GetTextLength()
	Data.i @RichEdit_GetTextColor()
	Data.i @RichEdit_IsSmallCaps()
	Data.i @RichEdit_SetSmallCaps()
	Data.i @RichEdit_IsAllCaps()
	Data.i @RichEdit_SetAllCaps()
	Data.i @RichEdit_CanPaste()
	Data.i @RichEdit_GetCursorPosition()
	Data.i @RichEdit_GetWordAtPosition()
	Data.i @RichEdit_GetFirstVisibleLineNumber()
	Data.i @RichEdit_GetFirstVisibleLinePos()
	Data.i @RichEdit_GetFirstVisibleLineText()
	Data.i @RichEdit_GetLastVisibleLineNumber()  
	Data.i @RichEdit_GetLastVisibleLinePos()
	Data.i @RichEdit_GetLastVisibleLineText()  
	Data.i @RichEdit_GetCharPosOfPreviousWord()
	Data.i @RichEdit_GetCharPosOfNextWord()
	Data.i @RichEdit_EmptyUndoBuffer()
	Data.i @RichEdit_GetFirstCharPosOnLine()  
	Data.i @RichEdit_GetLineLength()  
	
	Data.i @RichEdit_IsAlignLeft()
	Data.i @RichEdit_IsAlignCenter()
	Data.i @RichEdit_IsAlignRight()
	Data.i @RichEdit_IsAlignJustify()
	
	Data.i @RichEdit_GetWordUnderCursorStart()
	Data.i @RichEdit_GetWordUnderCursorEnd()
	
	Data.i @RichEdit_GetScrollPosX()
	Data.i @RichEdit_GetScrollPosY()
	Data.i @RichEdit_SetScrollPos()
	Data.i @RichEdit_SetLink()
	Data.i @RichEdit_SetUndoLimit()
	
	Data.i @RichEdit_AppendText()
	Data.i @RichEdit_SetHidden()
	Data.i @RichEdit_IsHidden()
	Data.i @RichEdit_SetTextEx()
	
	Data.i @RichEdit_SetInterface()
	Data.i @RichEdit_SetImage()
EndDataSection 
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: le format RTF

Message par Micoute »

EnableExplicit

XIncludeFile "RichEdit.pbi"

Enumeration
#Fenetre_principale
#Barre_D_Outils
#Barre_Statut
#Menu
#Menu_PopUp
#im_coul_texte
#im_coul_fond
#im_coul_page
; Articles boîte à outil
#menu_Nouveau
#menu_Ouvrir
#menu_Sauvegarde
#menu_Imprimer
#menu_Quitter
#menu_Police
#menu_Rechercher
#menu_Couper
#menu_Copier
#menu_Coller
#menu_Defaire
#menu_Refaire
#menu_Gras
#menu_Italique
#menu_Souligne
#menu_Barre
#menu_Gauche
#menu_Centrer
#menu_Droite
#menu_SelectionnerTout
#menu_Tabulation
#menu_Retrait
#menu_Puces
#menu_Interligne_1
#menu_Interligne_1_5
#menu_Interligne_2_0
#menu_Zoom_10
#menu_Zoom_25
#menu_Zoom_50
#menu_Zoom_75
#menu_Zoom_100
#menu_Zoom_125
#menu_Zoom_150
#menu_Zoom_200
#menu_Zoom_400
; images
#ico_New
#ico_Open
#ico_Save
#ico_Print
#ico_Font
#ico_Search
#ico_Cut
#ico_Copy
#ico_Paste
#ico_Undo
#ico_Redo
#ico_Bold
#ico_Italic
#ico_Underline
#ico_Strikeout
#ico_Left
#ico_Center
#ico_Right
#ico_SelectAll
#ico_Indent
#ico_Outdent
#ico_List
EndEnumeration

Global.RichEdit Editeur; Variable d'objet pour notre contrôle RTF
Global.s Fichier, Titre.s = "PurePad par Micoute"
Global.i Resultat, i, j, mx, my, align, j, num_pal, id_im, l_pal, h_pal, x, y, l, h, espace, id_palette, num_palette, num_coul, Couleur
Global Dim Couleur_Base(10)
Global Dim Couleur_perso(2,10)

CatchImage(#ico_New, ?ico_new)
CatchImage(#ico_Open, ?ico_open)
CatchImage(#ico_Save, ?ico_save)
CatchImage(#ico_Print, ?ico_print)
CatchImage(#ico_Font, ?ico_font)
CatchImage(#ico_Search, ?ico_search)
CatchImage(#ico_Cut, ?ico_cut)
CatchImage(#ico_Copy, ?ico_copy)
CatchImage(#ico_Paste, ?ico_paste)
CatchImage(#ico_Undo, ?ico_undo)
CatchImage(#ico_Redo, ?ico_redo)
CatchImage(#ico_Bold, ?ico_bold)
CatchImage(#ico_Italic, ?ico_italic)
CatchImage(#ico_Underline, ?ico_underline)
CatchImage(#ico_Strikeout, ?ico_strikeout)
CatchImage(#ico_Left, ?ico_left)
CatchImage(#ico_Center, ?ico_center)
CatchImage(#ico_Right, ?ico_right)
CatchImage(#ico_SelectAll, ?ico_selectall)
CatchImage(#ico_Indent, ?ico_indent)
CatchImage(#ico_Outdent, ?ico_outdent)
CatchImage(#ico_List, ?ico_list)

Procedure Initialise_Couleur(); Couleur de la palette de base

i=0
Couleur_Base(i) = $000000 : i=i+1
Couleur_Base(i) = $000001 : i=i+1
Couleur_Base(i) = $0000FF : i=i+1
Couleur_Base(i) = $00FFFF : i=i+1
Couleur_Base(i) = $FF00FF : i=i+1
Couleur_Base(i) = $00FF00 : i=i+1
Couleur_Base(i) = $FFFF00 : i=i+1
Couleur_Base(i) = $FF0000 : i=i+1
Couleur_Base(i) = $008000 : i=i+1
Couleur_Base(i) = $FFFFFF : i=i+1


For i=0 To 2
For j=0 To 9
Couleur_perso(i,j)=$E26152 ; bleu foncé
Next

Next

EndProcedure

Procedure Create_palette(id_im,l,h)
Select id_im
Case #im_coul_texte
num_pal=0
Case #im_coul_fond
num_pal=1

Case #im_coul_page
num_pal=2
EndSelect

CreateImage(id_im,l,h+10)
StartDrawing(ImageOutput(id_im))
Box(0,0+10,l,h,$C0C0C0) ; fond gris clair
For i=0 To 10
Box(i*l/10,0+10,l/10-1,h/2-1,$9A9A9A) ; gris
Next
Box(1,0+1+10,l/10-3,h/2-3,$FFFFFF) ; blanc
LineXY(1,0+1+10,l/10-3,h/2-3+10,$0000FF)
For i=1 To 10
Box(i*l/10+1,0+1+10,l/10-3,h/2-3,Couleur_Base(i))
Next
For i=0 To 10
Box(i*l/10+1,h/2+1+10,l/10-3,h/2-3,Couleur_perso(num_pal,i))
Next
StopDrawing()
SetGadgetState(id_im,ImageID( id_im))

EndProcedure

Procedure Dessine_palette()
x=5
y=GetSystemMetrics_(#SM_CYSCREEN)-780
l=GetSystemMetrics_(#SM_CXSCREEN)-20
h=80
espace=5
l_pal=l/3-espace
h_pal=40
;OpenWindow(#Fenetre_principale, x, Y, l, h, "Palette de couleurs")
TextGadget(#PB_Any,x,y+h,l_pal,h_pal,"Couleur du texte", #PB_Text_Center)
TextGadget(#PB_Any,x+l_pal+espace,y+h,l_pal,h_pal,"Couleur du fond du texte", #PB_Text_Center)
TextGadget(#PB_Any,x+2*l_pal+2*espace,y+h,l_pal,h_pal,"Couleur de la page", #PB_Text_Center)
ImageGadget(#im_coul_texte,x,20,l_pal,h_pal,0)
Create_palette(#im_coul_texte,l_pal,h_pal)
ImageGadget(#im_coul_fond,x+l_pal+espace,20,l_pal,h_pal,0)
Create_palette(#im_coul_fond,l_pal,h_pal)
ImageGadget(#im_coul_page,x+2*l_pal+2*espace,20,l_pal,h_pal,0)
Create_palette(#im_coul_page,l_pal,h_pal)
;TextGadget(#PB_Any,x+l_pal+espace,20+h_pal,l_pal,20,"Clic droit pour choisir une Couleur", #PB_Text_Center)
EndProcedure

Procedure AddMenuEdition()
MenuItem(#menu_Rechercher, "Chercher ...", ImageID(#ico_Search))
MenuBar()
MenuItem(#menu_Couper, "Couper", ImageID(#ico_Cut))
MenuItem(#menu_Copier, "Copier", ImageID(#ico_Copy))
MenuItem(#menu_Coller, "Coller", ImageID(#ico_Paste))
MenuBar()
MenuItem(#menu_SelectionnerTout, "Sélectionner tout", ImageID(#ico_SelectAll))
MenuBar()
MenuItem(#menu_Interligne_1 , "Interligne" + " 1.0")
MenuItem(#menu_Interligne_1_5, "Interligne" + " 1.5")
MenuItem(#menu_Interligne_2_0, "Interligne" + " 2.0")
EndProcedure

Procedure AddMenuZoom()
MenuItem(#menu_Zoom_10, "10%")
MenuItem(#menu_Zoom_25, "25%")
MenuItem(#menu_Zoom_50, "50%")
MenuItem(#menu_Zoom_75, "75%")
MenuItem(#menu_Zoom_100, "100%")
MenuItem(#menu_Zoom_125, "125%")
MenuItem(#menu_Zoom_150, "150%")
MenuItem(#menu_Zoom_200, "200%")
MenuItem(#menu_Zoom_400, "400%")
EndProcedure

Procedure SetStatusbarText()
If Editeur
StatusBarText(#Barre_Statut, 0, " " + "Ligne" + " " + Str(Editeur\GetCursorY()))
StatusBarText(#Barre_Statut, 1, " " + "Colonne" + " " + Str(Editeur\GetCursorX()))
StatusBarText(#Barre_Statut, 4, " Nombre de mots: " + Str(Editeur\CountWords()))
If Couleur = 0
Couleur = Editeur\GetTextColor()
EndIf
StatusBarText(#Barre_Statut, 5, Editeur\GetFont() + "("+Str(Editeur\GetFontSize())+") Style("+RSet(Hex(Editeur\GetFontStyle()),3,"0")+") Couleur texte("+RSet(Hex(Editeur\GetTextColor()),6,"0")+") Couleur fond("+RSet(Hex(Editeur\GetTextBackColor()),6,"0")+")")
Else
StatusBarText(#Barre_Statut, 0, " " + "Ligne" + " 1")
StatusBarText(#Barre_Statut, 1, " " + "Colonne" + " 1")
StatusBarText(#Barre_Statut, 2, " Mot: ")
StatusBarText(#Barre_Statut, 3, " Zoom: 100%")
StatusBarText(#Barre_Statut, 4, " Mots: 0 Lignes: 0")
StatusBarText(#Barre_Statut, 5, " ")
EndIf
EndProcedure

Macro UpdateToolbar()
SetToolBarButtonState(#Barre_D_Outils, #menu_Gras, Editeur\GetFontStyle() & #PB_Font_Bold)
SetToolBarButtonState(#Barre_D_Outils, #menu_Italique, Editeur\GetFontStyle() & #PB_Font_Italic)
SetToolBarButtonState(#Barre_D_Outils, #menu_Souligne,Editeur\GetFontStyle() & #PB_Font_Underline)
SetToolBarButtonState(#Barre_D_Outils, #menu_Barre, Editeur\GetFontStyle() & #PB_Font_StrikeOut)

SetToolBarButtonState(#Barre_D_Outils, #menu_Gauche, Editeur\IsAlignLeft() )
SetToolBarButtonState(#Barre_D_Outils, #menu_Centrer, Editeur\IsAlignCenter() )
SetToolBarButtonState(#Barre_D_Outils, #menu_Droite, Editeur\IsAlignRight() )
EndMacro

Procedure CentrerTitreFenetre(TitreFenetre.s, NumeroFenetre)
Protected NCM.NonClientMetrics, ValeurRetournee, DcSauve, AncObjet
Protected hFonteConsole, HdcCourant, TailleTs.SIZE
Protected Espace_a_remplir, RectFenetre.Rect, NbrEspaceDemandes

NCM\cbSize = SizeOf(NCM)
ValeurRetournee = SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, 0, @NCM, 0)
hFonteConsole = CreateFontIndirect_(@NCM\lfCaptionFont)
If hFonteConsole <> 0
HdcCourant = GetDC_(WindowID(NumeroFenetre))
DcSauve = SaveDC_(HdcCourant)
AncObjet = SelectObject_(HdcCourant, hFonteConsole)
ValeurRetournee = GetWindowRect_(WindowID(NumeroFenetre), @RectFenetre)
ValeurRetournee = GetTextExtentPoint32_(HdcCourant, @TitreFenetre, Len(TitreFenetre), @TailleTs)
Espace_a_remplir = RectFenetre\right - RectFenetre\left - 4 * NCM\iCaptionWidth - TailleTs\cx
ValeurRetournee = GetTextExtentPoint32_(HdcCourant, " ", 1, @TailleTs)
NbrEspaceDemandes = (Espace_a_remplir / TailleTs\cx)/2
If NbrEspaceDemandes > 0
TitreFenetre = Space(NbrEspaceDemandes) + TitreFenetre
EndIf
EndIf
ValeurRetournee = SetWindowText_(WindowID(NumeroFenetre), TitreFenetre)
ValeurRetournee = RestoreDC_(HdcCourant, DcSauve) ; mettre en ordre
ValeurRetournee = DeleteObject_(hFonteConsole)
ReleaseDC_(WindowID(NumeroFenetre), HdcCourant)
EndProcedure

Initialise_Couleur()

OpenWindow(#Fenetre_principale, 0, 0, GetSystemMetrics_(#SM_CXSCREEN)-20, GetSystemMetrics_(#SM_CYSCREEN)-40, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
CentrerTitreFenetre(Titre, 0)
Dessine_palette()

If CreateImageMenu(#Menu, WindowID(#Fenetre_principale))
MenuTitle("Fichier")
MenuItem(#menu_Nouveau, "Nouveau", ImageID(#ico_New))
MenuItem(#menu_Ouvrir, "Ouvrir", ImageID(#ico_Open))
MenuItem(#menu_Sauvegarde, "Sauvegarder", ImageID(#ico_Save))
MenuBar()
MenuItem(#menu_Imprimer, "Imprimer", ImageID(#ico_Print))
MenuItem(#menu_Police, "Sélectionner police", ImageID(#ico_Font))
MenuBar()
MenuItem(#menu_Quitter, "Quitter le programme")
MenuTitle("Edition")
AddMenuEdition()
MenuTitle("Zoom")
AddMenuZoom()
EndIf
If CreatePopupImageMenu(#Menu_PopUp, WindowID(#Fenetre_principale))
AddMenuEdition()
MenuBar()
AddMenuZoom()
EndIf
If CreateToolBar(#Barre_D_Outils, WindowID(#Fenetre_principale))
ToolBarImageButton(#menu_Nouveau, ImageID(#ico_New))
ToolBarToolTip(#Barre_D_Outils, #menu_Nouveau, "Nouveau fichier")
ToolBarImageButton(#menu_Ouvrir, ImageID(#ico_Open))
ToolBarToolTip(#Barre_D_Outils, #menu_Ouvrir, "Ouvrir fichier")
ToolBarImageButton(#menu_Sauvegarde, ImageID(#ico_Save))
ToolBarToolTip(#Barre_D_Outils, #menu_Sauvegarde, "Sauvegarder fichier")
ToolBarSeparator()
ToolBarImageButton(#menu_Imprimer, ImageID(#ico_Print))
ToolBarToolTip(#Barre_D_Outils, #menu_Imprimer, "Imprimer")
ToolBarImageButton(#menu_Police, ImageID(#ico_Font))
ToolBarToolTip(#Barre_D_Outils, #menu_Police, "Sélectionner police")
ToolBarImageButton(#menu_Rechercher, ImageID(#ico_Search))
ToolBarToolTip(#Barre_D_Outils, #menu_Rechercher, "Chercher ...")
ToolBarSeparator()
ToolBarImageButton(#menu_Couper, ImageID(#ico_Cut))
ToolBarToolTip(#Barre_D_Outils, #menu_Couper, "Couper")
ToolBarImageButton(#menu_Copier, ImageID(#ico_Copy))
ToolBarToolTip(#Barre_D_Outils, #menu_Copier, "Copier")
ToolBarImageButton(#menu_Coller, ImageID(#ico_Paste))
ToolBarToolTip(#Barre_D_Outils, #menu_Coller, "Coller")
ToolBarSeparator()
ToolBarImageButton(#menu_SelectionnerTout, ImageID(#ico_SelectAll))
ToolBarToolTip(#Barre_D_Outils, #menu_SelectionnerTout, "Sélectionner tout")
ToolBarSeparator()
ToolBarImageButton(#menu_Defaire, ImageID(#ico_Undo))
ToolBarToolTip(#Barre_D_Outils, #menu_Defaire, "Défaire")
DisableToolBarButton(#Barre_D_Outils, #menu_Defaire, #True)
ToolBarImageButton(#menu_Refaire, ImageID(#ico_Redo))
ToolBarToolTip(#Barre_D_Outils, #menu_Refaire, "Refaire")
DisableToolBarButton(#Barre_D_Outils, #menu_Refaire, #True)
ToolBarSeparator()
ToolBarImageButton(#menu_Gras, ImageID(#ico_Bold), #PB_ToolBar_Toggle)
ToolBarToolTip(#Barre_D_Outils, #menu_Gras, "Gras")
ToolBarImageButton(#menu_Italique, ImageID(#ico_Italic), #PB_ToolBar_Toggle)
ToolBarToolTip(#Barre_D_Outils, #menu_Italique, "Italique")
ToolBarImageButton(#menu_Souligne, ImageID(#ico_Underline), #PB_ToolBar_Toggle)
ToolBarToolTip(#Barre_D_Outils, #menu_Souligne, "Souligné")
ToolBarImageButton(#menu_Barre, ImageID(#ico_Strikeout), #PB_ToolBar_Toggle)
ToolBarToolTip(#Barre_D_Outils, #menu_Barre, "Barré")
ToolBarSeparator()
ToolBarImageButton(#menu_Gauche, ImageID(#ico_Left))
ToolBarToolTip(#Barre_D_Outils, #menu_Gauche, "Aligner à gauche")
ToolBarImageButton(#menu_Centrer, ImageID(#ico_Center))
ToolBarToolTip(#Barre_D_Outils, #menu_Centrer, "Centrer")
ToolBarImageButton(#menu_Droite, ImageID(#ico_Right))
ToolBarToolTip(#Barre_D_Outils, #menu_Gauche, "Aligner à droite")
ToolBarSeparator()
ToolBarImageButton(#menu_Tabulation, ImageID(#ico_Indent))
ToolBarToolTip(#Barre_D_Outils, #menu_Tabulation, "Augmenter le retrait")
ToolBarImageButton(#menu_Retrait, ImageID(#ico_Outdent))
ToolBarToolTip(#Barre_D_Outils, #menu_Retrait, "Diminuer le retrait")
ToolBarSeparator()
ToolBarImageButton(#menu_Puces, ImageID(#ico_List))
ToolBarToolTip(#Barre_D_Outils, #menu_Puces, "Liste")
EndIf

If CreateStatusBar(#Barre_Statut, WindowID(#Fenetre_principale))
AddStatusBarField(80)
AddStatusBarField(80)
AddStatusBarField(200)
AddStatusBarField(80)
AddStatusBarField(140)
AddStatusBarField(#PB_Ignore)
SetStatusbarText()
EndIf

Editeur = New_RichEdit(0, 80,GetSystemMetrics_(#SM_CXSCREEN)-15, GetSystemMetrics_(#SM_CYSCREEN)-165); nous pouvons ignorer la taille, s'adapte à la taille de l'événement!
Editeur\SetLeftMargin(5)
Editeur\SetRightMargin(5)
Editeur\SetInterface()

Repeat ;- Boucle d'évènements
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break

;Case #PB_Event_SizeWindow
; Editeur\Resize(0, ToolBarHeight(#Barre_D_Outils), WindowWidth(#Fenetre_principale), WindowHeight(#Fenetre_principale) - ToolBarHeight(#Barre_D_Outils) - StatusBarHeight(#Barre_Statut) - MenuHeight())

Case #WM_LBUTTONUP
If GetActiveGadget() = Editeur\GetID()
SetStatusbarText()
UpdateToolbar()
EndIf

Case #WM_MOUSEMOVE
mx = WindowMouseX(#Fenetre_principale) - GadgetX(Editeur\GetID())
my = WindowMouseY(#Fenetre_principale) - GadgetY(Editeur\GetID())
StatusBarText(#Barre_Statut, 2, " Mot: " + Editeur\GetWordUnderMouse(mx,my))

;Case #WM_RBUTTONDOWN
; If GetActiveGadget() = Editeur\GetID()
; DisplayPopupMenu(#Menu_PopUp, WindowID(#Fenetre_principale))
; EndIf

Case #PB_Event_Gadget
Select EventGadget()
Case Editeur\GetID()
If EventType() = #PB_EventType_Change; Ce n'est pas un gadget éditeur prise en charge normale
SetStatusbarText()
DisableToolBarButton(#Barre_D_Outils, #menu_Defaire, Editeur\CanUndo() ! 1)
UpdateToolbar()
EndIf
Case #im_coul_texte ;- Couleur texte
id_palette = #im_coul_texte
num_palette=id_palette-#im_coul_texte
num_coul=(WindowMouseX(#Fenetre_principale)-GadgetX(id_palette))/(GadgetWidth(id_palette)/10)
Select EventType()
Case #PB_EventType_LeftClick
If WindowMouseY(#Fenetre_principale)-GadgetY(id_palette)<GadgetHeight(id_palette)/2
Couleur=Couleur_Base(num_coul)
Else
Couleur=Couleur_perso(num_palette,num_coul)
EndIf
Editeur\SetTextColor(Couleur)
Case #PB_EventType_RightClick
If WindowMouseY(#Fenetre_principale)-GadgetY(id_palette)<GadgetHeight(id_palette)/2
Couleur_Base(num_coul)=ColorRequester()
Couleur = Couleur_Base(num_coul)
Else
Couleur_perso(num_palette,num_coul)=ColorRequester()
Couleur = Couleur_perso(num_palette,num_coul)
EndIf
Editeur\SetTextColor(Couleur)
Dessine_palette()
EndSelect
Case #im_coul_fond ;- Couleur fond
id_palette = #im_coul_fond
num_palette=id_palette-#im_coul_texte
num_coul=(WindowMouseX(#Fenetre_principale)-GadgetX(id_palette))/(GadgetWidth(id_palette)/10)
Select EventType()
Case #PB_EventType_LeftClick
If WindowMouseY(#Fenetre_principale)-GadgetY(id_palette)<GadgetHeight(id_palette)/2
Couleur=Couleur_Base(num_coul)
Else
Couleur=Couleur_perso(num_palette,num_coul)
EndIf
Editeur\SetTextBackColor(Couleur)
Case #PB_EventType_RightClick
If WindowMouseY(#Fenetre_principale)-GadgetY(id_palette)<GadgetHeight(id_palette)/2
Couleur_Base(num_coul)=ColorRequester()
Couleur = Couleur_Base(num_coul)
Else

Couleur_perso(num_palette,num_coul)=ColorRequester()
Couleur = Couleur_perso(num_palette,num_coul)
EndIf
Editeur\SetTextBackColor(Couleur)
Dessine_palette()
EndSelect
Case #im_coul_page ;- Couleur page
id_palette = #im_coul_page
num_palette=id_palette-#im_coul_texte
num_coul=(WindowMouseX(#Fenetre_principale)-GadgetX(id_palette))/(GadgetWidth(id_palette)/10)
Select EventType()
Case #PB_EventType_LeftClick
If WindowMouseY(#Fenetre_principale)-GadgetY(id_palette)<GadgetHeight(id_palette)/2
Couleur=Couleur_Base(num_coul)
Else
Couleur=Couleur_perso(num_palette,num_coul)
EndIf
Editeur\SetCtrlBackColor(Couleur)
Case #PB_EventType_RightClick
If WindowMouseY(#Fenetre_principale)-GadgetY(id_palette)<GadgetHeight(id_palette)/2
Couleur_Base(num_coul)=ColorRequester()
Couleur = Couleur_Base(num_coul)
Else

Couleur_perso(num_palette,num_coul)=ColorRequester()
Couleur = Couleur_perso(num_palette,num_coul)
EndIf
Editeur\SetCtrlBackColor(Couleur)
Dessine_palette()
EndSelect
EndSelect

Case #PB_Event_Menu
Select EventMenu()
Case #menu_Nouveau
Editeur\Clear()
SetStatusbarText()
DisableToolBarButton(#Barre_D_Outils, #menu_Defaire, Editeur\CanUndo() ! 1)
DisableToolBarButton(#Barre_D_Outils, #menu_Refaire, #True)
Case #menu_Ouvrir
Fichier = OpenFileRequester("Sélectionner fichier RTF", "", "RichText (*.rtf)|*.rtf", 0)
If Fichier
Editeur\LoadRTF(Fichier)
SetStatusbarText()
CentrerTitreFenetre(Fichier, 0)
DisableToolBarButton(#Barre_D_Outils, #menu_Defaire, Editeur\CanUndo() ! 1)
DisableToolBarButton(#Barre_D_Outils, #menu_Refaire, #True)
EndIf
Case #menu_Sauvegarde
Fichier = SaveFileRequester("Sauvegarder sous", "", "RichText (*.rtf)|*.rtf", 0)
If Fichier
Editeur\SaveRTF(Fichier)
DisableToolBarButton(#Barre_D_Outils, #menu_Defaire, Editeur\CanUndo() ! 1)
DisableToolBarButton(#Barre_D_Outils, #menu_Refaire, #True)
EndIf
Case #menu_Quitter
CloseWindow(#Fenetre_principale)
End
Case #menu_Imprimer
Editeur\Print("PurePad", #True); Impression avec Dialogue
Case #menu_Police
Resultat = FontRequester(Editeur\GetFont(), Editeur\GetFontSize(), #PB_FontRequester_Effects)
If Resultat
Editeur\SetFont(SelectedFontName())
Editeur\SetFontSize(SelectedFontSize())
Editeur\SetFontStyle(SelectedFontStyle())
Editeur\SetTextColor(SelectedFontColor())
SetToolBarButtonState(#Barre_D_Outils, #menu_Gras, SelectedFontStyle() & #PB_Font_Bold)
SetToolBarButtonState(#Barre_D_Outils, #menu_Italique, SelectedFontStyle() & #PB_Font_Italic)
SetToolBarButtonState(#Barre_D_Outils, #menu_Souligne, SelectedFontStyle() & #PB_Font_Underline)
SetToolBarButtonState(#Barre_D_Outils, #menu_Barre, SelectedFontStyle() & #PB_Font_StrikeOut)
EndIf
Case #menu_Rechercher
Fichier = InputRequester("Recherche PurePad", "Insérer le texte à chercher!", "")
If Fichier
If Editeur\FindText(Fichier)
MessageBeep_(#MB_OK)
Else
MessageBeep_(#MB_ICONERROR)
EndIf
EndIf
Case #menu_Couper
Editeur\Cut()
Case #menu_Copier
Editeur\Copy()
Case #menu_Coller
Editeur\Paste()
Case #menu_Defaire
Editeur\Undo()
DisableToolBarButton(0, #menu_Refaire, #False)
Case #menu_Refaire
Editeur\Redo()
Case #menu_SelectionnerTout
Editeur\SelectAll()
Case #menu_Puces
Editeur\SetBulleted()
Case #menu_Gras, #menu_Italique, #menu_Souligne, #menu_Barre
Resultat = 0
If GetToolBarButtonState(#Barre_D_Outils, #menu_Gras)
Resultat | #PB_Font_Bold
EndIf
If GetToolBarButtonState(#Barre_D_Outils, #menu_Italique)
Resultat | #PB_Font_Italic
EndIf
If GetToolBarButtonState(#Barre_D_Outils, #menu_Souligne)
Resultat | #PB_Font_Underline
EndIf
If GetToolBarButtonState(#Barre_D_Outils, #menu_Barre)
Resultat | #PB_Font_StrikeOut
EndIf
Editeur\SetFontStyle(Resultat)
Case #menu_Gauche
Editeur\SetAlignment()
Case #menu_Centrer
Editeur\SetAlignment(#PB_Text_Center)
Case #menu_Droite
Editeur\SetAlignment(#PB_Text_Right)
Case #menu_Tabulation
Editeur\Indent()
Case #menu_Retrait
Editeur\Outdent()
Case #menu_Zoom_10
Editeur\SetZoom(10)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_25
Editeur\SetZoom(25)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_50
Editeur\SetZoom(50)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_75
Editeur\SetZoom(75)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_100
Editeur\SetZoom(100)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_125
Editeur\SetZoom(125)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_150
Editeur\SetZoom(150)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_200
Editeur\SetZoom(200)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Zoom_400
Editeur\SetZoom(400)
StatusBarText(#Barre_Statut, 3, " Zoom: " + Str(Editeur\GetZoom()) +"%")
Case #menu_Interligne_1
Editeur\SetLineSpacing(1.0)
Case #menu_Interligne_1_5
Editeur\SetLineSpacing(1.5)
Case #menu_Interligne_2_0
Editeur\SetLineSpacing(2.0)
EndSelect
EndSelect

ForEver

End

DataSection
ico_new: IncludeBinary "Icones\New.ico"
ico_open: IncludeBinary "Icones\Open.ico"
ico_save: IncludeBinary "Icones\Save.ico"
ico_print: IncludeBinary "Icones\Printer.ico"
ico_font: IncludeBinary "Icones\FontDialog.ico"
ico_search: IncludeBinary "Icones\Find.ico"
ico_cut: IncludeBinary "Icones\Cut.ico"
ico_copy: IncludeBinary "Icones\Copy.ico"
ico_paste: IncludeBinary "Icones\Paste.ico"
ico_undo: IncludeBinary "Icones\Undo.ico"
ico_redo: IncludeBinary "Icones\Redo.ico"
ico_bold_de: IncludeBinary "Icones\Bold_DE.ico"
ico_bold: IncludeBinary "Icones\Bold.ico"
ico_italic_de: IncludeBinary "Icones\Italic_DE.ico"
ico_italic: IncludeBinary "Icones\Italic.ico"
ico_underline: IncludeBinary "Icones\Underline.ico"
ico_strikeout: IncludeBinary "Icones\Strikeout.ico"
ico_left: IncludeBinary "Icones\Left.ico"
ico_center: IncludeBinary "Icones\Center.ico"
ico_right: IncludeBinary "Icones\Right.ico"
ico_selectall: IncludeBinary "Icones\SelectAll.ico"
ico_indent: IncludeBinary "Icones\Indent.ico"
ico_outdent: IncludeBinary "Icones\Outdent.ico"
ico_list: IncludeBinary "Icones\List.ico"

EndDataSection
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: le format RTF

Message par Micoute »

Code et exemples à l'adresse suivante: http://dl.free.fr/i9QTCMxFe

j'espère que ça va te faire plaisir, ainsi qu'à tous les autres qui seront intéressés !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Re: le format RTF

Message par jbernard13 »

Merci Micoute , j'en demander pas tant ...
Jbernard13
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: le format RTF

Message par Kwai chang caine »

Merci du partage de ce travail impréssionant 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: le format RTF

Message par Micoute »

Qui peut le plus, peut le moins, donc il y aura du tri à faire !
Et ne sommes-nous pas sur un forum où on peut tout partager ?
En tous cas, c'est ce que je souhaite et conseille vivement !
C'est dans ce sens que je pense qu'on devrait avoir intérêt à ce que les autres soient plus riches, car on serait encore plus riche d'amis !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: le format RTF

Message par falsam »

Micoute a écrit :C'est dans ce sens que je pense qu'on devrait avoir intérêt à ce que les autres soient plus riches, car on serait encore plus riche d'amis !
Vivement une bonne engueulade bien franchouille parce là on commence à se faire chier. :p

http://www.youtube.com/watch?v=zoDi3qwFtms
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: le format RTF

Message par comtois »

on dit aussi
le savoir est la seule chose qui augmente quand on la partage
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: le format RTF

Message par falsam »

A propos de Comtois :) , Ce lien http://purebasic.developpez.com A voir pour les nouveaux ainsi que les anciens qui se cantonnent à rester sur ce forum :p

Les sources référencés par comtois : http://purebasic.developpez.com/sources/

Concernant du code sur le format RTF. Un éditeur ainsi que d'autres exemples consacrés au format RTF à télécharger sur ce lien : http://purebasic.developpez.com/sources/?page=RichEdit (Téléchargement en bas de la page)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: le format RTF

Message par djes »

Yep ! Merci à Micoute et à Comtois :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: le format RTF

Message par Kwai chang caine »

falsam a écrit :
Micoute a écrit :C'est dans ce sens que je pense qu'on devrait avoir intérêt à ce que les autres soient plus riches, car on serait encore plus riche d'amis !
Vivement une bonne engueulade bien franchouille parce là on commence à se faire chier. :p
:lol: :lol: :lol: :lol:
J'adore ces acteurs !!
Blier rien que le voir...trop du bonheur "On tourne en rond.."
http://www.youtube.com/watch?v=b_PB7612 ... t&index=38
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: le format RTF

Message par blendman »

salut

J4ai testé les exemples richedit et j'ai ajouté quelques bricoles, histoire d'avoir un wordpad un peu amélioré ^^.
ça marche super bien avec la reconnaissance vocale.

Par contre, je n'ai pas réussi à ajouter une marge en haut et en bas au gadget editor, savez-vous comment on fait ?
je cherche l'équivalent de ça, mais en haut et en bas :

Code : Tout sélectionner

SendMessage_(GadgetID(1), #EM_SETMARGINS, #EC_LEFTMARGIN, 20)
Pour infos, la procédure dans le zip donné plus haut ressemble à ça (pour la marge droite) :

Code : Tout sélectionner

Procedure RichEdit_SetRightMargin(*this.RichEditClassTemplate, pixel.w, PageW, PageH, LeftM, TopM, RightM, BottomM)
   SendMessage_(*this\hWnd, #EM_SETMARGINS, #EC_RIGHTMARGIN, $FFFF * pixel)
EndProcedure

J'ai trouvé le code suivant,mais il ne marche pas avec l'include du zip (richedit.pbi) :

Code : Tout sélectionner

  r.RECT
  r\left = LeftM
  r\top = TopM
  r\right = PageW - RightM
  r\bottom = PageH - BottomM
  width = r\right - r\left
  height = r\bottom - r\top
  SendMessage_(*this\hWnd, #EM_SETRECTNP, 0, r)
 
Si vous avez une solution, n'hésitez pas ;)

Merci
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: le format RTF

Message par G-Rom »

Salut Blendman , perso j'aurais passé l'adresse de r en paramètre :
qu'est ce que ca donne ?

Code : Tout sélectionner

  r.RECT
  r\left = LeftM
  r\top = TopM
  r\right = PageW - RightM
  r\bottom = PageH - BottomM
  width = r\right - r\left
  height = r\bottom - r\top
  SendMessage_(*this\hWnd, #EM_SETRECTNP, 0, @r)
Répondre