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 ++
A voir également:
Visual studio afficher ligne
Afficher numero ligne visual studio - Meilleures réponses
Afficher numéro de ligne visual studio - Meilleures réponses
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
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