elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [SOLUCIONADO] Menúcontextual en RichTextBox para una selección de texto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] Menúcontextual en RichTextBox para una selección de texto  (Leído 4,524 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
[SOLUCIONADO] Menúcontextual en RichTextBox para una selección de texto
« en: 22 Diciembre 2012, 15:48 pm »

Estoy usando un extended RichTextbox que se llama "RichtextboxLinks", con ese control puedo usar el método ".InsertLink" para insertar Filelinks en el richtextbox,
y abrirlos diréctamente usando el click izquierdo dle ratón.

RichTextboxLinks > http://www.codeproject.com/Articles/9196/Links-with-arbitrary-text-in-a-RichTextBox

Lo que quiero hacer es abrir los filelinks con el click derecho en lugar de usar click izquierdo, y quiero que antes se muestre un menú contextual para seleccionar la acción a realizar,
el menú contextual contiene estos dos elementos:

1. Open file in explorer
2. Open file with...

El problema es que no tengo ni idea de como hacerlo. he intentado añadir el handle del evento junto al contextmenu pero me dice que la firma es incompatible para el handle del "InsertLink".

Este es el sub que tengo y que maneja el evento cuando un "FileLink" se clicka con el botón izquierdo dle ratón:


(e.LinkText contiene el text del FileLink)
Código
  1. ' This event happens when a FileLink is clicked
  2.    Private Sub results_box_LinkClicked_1(sender As Object, e As LinkClickedEventArgs) Handles results_box.LinkClicked  ' I can't add here a handle for the contextmenu: "results_box.ContextMenu" but anyway I don't know if that is the way to do it
  3.  
  4.       NewMenu.show
  5.        ' Dim FileInformation = My.Computer.FileSystem.GetFileInfo(e.LinkText)
  6.        ' Process.Start("explorer.exe", " /select," & FileInformation.DirectoryName & "\" & FileInformation.Name)
  7.    End Sub


PD: Más info aquí: http://stackoverflow.com/questions/13994639/contextmenu-in-a-richtextbox-for-open-a-filelink#comment19317914_13994639



« Última modificación: 26 Diciembre 2012, 04:00 am por EleKtro H@cker » En línea



Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Menúcontextual en RichTextBox para una selección de texto específica
« Respuesta #1 en: 25 Diciembre 2012, 09:15 am »

Me he partido la cabeza un rato buscando como hacerlo :xD pero aquí está y funciona perfecto :P

En un proyecto Form, con un Form llamado 'Form1', un ContextMenuStrip con un Item llamado 'AbrirToolStripMenuItem' y de Texto 'Abrir' y un RichTextBox con rutas de prueba...

El código está completamente comentado ;D

Código
  1. Public Class Form1
  2.  
  3.    'Ruta: Variable que guarda la ruta a la que le hemos hecho segundo click'
  4.    Public Ruta As String
  5.  
  6.    'Este evento se da antes que Opening'
  7.    Private Sub RichTextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles RichTextBox1.MouseDown
  8.  
  9.        'Si el evento se dio con el segundo click'
  10.        If e.Button = Windows.Forms.MouseButtons.Right Then
  11.  
  12.            'Palabra: Variable que almacenara la palabra a la que le hemos dado segundo click'
  13.            Dim Palabra As String = ""
  14.            'Index: Index más cercano al Char en el RichTextBox al que le hemos dado click'
  15.            Dim Index As Integer = RichTextBox1.GetCharIndexFromPosition(e.Location)
  16.            'Comienzo: Variable que almacena el Index dónde comienza la palabra'
  17.            Dim Comienzo As Integer = Index
  18.            'Final: Variable que almacena el Index dónde termina la palabra'
  19.            Dim Final As Integer = Index
  20.  
  21.            'Mientras que el Char en la posición Comienzo sea diferente de espacio y restarle uno'
  22.            'nos matenga aún en un Index existente, retrocemos en el texto.'
  23.            While RichTextBox1.Text(Comienzo) <> " " And Comienzo - 1 > -1
  24.                Comienzo -= 1
  25.            End While
  26.  
  27.            'Si el carácter en Comienzo es espacio, avanzamos un Index.'
  28.            If RichTextBox1.Text(Comienzo) = " " Then
  29.                Comienzo += 1
  30.            End If
  31.  
  32.            'Usamos Char.IsControl para buscar el salto de línea.'
  33.            'Mientras que el Char el la posición Final no sea un salto de línea y sumarle uno'
  34.            'nos mantenga en un Index existente, avanzamos un espacio.'
  35.            While Not Char.IsControl(RichTextBox1.Text(Final)) And Final + 1 < RichTextBox1.TextLength
  36.                Final += 1
  37.            End While
  38.  
  39.            'Si el carácter en Final no es salto de línea, avanzamos un Index.'
  40.            If Not Char.IsControl(RichTextBox1.Text(Final)) Then
  41.                Final += 1
  42.            End If
  43.  
  44.            'La palabra está desde el Comienzo y su longitud es Final - Comienzo.'
  45.            Palabra = RichTextBox1.Text.Substring(Comienzo, Final - Comienzo)
  46.  
  47.            'Pasamos la Palabra a la variable global Ruta'
  48.            Ruta = Palabra
  49.  
  50.        End If
  51.  
  52.    End Sub
  53.  
  54.    Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click
  55.        Process.Start(Ruta) 'Iniciamos la Ruta.
  56.    End Sub
  57.  
  58.    Private Sub ContextMenuStrip1_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
  59.        'Se cancela si el archivo de la ruta no existe.
  60.        e.Cancel = Not IO.File.Exists(Ruta)
  61.    End Sub
  62.  
  63. End Class
  64.  

Edito: Cambie la expresión regular por un File.Exists ya que estás trabajando con archivos.


« Última modificación: 25 Diciembre 2012, 09:29 am por Keyen Night » En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
spiritdead

Desconectado Desconectado

Mensajes: 296


Ver Perfil
Re: Menúcontextual en RichTextBox para una selección de texto específica
« Respuesta #2 en: 26 Diciembre 2012, 01:20 am »

Estoy usando un extended RichTextbox que se llama "RichtextboxLinks", con ese control puedo usar el método ".InsertLink" para insertar Filelinks en el richtextbox,
y abrirlos diréctamente usando el click izquierdo dle ratón.

RichTextboxLinks > http://www.codeproject.com/Articles/9196/Links-with-arbitrary-text-in-a-RichTextBox

Lo que quiero hacer es abrir los filelinks con el click derecho en lugar de usar click izquierdo, y quiero que antes se muestre un menú contextual para seleccionar la acción a realizar,
el menú contextual contiene estos dos elementos:

1. Open file in explorer
2. Open file with...

El problema es que no tengo ni idea de como hacerlo. he intentado añadir el handle del evento junto al contextmenu pero me dice que la firma es incompatible para el handle del "InsertLink".

Este es el sub que tengo y que maneja el evento cuando un "FileLink" se clicka con el botón izquierdo dle ratón:


(e.LinkText contiene el text del FileLink)
Código
  1. ' This event happens when a FileLink is clicked
  2.    Private Sub results_box_LinkClicked_1(sender As Object, e As LinkClickedEventArgs) Handles results_box.LinkClicked  ' I can't add here a handle for the contextmenu: "results_box.ContextMenu" but anyway I don't know if that is the way to do it
  3.  
  4.       NewMenu.show
  5.        ' Dim FileInformation = My.Computer.FileSystem.GetFileInfo(e.LinkText)
  6.        ' Process.Start("explorer.exe", " /select," & FileInformation.DirectoryName & "\" & FileInformation.Name)
  7.    End Sub


PD: Más info aquí: http://stackoverflow.com/questions/13994639/contextmenu-in-a-richtextbox-for-open-a-filelink#comment19317914_13994639



te lo dire denuevo usa el objeto fastcoloredtextbox y usa delegados :) y hara todo lo que tu desees y mucho mas

investiga 1 poquito :P el richtextbox no tiene la suficiente dinamica para realizar lo q tu quieres de manera optima

esto es lo malo de dar todo resuelto, pero toma

Código
  1.  Private Sub FastColoredTextBox3_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FastColoredTextBox3.MouseMove
  2.        Dim p As Place = FastColoredTextBox3.PointToPlace(e.Location)
  3.        If CharIsHyperlink(p) Then
  4.            FastColoredTextBox3.Cursor = Cursors.Hand
  5.        Else
  6.            FastColoredTextBox3.Cursor = Cursors.IBeam
  7.        End If
  8.    End Sub
  9.    Private Function CharIsHyperlink(ByVal place As Place) As Boolean
  10.        Dim mask = FastColoredTextBox3.GetStyleIndexMask(New Style() {blueStyle})
  11.        If place.iChar < FastColoredTextBox3.GetLineLength(place.iLine) Then
  12.            If (FastColoredTextBox3(place).style And mask) <> 0 Then
  13.                Return True
  14.            End If
  15.        End If
  16.        Return False
  17.    End Function
  18.  Private Sub FastColoredTextBox3_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FastColoredTextBox3.MouseDown
  19.        Dim p As Place = FastColoredTextBox3.PointToPlace(e.Location)
  20.        If CharIsHyperlink(p) Then
  21.            If MsgBox("Estas Accediendo a un enlace fuera del software, desea continuar con la operacion?", vbQuestion + vbYesNo, StringResources.msgboxPREGUNTA) = MsgBoxResult.Yes Then
  22.                Dim url As String = FastColoredTextBox3.GetRange(p, p).GetFragment("[\S]").Text
  23.                Process.Start(url)
  24.            Else
  25.            End If
  26.        End If
  27.    End Sub
  28.  
« Última modificación: 26 Diciembre 2012, 01:23 am por spiritdead » En línea

Facilitador De Tareas - Task Simplifier (FDT)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Menúcontextual en RichTextBox para una selección de texto específica
« Respuesta #3 en: 26 Diciembre 2012, 03:59 am »

@spiritdead
No te equivoques conmigo! no soy el típico lammer que lo busca todo hecho, pero si la manera de hacerlo,
yo intento informarme primero en Google en MSDN y en Stackoverf... otra cosa es que no encuentre información xD.

Lo que pasa es que aún hay algún control que se escapa a mi comprensión o que desconozco, hasta que llega alguien como tú y me dice "tienes que usar fastcoloredtextbox" (es decir, un listview),
por ejemplo haste hace pocos días no sabía muy bien que era el listview ni lo que se podía hacer con él, porque nunca lo había usado, pero en cuanto me dijiste que lo que debía usar era un listview me puse a investigar y lo resolví yo solo:



Eso sí, es un listview normal, porque yo no tenía ni p*** idea de como crear el modelo de objeto para un fastcoloredtextbox  :xD, así que me guardo tu ejemplo que me puede servir para otra ocasión,
gracias!

@Keyen
Lo mismo te digo, al final lo resolví con un listview pero tu esfuerzo no queda en vano porque tu ejemplo me puede servir para otra ocasión,
Muchísimas gracias.
En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines