RichtextBox : recuperer numero ligne et colonne en cours

Résolu
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 - 1 août 2006 à 09:37
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 - 16 août 2006 à 23:09
Bonjour


voila je cherche a recupérer le numéro de  la ligne et de  la colonne en cours de saisie (et a evenement MouseDowmn) de la souris afin des les afficher dans la statusstrip de la form un peu comme le fait visual studio en fait.


je sais deja recuperer le numéro de la ligne mais jai un peu du mal a recuperer le numéro de colonne (surtout donnant la position du curseur lors du MouseDown)


voici le code qui me permet de recuperer le numero de ligne en cours :


Imports System.text



Imports



System.Runtime.InteropServices


Imports



Microsoft.VisualBasic.Strings


Public






Class
Form1


'''
<summary>






''' DECLARATIONS






'''
</summary>






'''
<remarks></remarks>






Dim
nligne_courante, nCaractere

As



Integer



#




Region



"win API"






Friend



Shared



Function
GetCurrentLineNumber(

ByVal
href

As
HandleRef)

As
Int32




Return
SendMessageW(href, EM_LINEFROMCHAR,

New
IntPtr(-1), 0).ToInt32




End



Function


 
















Friend



Shared



Function
GetLineCharIndex(

ByVal
href

As
HandleRef,

ByVal
lineNumber

As
Int32)

As
Int32


Return
SendMessageW(href, EM_LINEINDEX,

New
IntPtr(lineNumber), 0).ToInt32


End



Function 

 

 








' Private Declare Unicode Function SendMessageW Lib "user32" (ByVal hWnd As HandleRef, ByVal msg As Int32, ByVal wParam As IntPtr, ByRef lparam As ITextDocument) As IntPtr






Private



Declare



Unicode



Function
SendMessageW

Lib



"user32"
(

ByVal
hWnd

As
HandleRef,

ByVal
msg

As
Int32,

ByVal
wParam

As
IntPtr,

ByVal
lparam

As
StringBuilder)

As
IntPtr


Private



Declare



Unicode



Function
SendMessageW

Lib



"user32"
(

ByVal
hWnd

As
HandleRef,

ByVal
msg

As
Int32,

ByVal
wParam

As
IntPtr,

ByRef
lparam

As
Int32)

As
IntPtr


Private



Declare



Unicode



Function
SendMessageW

Lib



"user32"
(

ByVal
hWnd

As
HandleRef,

ByVal
msg

As
Int32,

ByVal
wParam

As
IntPtr,

ByRef
lparam

As
CharRange)

As
IntPtr 


Private



Const
WM_USER

As
Int32 = &H400


Private



Const
EM_EXGETSEL

As
Int32 = (WM_USER + 52)


Private



Const
EM_EXSETSEL

As
Int32 = (WM_USER + 55)


Private



Const
EM_GETOLEINTERFACE

As
Int32 = (WM_USER + 60)


Private



Const
EM_GETLINE

As
Int32 = &HC4


Private



Const
EM_LINEFROMCHAR

As
Int32 = &HC9


Private



Const
EM_LINELENGTH

As
Int32 = &HC1


Private



Const
EM_LINEINDEX

As
Int32 = &HBB


Private



Const
EM_SETTABSTOPS

As
Int32 = &HCB


Private



Const
WM_GETTEXT

As
Int32 = &HD


Private



Const
WM_GETTEXTLENGTH

As
Int32 = &HE


Friend



Structure
CharRange


Public
Min

As
Int32


Public
Max

As
Int32


End



Structure



#




End



Region 








'''
<summary>






''' EVENEMENTS






'''
</summary>






'''








'''








'''
<remarks></remarks>






Private



Sub
Form1_Load(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles



MyBase
.Load


Me
.afficher_postion_ligne_colonne_caratere()


End



Sub






Private



Sub
RichTextBox1_MouseDown(

ByVal
sender

As



Object
,

ByVal
e

As
System.Windows.Forms.MouseEventArgs)

Handles
RichTextBox1.MouseDown


Me
.afficher_postion_ligne_colonne_caratere()


End



Sub






Private



Sub
RichTextBox1_TextChanged(

ByVal
sender

As



Object
,

ByVal
e

As
System.EventArgs)

Handles
RichTextBox1.TextChanged


Me
.afficher_postion_ligne_colonne_caratere()


End



Sub






'''
<summary>






''' AFFICHAGE






'''
</summary>






'''
<remarks></remarks>






Private



Sub
afficher_postion_ligne_colonne_caratere()


Dim
ea

As



Object






Try

nligne_courante = Form1.GetCurrentLineNumber(




New
HandleRef(RichTextBox1, RichTextBox1.Handle))


tsligne.Text =




"Ln "
& (nligne_courante + 1).ToString







Catch
ex

As
Exception


'//






End



Try









End



Sub
End



Class

Merci ++

4 réponses

SamirAloui Messages postés 53 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 20 mars 2008
15 août 2006 à 17:09
Bon soir les mec.
Hi: 421038 romagny13
ne pas aller tres loin voila une sollution qui n'utilise pas les APIs seulement les fonction de VB

Dim CurrLi
As
Integer
'ligne en cours
Dim CurrCol
As
Integer
'colonne en cours
Dim tmp
As
Integer
' temporairetmp = RichTextBox1.GetFirstCharIndexOfCurrentLine()

'Recuperer la position du premier caractere dans la ligne active
CurrLi = RichTextBox1.GetLineFromCharIndex(tmp) + 1
'Recuperer la position du ligne active (1ere ligne=0 c'est pourquoi en ajoutont 1)
'Recuperer la position du caret par dans les lignes

'Astuce: 1- Compter le nombre de toutes les les caractere dans les lignes precedent
              ' 2- trancher la position courant - le compte- Nbrligneprecedant
'Pourquoui NbrLignPrecedant: Car a chaque ligne il y'a un caractere special et invisible c'est le retour a la ligne (VbCrLf)
'Alors
Try
      Dim i
As
Integer
      Dim Somme
As
Integer = 0
      
      
For i = 0
To CurrLi - 2
            Somme += RichTextBox1.Lines(i).Length + 1
      
Next i
      
CurrCol = RichTextBox1.SelectionStart - Somme

Catch s
As Exception

End
Try

Maintenat:  Copier ce code dans les deux procedure

    1-RichTextBox1_KeyUp
    2-RichTextBox1_MouseUp
A bin tot
3
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
1 août 2006 à 09:44
oOps a yé j'ai trouvé dsl lool


 


avec



Friend






Shared



Function
GetSelection(

ByVal
editor

As
RichTextBox)

As
CharRange


Dim
range

As
CharRangeSendMessageW(


New
HandleRef(editor, editor.Handle), EM_EXGETSEL, IntPtr.Zero, range)


Return
range


End



Function

et appel

Dim range
As CharRange = GetSelection(RichTextBox1)

Bon ba euuu merci moii lool
0
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
1 août 2006 à 09:48
A quoique non  c'est pas ca ca donne la postion non pas depuis le debut de la ligne courante mais depuis le premier caracterer saisi ds richtextbox


si quelqun a une idee pour recuperer le numero de la colonne en cours ?
0
romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
16 août 2006 à 23:09
Nickel SamirAloui
merci beaucoup
c'est vrai que j'avais penser à selectionstart pour recuperer le numero de colonne en cours mais la avec la solution que tu m'apportes je n'ai même plus aà essayer j'ai un code qui marche impec

++ et encore merci SamirAloui
0
Rejoignez-nous