OVH Cloud OVH Cloud

Rich text box

9 réponses
Avatar
patrice henrio
Où trouver un bon tutorial sur l'utilisation des Rich Text Box
En particulier je souhaiterai à partir d'un RTB contenant un texte et un
scroll vertical, rechercher l'occurence d'une chaîne et placer le texte dans
la fenêtre de telle façon que ce qui est cherché soit à peu près au milieu
de la fenêtre.

9 réponses

Avatar
Zoury
Salut Patrice! :O)

Voici un exemple
'***
' Ajouter la composante Microsoft Rich TextBox Control 6.0 (SP3)
' Form1
' 1 TextBox
' 1CommandButton
' 1 RichTextBox, ScrollBars = 3 - rtfBoth (ou 2 - rtfVertical, mais
autant mettre les deux tant qu'a en mettre une...)
Option Explicit

Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long

Private Type POINT
x As Long
y As Long
End Type

Private Const WM_USER As Long = &H400
Private Const EM_POSFROMCHAR As Long = WM_USER + 38
Private Const EM_SETSCROLLPOS As Long = WM_USER + 222

Private Sub Command1_Click()
Dim lPos As Long
lPos = RichTextBox1.Find(Text1.Text)
If lPos > -1 Then
RichTextBox1.SelStart = lPos
RichTextBox1.SelLength = Len(Text1.Text)
Call SetScrollPos(RichTextBox1)
Else
Call MsgBox("Le texte recherché est introuvable.", vbOKOnly,
"RichTextBox - Exemple de Find()")
End If
End Sub

Private Sub Form_Load()
RichTextBox1.HideSelection = False
RichTextBox1.Text = GetFileText("C:Program FilesMicrosoft Visual
StudioREDIST.TXT")
Text1.Text = "Faite votre rechercher ici..."
Command1.Default = True
Command1.TabIndex = 0
Text1.TabIndex = 0
RichTextBox1.TabIndex = 0
Me.Caption = "RichTextBox - Exemple de Find()"
End Sub

Private Function GetFileText(ByRef sFileName As String) As String

Dim hFile As Integer

hFile = FreeFile
Open sFileName For Binary As #hFile
GetFileText = String$(LOF(hFile), Chr$(0))
Get #hFile, , GetFileText
Close #hFile

End Function

Private Sub Text1_GotFocus()
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End Sub

Private Sub SetScrollPos(ByRef rtb As RichTextLib.RichTextBox)

Dim pt As POINT

Call SendMessage(rtb.hwnd, EM_POSFROMCHAR, ByVal VarPtr(pt), ByVal
rtb.SelStart)
pt.y = pt.y - ((rtb.Height TextHeight("A") 2) * (TextHeight("A")
Screen.TwipsPerPixelY))
Call SendMessage(rtb.hwnd, EM_SETSCROLLPOS, 0, pt)

End Sub
'***

pt.y = pt.y - ((rtb.Height TextHeight("A") 2) * (TextHeight("A")
Screen.TwipsPerPixelY))
Si on met la ligne ci-haut en commentaire, le mot sélectionner apparaîtra en
haut sur la première ligne du RTB.

(rtb.Height TextHeight("A") 2)
La première partie permet de calculer le nombre de ligne affiché par le RTB.

(TextHeight("A") Screen.TwipsPerPixelY)
La deuxième partie permet de calculer la hauteur en pixel d'une ligne.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"patrice henrio" wrote in message
news:%
Où trouver un bon tutorial sur l'utilisation des Rich Text Box
En particulier je souhaiterai à partir d'un RTB contenant un texte et un
scroll vertical, rechercher l'occurence d'une chaîne et placer le texte


dans
la fenêtre de telle façon que ce qui est cherché soit à peu près au milieu
de la fenêtre.




Avatar
patrice henrio
Merci beaucoup.
J'ai encore quelques questions.

Tout d'abord quelle est la signification cachée des trois constantes privées
WM_USER ..., J'ai l'impreesion que cela a à voir avec la largeur et la
hauteur du RTB

J'ai utilisé la version SP4 du RTB, est-ce que cela a une quelconque
importance ?

Pourquoi utiliser Call et non pas directement le nom de la sub ?

J'utilise un fichier au format RTF, aussi j'ai utilisé RichTextBox1.TextRTF
au lieu de RichTextBox1.text. Est-ce que cela me cache quelque chose
d'important.

Pour l'instant le RTB ne positionne pas la recherche au milieu mais en bas
de la fenêtre. peut-être est-ce justement lié aux constantes évoquées
ci-dessus ? Comment donner à ces constantes des valeurs liées à ma fenêtre
que l'utilisateur ne peut pas redimensionner ?

J'utilise seulement le scrollbar vertical car je veux que tout le texte
s'affiche dans la largeur de la fenêtre. mais peut-être que cela n'a pas
d'importance.


Je m'aperçois que j'ai encore beaucoup de progrès à faire en VB.

En tout cas, merci beaucoup de votre aide.

"Zoury" a écrit dans le message de
news:%
Salut Patrice! :O)

Voici un exemple
'***
' Ajouter la composante Microsoft Rich TextBox Control 6.0 (SP3)
' Form1
' 1 TextBox
' 1CommandButton
' 1 RichTextBox, ScrollBars = 3 - rtfBoth (ou 2 - rtfVertical, mais
autant mettre les deux tant qu'a en mettre une...)
Option Explicit

Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any _
) As Long

Private Type POINT
x As Long
y As Long
End Type

Private Const WM_USER As Long = &H400
Private Const EM_POSFROMCHAR As Long = WM_USER + 38
Private Const EM_SETSCROLLPOS As Long = WM_USER + 222

Private Sub Command1_Click()
Dim lPos As Long
lPos = RichTextBox1.Find(Text1.Text)
If lPos > -1 Then
RichTextBox1.SelStart = lPos
RichTextBox1.SelLength = Len(Text1.Text)
Call SetScrollPos(RichTextBox1)
Else
Call MsgBox("Le texte recherché est introuvable.", vbOKOnly,
"RichTextBox - Exemple de Find()")
End If
End Sub

Private Sub Form_Load()
RichTextBox1.HideSelection = False
RichTextBox1.Text = GetFileText("C:Program FilesMicrosoft Visual
StudioREDIST.TXT")
Text1.Text = "Faite votre rechercher ici..."
Command1.Default = True
Command1.TabIndex = 0
Text1.TabIndex = 0
RichTextBox1.TabIndex = 0
Me.Caption = "RichTextBox - Exemple de Find()"
End Sub

Private Function GetFileText(ByRef sFileName As String) As String

Dim hFile As Integer

hFile = FreeFile
Open sFileName For Binary As #hFile
GetFileText = String$(LOF(hFile), Chr$(0))
Get #hFile, , GetFileText
Close #hFile

End Function

Private Sub Text1_GotFocus()
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
End Sub

Private Sub SetScrollPos(ByRef rtb As RichTextLib.RichTextBox)

Dim pt As POINT

Call SendMessage(rtb.hwnd, EM_POSFROMCHAR, ByVal VarPtr(pt), ByVal
rtb.SelStart)
pt.y = pt.y - ((rtb.Height TextHeight("A") 2) * (TextHeight("A")
Screen.TwipsPerPixelY))
Call SendMessage(rtb.hwnd, EM_SETSCROLLPOS, 0, pt)

End Sub
'***

pt.y = pt.y - ((rtb.Height TextHeight("A") 2) * (TextHeight("A")
Screen.TwipsPerPixelY))
Si on met la ligne ci-haut en commentaire, le mot sélectionner apparaîtra


en
haut sur la première ligne du RTB.

(rtb.Height TextHeight("A") 2)
La première partie permet de calculer le nombre de ligne affiché par le


RTB.

(TextHeight("A") Screen.TwipsPerPixelY)
La deuxième partie permet de calculer la hauteur en pixel d'une ligne.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"patrice henrio" wrote in message
news:%
> Où trouver un bon tutorial sur l'utilisation des Rich Text Box
> En particulier je souhaiterai à partir d'un RTB contenant un texte et un
> scroll vertical, rechercher l'occurence d'une chaîne et placer le texte
dans
> la fenêtre de telle façon que ce qui est cherché soit à peu près au


milieu
> de la fenêtre.
>
>




Avatar
Zoury
Re-Salut Patrice! :O)

Tout d'abord quelle est la signification cachée des trois constantes


privées
WM_USER ..., J'ai l'impreesion que cela a à voir avec la largeur et la
hauteur du RTB



Nope. Et leur signification n'est pas cachée du tout. :O)

La constante WM_USER est une constante désignant le début des valeurs des
constantes utilisateurs. Elle n'est jamais utilisée seule.
La constante EM_POSFROMCHAR désigne "Position à partir du caractère". Elle
renvoi la position, exprimée par une structure POINTL, en pixels d'un
caractère en fonction de son "index" (position) dans la chaine. Le premier
caractère de la chaine ayant l'index 0.

pour plus d'info sur EM_POSFROMCHAR
http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_posfromchar.asp

La constante EM_SETSCROLLPOS désgine "Initialiser la position de la
scrollbar". Elle positionne la scrollbar à un point particulier, exprimé par
une structure POINT (indentique à POINTL).

pour plus d'info sur EM_SETSCROLLPOS
http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditmessages/em_setscrollpos.asp



J'ai utilisé la version SP4 du RTB, est-ce que cela a une quelconque
importance ?



Non. Les messages devraient fonctionner quand même.



Pourquoi utiliser Call et non pas directement le nom de la sub ?



Ça ne change rien. C'est seulement une question de goût­.

'***
' Les syntaxes suivantes ne tiennent pas
' compte de la valeur de retour
Call MaFunction(mon_param)
Call MaSub(mon_param)
MaFunction mon_param
MaSub mon_param

' Affecte i par la valeur de retour
Dim i As Long
i = MaFunction(mon_param)

' **ATTENTION A CETTE SYNTAXE**
' La syntaxe suivante ne fait pas toujours ce qu'elle
' semble indiquer. Dans ce cas ci, elle passe le
' paramètre comme prévue..
MaFunction (mon_param)

' Prenons l'exemple suivant :
' La fonction reçoit le paramètre *qui est un objet*.
' Cependant, au lieu de passer l'objet en paramètre
' VB "évaluera l'expression *avant* de la passé. Donc
' si l'objet à propriété par défaut, c'est cette propriété qui
' sera passé en paramètre, causant une erreur de type
' non correspondant (Type mismatch)
MaFunction (mon_param_objet)
'***

J'utilise un fichier au format RTF, aussi j'ai utilisé


RichTextBox1.TextRTF
au lieu de RichTextBox1.text. Est-ce que cela me cache quelque chose
d'important.



Ce n'est pas supposé. Le RTF est un format de texte tout comme le HTML. Le
résultat de ce texte formatté est disponible par la propriété Text et est
affiché à l'écran. Le code fournit ne travaille qu'avec le texte standard et
non le RTF.

Pour l'instant le RTB ne positionne pas la recherche au milieu mais en bas
de la fenêtre. peut-être est-ce justement lié aux constantes évoquées
ci-dessus ? Comment donner à ces constantes des valeurs liées à ma fenêtre
que l'utilisateur ne peut pas redimensionner ?



Ça n'est pas liée à ces constantes. Je ne sais pas encore à quoi c'est lié,
mais les constantes n'y sont pour rien. Elles ne font que désigne quel
traitement SendMessage doit envoyé. J'ai fait d'autre test, et la position
prise par la ScrollBar n'est pas toujours exacte. :O/

Je vais faire d'autre test et tenterai de trouvé le problème.

J'utilise seulement le scrollbar vertical car je veux que tout le texte
s'affiche dans la largeur de la fenêtre. mais peut-être que cela n'a pas
d'importance.



hmm.. C'est dur a dire pous l'instant étant donné que le résultat obtenu
n'est pas le bon. Une fois débuggé nous pourrons mieux voir si ça affecte ou
pas.


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
patrice henrio
Merci, super sympa.
"Zoury" a écrit dans le message de
news:
Re-Salut Patrice! :O)

> Tout d'abord quelle est la signification cachée des trois constantes
privées
> WM_USER ..., J'ai l'impreesion que cela a à voir avec la largeur et la
> hauteur du RTB

Nope. Et leur signification n'est pas cachée du tout. :O)

La constante WM_USER est une constante désignant le début des valeurs des
constantes utilisateurs. Elle n'est jamais utilisée seule.
La constante EM_POSFROMCHAR désigne "Position à partir du caractère". Elle
renvoi la position, exprimée par une structure POINTL, en pixels d'un
caractère en fonction de son "index" (position) dans la chaine. Le premier
caractère de la chaine ayant l'index 0.

pour plus d'info sur EM_POSFROMCHAR



http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_posfromchar.asp

La constante EM_SETSCROLLPOS désgine "Initialiser la position de la
scrollbar". Elle positionne la scrollbar à un point particulier, exprimé


par
une structure POINT (indentique à POINTL).

pour plus d'info sur EM_SETSCROLLPOS



http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditmessages/em_setscrollpos.asp



> J'ai utilisé la version SP4 du RTB, est-ce que cela a une quelconque
> importance ?

Non. Les messages devraient fonctionner quand même.



> Pourquoi utiliser Call et non pas directement le nom de la sub ?

Ça ne change rien. C'est seulement une question de goût­.

'***
' Les syntaxes suivantes ne tiennent pas
' compte de la valeur de retour
Call MaFunction(mon_param)
Call MaSub(mon_param)
MaFunction mon_param
MaSub mon_param

' Affecte i par la valeur de retour
Dim i As Long
i = MaFunction(mon_param)

' **ATTENTION A CETTE SYNTAXE**
' La syntaxe suivante ne fait pas toujours ce qu'elle
' semble indiquer. Dans ce cas ci, elle passe le
' paramètre comme prévue..
MaFunction (mon_param)

' Prenons l'exemple suivant :
' La fonction reçoit le paramètre *qui est un objet*.
' Cependant, au lieu de passer l'objet en paramètre
' VB "évaluera l'expression *avant* de la passé. Donc
' si l'objet à propriété par défaut, c'est cette propriété qui
' sera passé en paramètre, causant une erreur de type
' non correspondant (Type mismatch)
MaFunction (mon_param_objet)
'***

> J'utilise un fichier au format RTF, aussi j'ai utilisé
RichTextBox1.TextRTF
> au lieu de RichTextBox1.text. Est-ce que cela me cache quelque chose
> d'important.

Ce n'est pas supposé. Le RTF est un format de texte tout comme le HTML. Le
résultat de ce texte formatté est disponible par la propriété Text et est
affiché à l'écran. Le code fournit ne travaille qu'avec le texte standard


et
non le RTF.

> Pour l'instant le RTB ne positionne pas la recherche au milieu mais en


bas
> de la fenêtre. peut-être est-ce justement lié aux constantes évoquées
> ci-dessus ? Comment donner à ces constantes des valeurs liées à ma


fenêtre
> que l'utilisateur ne peut pas redimensionner ?

Ça n'est pas liée à ces constantes. Je ne sais pas encore à quoi c'est


lié,
mais les constantes n'y sont pour rien. Elles ne font que désigne quel
traitement SendMessage doit envoyé. J'ai fait d'autre test, et la position
prise par la ScrollBar n'est pas toujours exacte. :O/

Je vais faire d'autre test et tenterai de trouvé le problème.

> J'utilise seulement le scrollbar vertical car je veux que tout le texte
> s'affiche dans la largeur de la fenêtre. mais peut-être que cela n'a pas
> d'importance.

hmm.. C'est dur a dire pous l'instant étant donné que le résultat obtenu
n'est pas le bon. Une fois débuggé nous pourrons mieux voir si ça affecte


ou
pas.


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous




Avatar
François Picalausa
Bonjour/soir,

"Zoury" a écrit dans le message de
news:
Re-Salut Patrice! :O)
La constante WM_USER est une constante désignant le début des valeurs des
constantes utilisateurs.



Il ne s'agit pas du tout des constantes utilisateurs!

Il s'agit du début du champ de numéros de messages qu'une window class
(l'identifieur identifiant par exemple les forms, les commandbuttons, les
richtextbox, les listview, ...) peut utiliser.
Les numéros de messages sont répartis comme suit:
(description : plage décimale : plage hexadécimale)
Messages réservés au système : 0 -> 1024 : 0x0000 -> 0x03FF
Messages privés réservés aux classes de fenêtres : 1024 (WM_USER) ->
32767 : 0x0400 -> 0x7FFF
Messages privés : 32768 (WM_APP) -> 49151 : 0x8000 -> 0xBFFF
Messages Enregistrés : 49152 -> 65535 : 0xC000 -> 0xFFFF

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
Ledev
patrice henrio wrote:
Bonjour,

En fait c'est l'ensemble de la notion "message" qui m'échappe. Je ne
vois pas trop à quoi cela correspond. La procédure API SendMessage
qui peut s'appliquer, d'après ce que j'ai vu, à plein de controles
avec un deuxième et un troisième paramètre dont je ne comprends pas
la signification.



SendMessage permet d'envoyée un "Message" windows. C'est un peu compliquer a
expliquer mais on vas indiquer par exemple a un ScrollBar de déscendre, à un
contrôle de se déplacer...
Biensûr beaucoup de ses choses nous sont caché par VB, ce qui permet sans
trop connaître les mécanismes de Windows de faire de véritable programme,
mais il peut être intéressant de les connaître ;-).

a+
Avatar
Zoury
> Il ne s'agit pas du tout des constantes utilisateurs!



Yep! Je me suis botté moi même le derrière en relisant le message... ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
patrice henrio
J'ai eu une idée cette nuit pendant mon sommeil.

Je me demande si le fait que le curseur ne se positionne où je voudrai ne
vient pas du fait que j'utilise plusieurs polices de caractères et même
plusieurs tailles et styles.

Je vais tester dès maintenant.

"Zoury" a écrit dans le message de
news:%23d$
> Il ne s'agit pas du tout des constantes utilisateurs!

Yep! Je me suis botté moi même le derrière en relisant le message... ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous




Avatar
patrice henrio
C'est bien ça. Il me reste donc à gérer ce problème mais ça devrait aller.

Merci aussi pour les infos sur les messages.

"patrice henrio" a écrit dans le message de
news:
J'ai eu une idée cette nuit pendant mon sommeil.

Je me demande si le fait que le curseur ne se positionne où je voudrai ne
vient pas du fait que j'utilise plusieurs polices de caractères et même
plusieurs tailles et styles.

Je vais tester dès maintenant.

"Zoury" a écrit dans le message de
news:%23d$
> > Il ne s'agit pas du tout des constantes utilisateurs!
>
> Yep! Je me suis botté moi même le derrière en relisant le message... ;O)
>
> --
> Cordialement
> Yanick Lefebvre - MVP pour Visual Basic
> http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
> http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
>
> Merci de poster les réponses au groupe afin d'en faire profiter à tous
>
>