miércoles, 29 de febrero de 2012

19 - Manejo de Menus (Context Menú)

Los Context Menús aparecen generalmente en la cabeza de un formulario (ContextMenuStrip) o cuando un usuario realiza un clic con el botón derecho del Mouse en una localización específica de un formulario de Windows.

Para crear un Context Menú, lo primero que se debe hacer es definir un objeto de este tipo. Para ello, existen dos formas de hacer esta acción:


- Utilizando el Control ContextMenuStrip desde el Menú de Herramientas.

a) Arrastrar desde el menú de herramientas el control ContextMenuStrip, que permite editar las acciones que se harán a través de este menú.

b) Asignar el control Context Menú al control con el cual se desea trabajar, utilizando la propiedad ContextMenuStrip, es decir, si se tiene un control TextBox, en las opciones de propiedad de éste, se debe asignar Context Menú al control, ver figura.




- Crear el Context Menú Mediante Líneas de Código.

a) Crear el control de menú que contendrá los Menús Items que se definan

Private cxMenu as New ContextMenu()

b) Definir los Menús Items que permitirán cargar los textos de los menús, esto se realiza en la sección que permite definir las variables globales de la clase

Public WithEvents mnuItem1 As New MenuItem("&Abrir")

Public WithEvents mnuItem2 As New MenuItem("&Limpiar")

Public WithEvents mnuItem3 As New MenuItem("Color Letra")

Public WithEvents mnuItem4 As New MenuItem("Color Fondo")

c) Incluir los Menú Items al Context Menú definido

With Me.cxMenu

.MenuItems.Add(Me.mnuItem1)

.MenuItems.Add(Me.mnuItem2)

.MenuItems.Add(Me.mnuItem3)

.MenuItems.Add(Me.mnuItem4)

End With

d) Asignar el Context Menú al control especificado.

Me.Txt.ContextMenu = cxMenu

e) Crear los métodos que controlarán los eventos del Context Menú, de la siguiente forma:

Public Sub mnuItemAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItem1.Click

End Sub

f) Si desea que un método controle más de un evento se debe agregar en la sección de Handles, los eventos que se deben atender de los diversos objetos creados, ejemplo:

Public Sub mnuItemAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItem1.Click, mnuItem2.Click

End Sub


Ejemplo de código.

a) Crear un proyecto de Windows

Agregar tres controles:

Control Label

Nombre: Label1

Texto: Buscar Dirección de Archivo:


Control Texbox

Nombre Textbox1

Control ListBox

Nombre: ListBox1

b) Fijar los controles de la forma en que se muestra en la imagen



a) Crear el Context Menú con el siguiente nombre

Private cxMenu As New ContextMenu()

b) Crear los Menú Item que contendrán las opciones de menús que se utilizarán en el sistema.

Public WithEvents mnuItem1 As New MenuItem("&Abrir")

Public WithEvents mnuItem2 As New MenuItem("&Limpiar")

Public WithEvents mnuItem3 As New MenuItem("Color Letra")

Public WithEvents mnuItem4 As New MenuItem("Color Fondo")

c) Incluir los Menú Items dentro del control de menú creado y asignar el Context Menú al control que lo utilizará en el Load de la página.

With Me.cxMenu

.MenuItems.Add(Me.mnuItem1)

.MenuItems.Add(Me.mnuItem2)

.MenuItems.Add(Me.mnuItem3)

.MenuItems.Add(Me.mnuItem4)

End With

Me.TextBox1.ContextMenu = Me.cxMenu

d) Definir los métodos que atenderán los eventos de los objetos.

Public Sub mnuItemAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItem1.Click

End Sub

Public Sub mnuItemLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItem2.Click

End Sub

Public Sub mnuItemColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuItem3.Click, mnuItem4.Click

End Sub

e) Dentro del método mnuItemAbrir_Click agregar las siguientes líneas de código

Dim fl As New OpenFileDialog

Dim flName() As String

' definir los archivos que se pueden buscar

fl.Filter = "txt files (*.txt)|*.txt|Imagenes (*.jpg)|*.jpg|Archivos XML (*.xml)|*.xml"

' permite seleccionar más de un archivo

fl.Multiselect = True

' despliega el archivo de dialogo que facilita la búsqueda

fl.ShowDialog()

' carga la lista de nombres de archivos seleccionados

flName = fl.FileNames()

' si se selecciona más de un archivo se guardará en listbox

If flName.Length > 1 Then

' se carga la lista de los nombres de archivos seleccionados

For Each fn As String In flName

Me.ListBox1.Items.Add(fn)

Next

Me.TextBox1.Text = ""

Else

' se carga solo el nombre de archivo seleccionado

Me.TextBox1.Text = fl.FileName.ToString()

End If

f) Dentro del método mnuItemLimpiar_Click agregar:

Me.TextBox1.Text = ""

g) Dentro del método mnuItemColor_Click, recordar que atiende dos llamadas, la asociada al evento click del menú Color de Fondo y la otra al Menú de Color. Agregar la siguiente línea de comando:

' definir objeto color dialos

Dim cdColor As New ColorDialog

' definir menu item auxiliar

Dim mnuAux As MenuItem

' desplegar objeto color dialos

cdColor.ShowDialog()

' capturar el menú que esta haciendo la llamada

mnuAux = CType(sender, MenuItem)

' validar que se seleccione un color

If Not IsNothing(cdColor.Color) Then

' verificar el menú que esta llamando por su texto

If mnuAux.Text = "Color Letra" Then

TextBox1.ForeColor = cdColor.Color

ElseIf mnuAux.Text = "Color Fondo" Then

TextBox1.BackColor = cdColor.Color

End If

End If

De la misma forma, en ves de realizar las llamadas de los eventos mediante Handles, tambien se puede hacer a través de:

AddHanler mnuItem1.click, AddressOf mnuItem_Click.

Para ello se debe detallar en la parte final del evento load del formulario la siguiente línea:

AddHandler mnuItem1.Click, AddressOf mnuItemAbrir_click

Y llamar al método con la siguiente definición:

Public Sub mnuItemAbrir_click(ByVal sender As Object, ByVal e As EventArgs)

End Sub

No hay comentarios: