Newsgroup: it.comp.lang.visual-basic
Titolo: Click di destro su un controllo RichTextBox: SelStart ?

Scusate il soggetto poco chiaro, ma non mi veniva in mente niente di
sufficientemente breve.
Su un controllo RichTextBox, cliccando di destro sul testo, il cursore non
viene posizionato come invece avviene cliccando con il tasto sinistro.
La posizione del cursore (proprietà SelStart) mi serve per determinare la
parola cliccata e fare successivamente delle considerazioni. Con il tasto
sinstro la cosa è semplicissima, dato che cliccando il cursore si posiziona
in corrispondenza della lettera cliccata e posso dunque usare SelStart, ma
purtroppo è già impiegaro per fare altro.
E' possibile in qualche modo, magari partendo dalla posizione del mouse,
ricavare la posizione del testo ?
Oppure (meglio ancora) richiamare in qualche modo (subclassing ?) il click
di sinistro quando clicco di destro ?
Grazie, Paolo

 tasto sinistro.


 click di sinistro quando clicco di destro ?
Per vb6, assumento che il controllo si chiami RichTextBox1
dovrebbe bastare intercettare l'evento mousedown:
Private Sub RichTextBox1_MouseDown(Button As Integer, Shift As Integer, x As 
Single, y As Single)
 If Button = 2 then RichTextBox1_Click
End Sub
RichTextBox1_Click()
 msgbox "click"
End Sub


Purtroppo non è così facile.. :-|
Il Click che richiami con RichTextBox1_Click non produce lo stesso effetto
(posizionamento cursore) che avresti cliccando realmente con il tasto
sinistro.
A me serve invece proprio quello, per ricavarmi la SelStart e da qui la
parola cliccata.
Paolo

 la parola cliccata.
Cosě puň andare bene?
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal 
dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As 
Long)
Private Const MOUSEEVENTF_MOVE = &H1          ' mouse move
Private Const MOUSEEVENTF_LEFTDOWN = &H2      ' left button down
Private Const MOUSEEVENTF_LEFTUP = &H4        ' left button up
Private Const MOUSEEVENTF_RIGHTDOWN = &H8     ' right button down
Private Const MOUSEEVENTF_RIGHTUP = &H10      ' right button up
Private Const MOUSEEVENTF_MIDDLEDOWN = &H20   ' middle button down
Private Const MOUSEEVENTF_MIDDLEUP = &H40     ' middle button up
Private Const MOUSEEVENTF_WHEEL = &H800       ' wheel button rolled
Private Const MOUSEEVENTF_ABSOLUTE = &H8000   ' absolute move
Private TastoDestro As Boolean
Private Sub RichTextBox1_MouseUp(Button As Integer, Shift As Integer, X As 
Single, Y As Single)
If Button = vbRightButton Then
 TastoDestro = True
 mouse_event _
        MOUSEEVENTF_LEFTDOWN + _
        MOUSEEVENTF_LEFTUP, _
        0, 0, 0, 0
End If
If Button = vbLeftButton Then
 If TastoDestro Then
  TastoDestro = False
  MsgBox "SelStart:" + CStr(RichTextBox1.SelStart)
 End If
End If
End Sub
William. 

> Cosě puň andare bene?
Perfetto! Questa API non la conoscevo.
Nel frattempo avevo un po' smanettato con SendMessage ed ero riuscito
nell'intento, ma in modo non proprio pulito. Cosě va molto meglio.
Grazie, Paolo.


E una cosa del genere?
Private Const EM_CHARFROMPOS As Long = &HD7
Private Type POINTL
    x As Long
    y As Long
End Type
Private Sub rtb_MouseDown(Button As Integer, Shift As Integer, x As Single, 
y As Single)
Dim pl As POINTL
    pl.x = x / Screen.TwipsPerPixelX
    pl.y = y / Screen.TwipsPerPixelY
    rtb.SelStart = SendMessage(rtb.hwnd, EM_CHARFROMPOS, 0, pl)
End Sub
Bye
Raf 

> E una cosa del genere?
Ecco, io vi risparmierň l'agonia di vedere il mio codice.., questa č l'unica
cosa che posso fare :-)
Questa soluzione č davvero ottima ed elegante, perchč non devo nenache
simulare il click di sinistro. Meglio di cosě...
Ragazzi, siete una miniera!
Paolo