Está en la página 1de 48

Marco Besteiro y Miguel Rodríguez Controles Windows

Los controles principales


En el anterior capítulo se han estudiado las clases principales para el diseño de
aplicaciones Windows. A continuación se describen los controles más utilizados para
este tipo de aplicaciones.

Las clases RadioButton y CheckBox

La clase base de estos dos controles, al igual que el de la clase Button es ButtonBase.

El control RadioButton se utiliza cuando se pretende elegir una única opción entre
varias. Un buen ejemplo lo constituye un formulario en que el usuario debe elegir, al
rellenar sus datos personales, si es hombre o mujer. Un RadioButton sólo puede tener
dos estados: seleccionado o no seleccionado. Los controles RadioButton deben ser
mutuamente excluyentes entre sí. Esto se consigue haciendo que pertenezcan a una
misma unidad “lógica” por medio de un control GroupBox, o bien, si únicamente es una
unidad, el formulario que los contiene los agrupa.

Para hacer esto, se ubica en primer lugar en el formulario el control GroupBox y


posteriormente, se van colocando en su interior los controles RadioButton que deban
estar ligados entre sí. Si no se hace de esta manera, pueden elegirse varias opciones
RadioButton de manera simultánea, es decir, no serán excluyentes entre sí.

Un CheckBox permite elegir varias opciones que no sean mutuamente excluyentes. Un


buen ejemplo, es un formulario en el que se pregunte acerca de los idiomas que se
habla. A diferencia de un RadioButton, este control puede tener tres estado:
seleccionado, no seleccionado e inhabilitado, que es un estado en el cual el control se
dibuja en gris y no tiene ningún efecto hacer click sobre él.

A continuación se estudian las propiedades y eventos más importantes y se realizará un


sencillo ejemplo.

Propiedades
Appearance Define la apariencia del control, bien con apariencia estándar o bien
con apariencia de un botón en 3D.
AutoCheck Hace que el control cambie de estado siempre que se haga click sobre
él.
Checked Indica si el control está en estado seleccionado o no.
CheckState Indica el estado de selección del control. Sólo para el CheckBox. Puede
ser Unchecked, Checked o Indeterminate. En este último, el control
se dibuja en gris.
ThreeState (Sólo CheckBox) Propiedad booleana. A False no se permite el
estado Indeterminate. A True, se permiten los tres estados

1/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Eventos

Los eventos más utilizados – por supuesto que también son eventos de estos controles
todos los que se derivan de la clase Control- son los siguientes:

CheckedChanged Ocurre cuando cambia la propiedad Checked. Es el evento por


defecto.
Click Ocurre al realizar un click de ratón sobre el control.
CheckedStateChanged Ocurre cuando cambia la propiedad CheckedState (Sólo
CheckBox)

La clase GroupBox

Cuando se coloca sobre un formulario un control, el formulario es el padre –parent- de


ese control y éste es “hijo”. Algunas de las propiedades del formulario –tipos de letra,
colores, etc...- pasan de manera automática del “padre” al “hijo”. Si se cambian en el
padre, cambiarán también en el hijo. Sólo si se cambian éstas propiedades en el hijo,
dejarán de tener el mismo comportamiento que en el padre.

Lo mismo ocurre cuando se sitúan una serie de controles en un control GroupBox. Éste
es el padre de todos los controles que se sitúen en él y su comportamiento en algunas
propiedades es idéntico. Por eso, cuando se mueve un control GroupBox, se desplazan
también con él todos los controles que contiene. Si se inhabilita un control GroupBox,
todos los controles “hijo” se inhabilitarán con él. Lo mismo sucede al cambiar el color
del fondo o el tipo de letra.

Estos controles se utilizan para agrupar controles. Si contiene controles RadioButton,


serán mutuamente excluyentes entre sí.

No se estudian aquí ninguna propiedad porque las hereda todas de la clase Control.

La clase ToolTip

En general, las aplicaciones más recientes incorporan una pequeña etiqueta


autoexplicativa de la funcionalidad de los controles cuando se deja el ratón inmóvil
sobre ellos durante un breve espacio de tiempo. Es muy sencillo añadir esta
característica a las aplicaciones de Windows. Para ello, se debe añadir un control
ToolTip al formulario y de manera automática se añade una nueva propiedad en todos
los controles de ese formulario denominada “ToolTip on ...”. Basta entonces con
definir un texto en la ventana de propiedades de cada control. Cuando se ejecute la
aplicación, se habrá añadido esta característica.

Son pocas las propiedades y métodos de esta aplicación y no se suelen modificar. Las
más importantes de esta clase son:

2/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Propiedades

Active Define si el control está activo o no.


AutomaticDelay Es el tiempo en milisegundos, que transcurre antes de que
se visualice la etiqueta.
AutoPopDelay Es el tiempo en milisegundos, que permanece visible la
etiqueta.
InitialDelay Es el tiempo en milisegundos, que el cursor debe estar
inmóvil para que se visualice la etiqueta.
ReshowDelay Es el tiempo en milisegundos, que transcurre antes de que
se visualice la etiqueta cuando se pasa de una región a
otra.

Métodos

string GetToolTip(Control c) Obtiene el texto de un ToolTip asociado a


un determinado control.
SetToolTip(Control c, straing str) Define el texto de un ToolTip asociado a
un determinado control.

Observación: la clase ToolTip no deriva de la clase Control, sino de la clase


Component.

Las clases ListBox y CheckListBox

Un control ListBox permite presentar una lista de elementos que el usuario puede
seleccionar pulsando con el ratón o con el teclado. Tiene dos modos de selección:
simple o múltiple. El modo selección se define en la propiedad SelectionMode. Puede
también tener una o varias columnas -propiedad MultiColumn -

Un control CheckListBox es una lista que tiene un control CheckBox en la parte


izquierda de cada elemento, indicando si está seleccionado o no. Un ejemplo es el de la
figura 16.8.

Estas dos clases se estudian juntas porque su funcionalidad es muy parecida y, por lo
tanto, coinciden muchas de sus propiedades y eventos.

La jerarquía de clases es la de la figura 16.1:

Control

ListControl

3/48
ListBox ComboBox
Marco Besteiro y Miguel Rodríguez Controles Windows

Figura 16.1

Las propiedades Items, SelectedItems y SelectedIndices dan acceso a las tres


colecciones que controlan la información de un ListBox, que son las que a
continuación se indican:

ListBox.ObjectCollection Es la colección que contiene todos los


elementos del control ListBox.
ListBox.SelectedObjectCollection Es la colección que contiene todos los
elementos seleccionados del control ListBox.
ListBox.SelectedIndexCollection Es la colección que contiene todos los índices
de los elementos seleccionados.

Suponga, por ejemplo, que se tiene un ListBox con los cinco elementos de la tabla
siguiente.

Indice Item Estado en el ListBox


0 objeto1 No seleccionado
1 objeto2 Seleccionado
2 objeto3 No seleccionado
3 objeto4 Seleccionado
4 objeto5 Seleccionado

La colección ListBox.ObjectCollection contiene los cinco objetos.

La colección ListBox.SelectedObjectCollection almacena los siguientes objetos:

Indice Item
0 objeto2
1 objeto4
2 objeto5

La colección ListBox.SelectedIndexCollection almacena los siguientes índices:

Indice Indice del elemento


0 2

4/48
Marco Besteiro y Miguel Rodríguez Controles Windows

1 4
2 5

Los métodos comunes a todas las colecciones –Add, Remove, Insert, etc- permiten
trabajar con este control de una manera muy sencilla. A continuación se especifican las
propiedades más importantes:

Propiedades
Items Es la colección que contiene todos los items o elementos de la lista.
Esta propiedad se utiliza para añadir, insertar o eliminar elementos
de la lista, por medio de los métodos Add, Insert, Remove, etc... En
tiempo de diseño tiene un editor de la colección, para añadir,
insertar o eliminar los elementos que estarán presente es al
comienzo de la ejecución de la aplicación.
SelectedIndex Es un valor entero que indica el índice del elemento seleccionado.
Si su valor es –1, no hay ningún elemento seleccionado.
SelectedItem Es el item o elemento seleccionado en la lista.
SelectedIndices Devuelve una colección con una lista de índices de los elementos de
la lista seleccionados.
SelectedItems Devuelve una lista de los elementos o items seleccionados.
SelectionMode Indica el modo de selección de la lista. Tiene cuatro posibles
valores:
None: No se puede seleccionar ningún item.
One: Sólo es posible seleccionar un elemento.
MultipleSimple: se pueden seleccionar varios items de manera
simultánea
MultiExtended: Igual que la anterior, pero el usuario puede utilizar
las teclas CTRL, SHIFT y las flechas para hacer sus selecciones.
MultiColumn Define el número de columnas de la lista.
ColumnWidth En una lista de varias columna, esta propiedad define el ancho de
ellas
Sorted Propiedad booleana que indica si la lista está ordenada por orden
alfabético.

Además de estas propiedades, la clase CheckListBox tiene otras cuatro importantes


propiedades que se explican a continuación.

CheckedIndices Es una colección que contiene los elementos de la lista que están
en estado Checked o Indeterminate.
CheckedItems Es la colección de los elementos de la lista que están en estado
Checked o Indeterminate.
CheckedOnClick Propiedad booleana que indica si un item cambiará de estado
cuando el usuario pulse con el ratón en él.
ThreeDCheckBoxes Indica si la apariencia del control es 3D

Métodos

5/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Hay varios métodos muy interesantes a la hora de trabajar con estos controles.

ClearSelected() Anula la selección de la lista


FindString(string str) Busca la primera cadena de la lista que comience
con el string especificado.
FindStringExact(string str) Busca la primera cadena que coincida con la cadena
especificada.
GetSelected(int n) Devuelve un valor booleano indicando si el item n
está seleccionado.
SetSelected(int n, bool b) Selecciona o anula la selección del elemento de
índice n dependiendo del valor booleano pasado, b.
GetItemChecked(int n) Devuelve un valor booleano indicando si el item n
está o no seleccionado. (Sólo CheckListBox)
GetItemCheckState(int n) Devuelve un valor indicando el estado del item n.
(Sólo CheckListBox)

Eventos

Además del resto de los eventos que heredan de la clase Control, estas clases tienen
dos eventos específicos:

ItemCheck Ocurre cuando cambia el estado de uno de los elemento de la


lista.
SelectedIndexChanged Ocurre cuando cambia el índice del elemento seleccionado.
Es el evento por defecto.

Ejemplo: trabajando con el control ListBox.

6/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Figura 16.2

Se trata de una aplicación que tiene dos controles ListBox, de nombres lbI y lbD, dos
cajas de texto, con propiedades Name textoI y textoD y siete botones, cuatro de ellos
para intercambiar elementos entre las listas, de propiedad Name btnD, btnDD, btnII y
btnI, y de propiedades Text >, >>, << y <, dos más para añadir elementos a las listas, de
propiedad Name btnAnadirI y btnAnadirD y de propiedad Text Añadir y un botón
que servirá para terminar la aplicación de propiedad Name btnCerrar y propiedad
Text Cerrar.

La aplicación debe realizar las siguientes tareas:


• Añadir los nombres de ciudades escritos en las cajas de texto textoI o textoD
situados en la parte inferior de los ListBox al pulsar los botones btnAñadirI o
btnAñadirD respectivamente.
• Si se selecciona una ciudad en el ListBox de la izquierda y se pulsa el botón “>”
o “<” dicho elemento pasará de una lista a otra.
• Si se pulsa “>>” o “<<” pasan todos los elementos a la otra lista.
• Haciendo doble click en una lista, pasa el elemento que se ha pulsado a la otra
lista.
• Pulsando el botón “Cerrar”, concluye la aplicación.

En primer lugar hay que diseñar gráficamente la aplicación y asignar las propiedades
Name y Text correspondientes y a continuación escribir el código de los distintos
eventos.

7/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Utilizando el editor que proporciona este control –pulse sobre los puntos suspensivos
correspondientes a la propiedad Items del ListBox- escriba algunos elementos, para
que estén presentes al comienzo de la aplicación (Figura 16.2).

a) El botón btnAnadirD debe:


• Recoger el texto en la propiedad Text de la caja textoI y añadirlo al lbI
con el método Add de Items.
• Borrar el texto de la caja de texto
• Devolver el foco a la caja de texto.

El código correspondiente es:

lbI.Items.Add(textoI.Text);
textoI.Clear();
textoI.Focus();

b) Botón btnD:

//Se recoge el elemento seleccionado en el lbI con la propiedad


SelectedItem
//y se añade al lbD con el método Add de Items
lbD.Items.Add(lbI.SelectedItem);
//Se borra el elemento seleccionado, con el método Remove de
Items
lbI.Items.Remove(lbD.SelectedItem);

c) Botón btnDD:
• Se recogen en un array de objetos todos los elementos de la lbI con la
propiedad All de Items.
• Se recorre el array y se van añadiendo al lbD,con la propiedad Add de Items.
• Se borran todos los elementos del lbI con el método Clear de Items.

object[] arrayObjetos=lbI.Items.All;

foreach(object i in arrayObjetos)
{
lbD.Items.Add(i);
}

lbI.Items.Clear();

d) Evento doble-click en la lista lbI:


El código será el mismo que el del botón btnD, así que en lugar de escribirlo de
nuevo, se selecciona el evento doble-click del lbI y se selecciona el evento de
nombre btnD_Click.
e) Para cerrar la aplicación, basta incluir el código siguiente del btnCerrar:

Application.Exit();

Los códigos de los demás botones y el hecho de considerar la posibilidad de que se


pulse el btnD –por ejemplo- sin estar seleccionado ningún elemento de la lista -que
lleva consigo un error en tiempo de ejecución se dejan al lector.

8/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Se propone también la realización de esta misma aplicación pero en donde se permita la


selección múltiple en los ListBox.

Más adelante, al explicar la clase StatusBar se realiza un ejemplo que utiliza la clase
CheckListBox.

La clase ComboBox
Al igual que la clase ListBox, esta clase deriva de la clase ListControl. El control
correspondiente a esta clase combina tres controles: un TextBox, un Button y un
ListBox. En este control la selección no puede ser múltiple y es posible, dependiendo
del valor de algunas propiedades añadir elementos a través del TextBox.

Generalmente se utiliza para seleccionar una entrada del usuario, pero ahorrando
espacio en el formulario. Al hacer click en la flecha del ComboBox se despliega la lista y
es posible hacer la selección. También se puede trabajar con el teclado.

Propiedades

Muchas de las propiedades coinciden con las de un TextBox y las de un ListBox. Por
esto, la lista de propiedades de este control es muy extensa. Se señalan aquí las más
comunes y utilizadas.

DropownStyle Especifica uno de los tres modos de presentación del control:


• DropDown: Se puede editar el TextBox y al pulsar la flecha del
control, se despliega la lista.
• Simple: igual a DropDown, excepto que se despliega la lista de
manera parecida a un ListBox.
• DropDownList: No puede editarse el TextBox y al pulsarse la
flecha del control se despliega la lista.
DroppedDown Propiedad booleana. Indica si el ComboBox está o no desplegado
Items Es la colección de todos los elementos del control. A través de ella,
pueden añadirse o eliminarse elementos de la lista. En tiempo de
diseño, tiene un editor para añadir de manera muy sencilla
elementos a la colección y por lo tanto al control.
MaxLength Especifica el número de caracteres que es posible introducir en el
TextBox del control.
SelectedIndex Indica el índice del elemento seleccionado.
SelectedItem Indica el elemento seleccionado.
SelectedText Es el texto seleccionado en el TextBox de la lista.
SelectionStart Es el índice del primer carácter seleccionado en el TextBox.
SelectionLength Es la longitud del texto seleccionado en el TexBox
Sorted Propiedad booleana que indica si los elemento del control están
ordenados.

Eventos

9/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Los eventos principales –además de los heredados de Control- son:

DropDown Ocurre cuando la lista del ComboBox se despliega


SelectedIndexChanged Ocurre cuando cambia la selección de la lista.
TextChanged Ocurre cuando cambia la propiedad Text cambia

Ejemplo: trabajando con el control ComboBox.

• Cree un nuevo proyecto denominado ProyectoComboBox


• Añada un control ComboBox con las siguientes propiedades:
Name: cbFutbol
Items: Pulse en los puntos suspensivos y aparecerá el editor de la figura 16.3:

Figura 16.3

Añada unos cuantos equipos de fútbol.


• Escriba en el constructor del formulario código para seleccionar uno de ellos. En
este caso, se selecciona el primero –índice 0-.
public Form1()
{
InitializeComponent();
cbFutbol.SelectedIndex=0;
lEquipo.Text=cbFutbol.SelectedItem.ToString();
}

10/48
Marco Besteiro y Miguel Rodríguez Controles Windows

a) Añada una etiqueta y cambie sus propiedades:


Name: lEquipo
Text: (Vacío)

La ubicación de los elementos debe ser parecida a la de la figura 16.4:

Figura 16.4

b) Se pretende que cuando el usuario cambie la selección en el ComboBox, el texto


del elemento elegido se asigne a la propiedad Text de la etiqueta. Para ello,
escriba el siguiente código en el método cbFutbol_SelectedIndexChanged
que será el que maneje el evento SelectedIndexChanged:
private void cbFutbol_SelectedIndexChanged(object sender,
System.EventArgs
e)
{
lEquipo.Text = cbFutbol.SelectedItem.ToString();
}

11/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Las clases NumericUpDown y DomainUpDown

Son dos clases que permiten recorrer una lista de cadenas (DomainUpDown) o de
números (NumericUpDown) para que el usuario realice una elección. Se recorre la lista
de los valores por medio de un par de pequeños botones que indican si el
desplazamientoes hacia arriba o hacia abajo.

Un ejemplo de utilización de estos controles lo constituye la pantalla para configurar la


impresión de documentos en Microsoft Word, en la opción número de copias que se
desean hacer (figura 16.5). Se permite al usuario escribir el número en el control o bien,
sin tener que utilizar el teclado, realizar la selección con pulsaciones sobre las flechas.

Figura 16.5

DomainUpDown y NumericUpDown derivan de una clase común llamada UpDownBase que


proporciona la funcionalidad básica a ambas. A su vez, ésta deriva de la clase
ScrollableControl y ésta de Control. Por lo tanto, sus miembros son comunes a
ambas.

Propiedades

• Propiedades de UpDownBase:

12/48
Marco Besteiro y Miguel Rodríguez Controles Windows

bool InterceptArrowKeys Indica si el usuario puede utilizar o no las


flechas para seleccionar valores.
bool ReadOnly Indica si el usuario puede introducir un dato
para cambiar el texto del control escribiendo
con el teclado.
string Text Texto del control

• Propiedades DomainUpDown

DomainUpDownItemCollection Items Colección de los elementos del control


int SelectedIndex Índice del elemento seleccionado
object SelectedItem Elemento seleccionado
bool Sorted Indica si los elementos están ordenados.

• Propiedades de NumericUpDown

int DecimalPlaces Configuran la presentación del número en


bool ThousandsSeparator el control.
bool Hexadecimal
decimal Increment Incremento al pulsar el control. Por
defecto es 1.
decimal Minimun Valores máximo y mínimos
decimal Maximun
decimal Value Valor del texto del control

Se realiza un ejemplo con este control más adelante, al explicar el control TabControl.

La clase Panel

Esta clase deriva de la clase ScrollableControl y ésta de la clase


Control.

Un panel es un control que puede contener a otros controles. Se puede utilizar un panel
para agrupar colecciones de controles como RadioButton. Como otros controles
contenedores, si su propiedad Enabled es false, los controles que contiene también
tendrán esa propiedad a false.

Por defecto, se presenta sin bordes, aunque pueden definirse por medio de su propiedad
BorderStyle.

Panel deriva de la clase ScrollableControl y por ello proporciona la propiedad


AutoScroll para disponer de barras de desplazamiento en el panel si se desea. Esto es
muy útil cuando se tienen muchos controles y no pueden contenerse todos en un
formulario por falta de espacio físico en la ventana que los contiene o bien si se tiene
una imagen que ocupa una superficie mayor que el control que lo contiene. Esta es la

13/48
Marco Besteiro y Miguel Rodríguez Controles Windows

gran diferencia con un control GroupBox. Sin embargo, la funcionalidad de ambas es


igual ya que ambas se utilizan como contenedores de controles.

La clase StatusBar (Barra de estado)

El control StatusBar o barra de estado, se utiliza generalmente para proporcionar


información al usuario acerca del estado de la aplicación. Dicha información se puede
dividir en paneles.

Puede tener tantos paneles como se desee y en ellos se puede presentar texto o imágenes
(figura 16.6). Un ejemplo muy corriente lo constituye la barra de estado del procesador
de texto Word de Microsoft, donde se informa de la página, la sección, el número total
de páginas, la línea y columna dentro de la página actual, etc...

Aunque generalmente se coloca en la parte inferior del un formulario, puede situarse en


cualquier otro lugar.

Figura 16.6

Esta clase deriva directamente de la clase Control.

La clase StatusBar se usa para crear una barra de estado y la clase StatusBarPanel
para crear paneles de la barra de estado.

//Se crean una barra de estado y dos paneles

this.statusBar1 = new System.Windows.Forms.StatusBar();


StatusBarPanel panel1 = new StatusBarPanel();
StatusBarPanel panel2 = new StatusBarPanel();

Para añadir paneles a la barra de estado, se ha de llamar al método

StatusBar.Panels.AddRange. Por ejemplo:

14/48
Marco Besteiro y Miguel Rodríguez Controles Windows

statusBar1.Panels.AddRange( new StatusBarPanel[] {panel1, panel2});

Se puede escribir texto en una barra de estado, asignándoselo a la propiedad Text del
control. Pero también es posible asignar varios paneles para presentar una información
más rica en detalles.

Como antes se ha mencionado, puede insertar imágenes en una barra de estado en el


interior de un control Panel. Para ello, debe utilizarse la propiedad Icon del Panel.

Icon icono = new Icon(@"c:\mouse.ico");


panel1.Icon = icono;

Podría añadirse información sobre la hora en el otro panel:

panel2.Text = DateTime.Now.ToString();

Propiedades

Las propiedades más importantes de esta clase son las siguientes:

Panels De sólo lectura. Es la colección de paneles de la barra de


herramientas. Se utiliza para añadir o eliminar elementos del control.
En tiempo de diseño se proporciona un pequeño editor que facilita
enormemente la tarea de especificar el comportamiento de cada
panel. Para llamar a cada panel, se puede hacer por su nombre o bien
por medio de su índice: Panel[0], Panel[1],... El texto de
cualquiera de ellos lo define la propiedad Text: Panel[0].Text,
Panel[1].Text, etc. (Figura16.7)
BacgroundImage Es posible asignar una imagen de fondo al control a través de esta
propiedad.
ShowPanels Propiedad booleana que permite o anula la posibilidad de presentar
paneles en la barra.
Text Es el texto que aparece en la barra de herramientas, sólo en el caso
de que no haya paneles.

Eventos

No se suelen utilizar eventos en este control, aunque si se pretende dibujar un control


manualmente, son necesarios los siguientes:

DrawItem Ocurre cuando el panel que tiene el estilo OwnerDraw necesita ser
redibujado
Panel_Click Cuando se hace click sobre un panel de la barra de estado

Para dibujar manualmente un panel es necesario tener la propiedad Style del panel a
OwnerDraw y escribir el código en el evento DrawItem.

15/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Como anteriormente se ha dicho, cada panel de la barra de estado es un objeto o


instancia de la clase StatusBarPanel. Esta clase encapsula la información referida a
cada uno de los paneles de la colección de paneles. Por ejemplo, permite definir si es un
simple texto o el estilo del panel o un icono.

Ejemplo: trabajando con barras de estado.

La siguiente aplicación actualiza en la barra de estado las selecciones realizadas en


diferentes controles.

a) Cree un nuevo proyecto llamado ProyectoBarraDeEstado. Cambie la


propiedad Name del formulario a FormularioPrincipal y modifique en el
método Main() la línea

Application.Run(new Form1());

por la línea: (OJO ver versión definitiva)

Application.Run(new FormularioPrincipal());

Modifique la propiedad Text del formulario a “Formulario Principal”

b) Añada al formulario los siguientes controles en la posición aproximada de la


figura 16.8 y con las propiedades que se indican:

• ListBox
Name: lista
SelectMode: One
Items: (Hacerlo con el editor)
Jaén
Sevilla
Granada
Córdoba
Cádiz
Huelva
Almería
• GroupBox
Name: groupBox1
Text: Sexo
Añada a groupBox1 los siguientes controles:
RadioButton:
Name: rbHombre
Text: Hombre
Checked: True
RadioButton:
Name: rbMujer
Text: Mujer
Checked: False
• GroupBox
Name: groupBox2
Text: Idiomas
Añada a groupBox2 los siguientes controles:
CheckBox:

16/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Name: cbIngles
Text: Inglés
Checked: False
CheckBox:
Name: cbFrances
Text: Francés
Checked: False

CheckBox:
Name: cbAleman
Text: Alemán
Checked: False

• CheckedListBox
Name: clbLenguaje
CheckedOnClick: True
Items:
(Con el editor añada los siguientes strings)
Java
C#
Pascal
Fortran
Cobol
C++
C
• StatusBar
Name: sbEstado
Panels:
(Con el editor que se proporciona)
Añadir los siguientes (Ver figura)
Name: sbpCiudad
Name: sbpSexo
Name: sbpIdioma
Name: sbpLenguaje
En todos: Text: (Vacío)
ShowPanel: True
Autosize: False en los dos primeros y
True en los otros dos.

17/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Figura 16.7

Más o menos, el aspecto final de la aplicación debe parecerse al de la figura 16.8:

Figura 16.8

c) Se van a utilizar cuatro variables privadas de tipo string para cada uno de los
paneles denominadas strCiudad, strSexo, strIdioma y strLenguaje. En
el constructor del formulario se inicializan, como se indica a continuación:

private string strCiudad;


private string strSexo;

18/48
Marco Besteiro y Miguel Rodríguez Controles Windows

private string strIdioma;


private string strLenguaje;

public FormularioPrincipal()
{
InitializeComponent();
strCiudad="Jaén";
strSexo="Hombre";
strIdioma="Ninguno";
strLenguaje="Ninguno";
lista.SelectedIndex=0;
ActualizarBarra();
}

En la última línea, se añade un método que recoge la selección de cada control y


la escribe en cada panel. Su código es:

public void ActualizarBarra()


{
sbEstado.Panels[0].Text=strCiudad;
sbEstado.Panels[1].Text=strSexo;
sbEstado.Panels[2].Text=strIdioma;
sbEstado.Panels[3].Text=strLenguaje;
}

d) Para recoger el ítem cada vez que se cambie la selección de la lista se debe tratar
el evento SelectedIndexChanged. Escriba el siguiente código

private void lista_SelectedIndexChanged(object sender, EventArgs


e)
{
strCiudad=lista.SelectedItem.ToString();
ActualizarBarra();
}

e) En los controles RadioButton, se obtiene el elemento seleccionado tratando el


evento CheckedChanged. Este método trata el cambio de estado en cualquiera
de los dos controles y por eso, hay que definir el mismo método para los dos. En
este caso se ha dado a los dos el nombre del primero de ellos
rbHombre_CheckedChanged:

private void rbHombre_CheckedChanged(object sender, EventArgs e)


{
if(rbHombre.Checked)
strSexo=rbHombre.Text;
else
strSexo=rbMujer.Text;
ActualizarBarra();
}

f) La misma idea se utilizará para los siguientes controles CheckBox. El método


común que tratará a los tres controles se llamará cb_CheckedChanged.

private void cb_CheckedChanged(object sender, System.EventArgs


e)
{
strIdioma="";

19/48
Marco Besteiro y Miguel Rodríguez Controles Windows

if(cbIngles.Checked)
strIdioma+=cbIngles.Text+" ";
if(cbFrances.Checked)
strIdioma+=cbFrances.Text+ " ";
if(cbAleman.Checked)
strIdioma+=cbAleman.Text;
ActualizarBarra();
}

g) Por último, se recogen las elecciones en el control CheckListBox, tratando el


evento SelectedIndexChanged mediante el método
clbLenguaje_SelectedIndexChanged

private void clbLenguaje_SelectedIndexChanged(object sender,


System.EventArgs
e)
{
strLenguaje="";
foreach(string str in clbLenguaje.CheckedItems)
strLenguaje+=str + " ";
ActualizarBarra();
}

En este método se recorre toda la colección de los items que tienen el estado a
Checked y se añade su texto al string correspondiente. Luego se actualiza la
barra.

La clase TabControl

Es un control que se utiliza cuando se quiere organizar mucha información de manera


relacionada. Un buen ejemplo lo constituye, la ventana de opciones de Microsoft Word
(figura 16.9).

20/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Figura 16.9: ventana de opciones de Microsoft Word.

Este control tiene varios TabPage o pestañas que trabajan de manera similar a un
GroupBox. Para utilizar este control, se deben añadir el número de pestañas que se
deseen a una colección del control llamada TabPages. Visual Studio proporciona un
editor para añadir o eliminar las pestañas de la colección de manera gráfica, rápida e
intuitiva. Se puede acceder a él a través de la propiedad TabPages del control.
Posteriormente se van colocando los controles en cada pestaña.

Propiedades

Las propiedades más importantes son:

Alignment Determina si las etiquetas son desplegadas en la parte


superior, izquierda, derecha o inferior –opciones Top, Left,
Rigth y Bottom- del control.
Appearance Determina la apariencia de las etiquetas: botones 3D,
botones estándar o pestañas normales.
HotTrack Propiedad booleana. Indica si la apariencia de la pestaña
cambia al pasar con el ratón sobre el nombre de la pestaña.
RowCount Número de filas de etiquetas en el control.
TabCount Número de etiquetas del control
TabPages Colección de pestañas. Se utiliza para añadir o eliminar

21/48
Marco Besteiro y Miguel Rodríguez Controles Windows

elementos del control.


Además de lo indicado hasta el momento es importante recalcar que cada pestaña
trabaja como un contenedor de controles –como un GroupBox- y no como formularios
distintos. Por eso, puede accederse desde un control de una pestaña a otro control de
otra pestaña, cosa que no se puede hacer entre dos formularios diferentes. Sin embargo,
lo más habitual será situar este control en una caja de diálogo y pasar los datos que se
hayan seleccionado al formulario.

Ejemplo: trabajando con el control TabControl.

Esta aplicación –figura 16.10– simula la configuración de la impresión. En este


ejemplo, sólo se intenta que la configuración elegida se presente en los controles de
texto de la parte derecha de la ventana y no configura la impresión.

a) Cree un nuevo proyecto que se llame ProyectoTabControl


b) Modifique las propiedades del formulario:
Name: formOpciones
Text: Opciones de configuración

Modifique la línea del método Main()


Application.Run(new Form1());
por la línea
Application.Run(new FormOpciones());

Figura 16.10

22/48
Marco Besteiro y Miguel Rodríguez Controles Windows

c) Añada un control TabControl al formulario y modifique su propiedad Name a


tcOpciones (figura 16.10).
d) Pulse sobre la propiedad TabPages y trabaje con el editor de las páginas del
control para añadir dos pestañas (figura 16.11).

Figura 16.11

Pulse sucesivamente el botón Agregar cada vez que desee añadir una pestaña. Si se
equivoca siempre puede pulsar el botón Eliminar y comenzar de nuevo.

Name: tpImprimir
Text: Imprimir

Name: tpOrtografia
Text: Ortografía

e) Cierre la ventana del editor. A continuación, desde la ventana de diseño, en la


primera etiqueta vaya añadiendo los controles que se indican situándolos
aproximadamente en posiciones que se aproximen a las de las figuras 16.10 y
16.12:

23/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Figura 16.12
e.1) En la TabPage tpImprimir, añada los controles siguientes:
• GroupBox
• Name: groupBox1
• Text: Impresora

En groupBox1 sitúe tres etiquetas y un ComboBox con las propiedades:

o Label
ƒ Name: label1
ƒ Text: Nombre
ƒ Autosize: True
o Label
ƒ Name: lTipoDeImpresora
ƒ Text: Tipo
ƒ Autosize: True
o Label
ƒ Name: label3
ƒ Text: (Vacío)
ƒ Autosize: False
o ComboBox
ƒ Name: cbImpresoras
ƒ Text: HP LaserJet 1100
ƒ Items: HP LaserJet 1100
Canon Jet BCJ 4000
HP DeskJet 843C

• GroupBox

24/48
Marco Besteiro y Miguel Rodríguez Controles Windows

• Name: groupBox2
• Text: Intervalo de páginas

En groupBox2 sitúe cuatro RadioButton y un TextBox con las


propiedades:

• RadioButton
o Name: rbTodo
o Checked: True
o Text: Todo
• RadioButton
o Name: rbPaginaActual
o Checked: False
o Text: Página actual
• RadioButton
o Name: rbPaginas
o Checked: False
o Text: Páginas
• RadioButton
o Name: rbSeleccion
o Checked: False
o Text: Selección
• TextBox
o Name: txtSeleccion
o Text: (Vacío)

• GroupBox
• Name: groupBox3
• Text: Copias
En groupBox1 sitúe una etiqueta, tres CheckBox y un
NumericUpDown:
o Label
ƒ Name: label3
ƒ Text: Número de copias
ƒ Autosize: True
o NumericUpDown
ƒ Name: nudCopias
ƒ Increment 1
ƒ Value: 1
ƒ Minimum: 1
ƒ Maximum: 100
o CheckBox
ƒ Name: cbDosCaras
ƒ Texto: Imprimir por las dos caras
o CheckBox
ƒ Name: cbColor
ƒ Texto: Imprimir en color
o CheckBox
ƒ Name: cbBorrador
ƒ Texto: Calidad borrador

25/48
Marco Besteiro y Miguel Rodríguez Controles Windows

g) En la otra TabPage, tpOrtografia, añada únicamente un control


CheckedListBox con las propiedades siguientes:
• CheckedListBox
• Name: clbOrtografia
• Items:
(utilice el pequeño editor que aparece al pulsar sobre la propiedad)
Corregir uso accidental de bLOQ mYUS
Corregir dos MAyusculas SEguidas
Poner en mayúscula la primera letra de una oración
Cambiar las b por v
No cometer ninguna falta de ortografía
Reemplazar mientras se escribe
ƒ ThreeDCheckBoxes:True
ƒ CheckOnClick: True
h) Sitúe fuera del control TabControl, dos etiquetas explicativas de dos cajas de
texto donde se escribirá la configuración seleccionada.

ƒ Label
• Name: label4
• Text: Opciones de impresión elegidas
• Label
• Name: label5
• Text: Opciones de ortografía seleccionadas
• TextBox
• Name: txtOpcionesImpresion
• Text: (Vacío)
• Multiline: True

• TextBox
ƒ Name: txtOpcionesOrtografia
ƒ Text: (Vacío)
ƒ Multiline: True

Para actualizar las cajas de texto de la derecha. Se crean tres variables de tipo string y
se les da unos valores iniciales en el constructor del formulario:

//Declaracion de miembros de la Clase FormOpciones


string nombreImpresora;
string intervaloPaginas;
string opcionesCopias;
string nCopias;
string strOrtografia;

private System.ComponentModel.Container components = null;

public FormOpciones()
{
nombreImpresora="HP LaserJet 1100";
intervaloPaginas=" Todo";
opcionesCopias = " ";
nCopias =" 1";
strOrtografia="";

26/48
Marco Besteiro y Miguel Rodríguez Controles Windows

InitializeComponent();
}

Cree un método público que facilite la actualización de la caja de texto


txtOpcionesImpresion. Este método simplemente devuelve la concatenación de los
resultados de cada grupo de opciones.

public string ActualizarOpciones()


{
return
(nombreImpresora+intervaloPaginas+opcionesCopias+nCopias);
}

En el evento SelectedIndexChanged del ComboBox cbImpresoras, escriba el siguiente


código:

private void cbImpresoras_SelectedIndexChanged(object sender,


EventArgs e)
{
nombreImpresora=cbImpresoras.SelectedItem.ToString();
lTipoDeImpresora.Text=nombreImpresora;
txtOpcionesImpresion.Text=ActualizarOpciones();
}

La primera línea recoge el ítem seleccionado como string. Después se escribe la


etiqueta que recoge el resultado de la elección y posteriormente se llama al método
ActualizarOpciones() para actualizar la caja de texto txtOpcionesImpresion.

A continuación se escribe el código del evento CheckedChanged de los RadioButton.


Para ello añada este evento en uno de los controles, con el nombre rb_CheckedChanged
y escriba el siguiente código.

private void rb_CheckedChanged(object sender, System.EventArgs e)


{
if(rbTodo.Checked)
intervaloPaginas="Imprimir Todo";
else if(rbPaginaActual.Checked)
intervaloPaginas="Imprimir página actual";
else if(rbPaginas.Checked)
intervaloPaginas="Imprimir paginas: " + txtSeleccion.Text;
else if(rbSeleccion.Checked)
intervaloPaginas="Imprimir selección";
txtOpcionesImpresion.Text=ActualizarOpciones();
}

Posteriormente, añada este mismo evento a los otros tres controles RadioButton, para
que todos estén tratados por el mismo método manipulador.

También se pretende que cuando se escriba algo en la caja de texto txtSeleccion, se


seleccione el RadioButton correspondiente, rbPaginas. Para ello, escriba el siguiente
código en el evento TextChanged del TextBox:

private void txtSeleccion_TextChanged(object sender, System.EventArgs


e)

27/48
Marco Besteiro y Miguel Rodríguez Controles Windows

{
if(txtSeleccion.Text.Length>0)
rbPaginas.Checked=true;
intervaloPaginas="Imprimir paginas: " + txtSeleccion.Text;
txtOpcionesImpresion.Text=ActualizarOpciones();
}

Se propone al lector que mejore el programa para que cuando se selcciona otro
ComboBox, se borre el contenido de la caja de texto txtSeleccion.

Ahora seleccione los tres controles CheckBox, y con ellos seleccionados vaya a la
Ventana de propiedades, y en la pestaña correspondiente a eventos, haga doble-click
sobre el evento CheckedChanged con lo que los eventos de los tres serán tratados por el
mismo manipulador cbDosCaras_CheckedChanged. Esta es otra manera de hacer lo que
antes se ha realizado control a control con los RadioButton.

Escriba el siguiente código en el evento:

private void cbDosCaras_CheckedChanged(object sender, System.EventArgs


e)
{
opcionesCopias="";
if(cbDosCaras.Checked)
opcionesCopias+=" Dos caras ";
if(cbBorrador.Checked)
opcionesCopias+=" borrador ";
if(cbColor.Checked)
opcionesCopias+=" color ";
txtOpcionesImpresion.Text=ActualizarOpciones();
}

Ahora añada el número de copias, del valor obtenido del control NumericUpDown. Para
ello, en el evento nudCopias_ValueChanged se escribe el siguiente código:

private void nudCopias_ValueChanged(object sender, System.EventArgs e)


{
nCopias=nudCopias.Value.ToString();
txtOpcionesImpresion.Text=ActualizarOpciones();
}

Ahora ya sólo queda tratar el control situado en la otra pestaña. Se tartará el evento
SelectedIndexChanged que ocurre siempre que se cambia algunos de los elementos
seleccionados. Para ello, se borra la variable strOrtografia, y se recorre la colección
de todos los elementos seleccionados. Se obtiene el ítem correspondiente y se almacena
en la variable. Por último, se asigna a la caja de texto el contenido de la variable.

private void clbOrtografía_SelectedIndexChanged(object sender,


System.EventArgs
e)
{
strOrtografia="";
foreach(string item in clbOrtografía.CheckedItems)
strOrtografia+=item;
txtOpcionesOrtografia.Text=strOrtografia;
}

28/48
Marco Besteiro y Miguel Rodríguez Controles Windows

La clase TrackBar

El control TrackBar -también llamado "slider"- se utiliza para navegar a través de una
gran cantidad de información y/o para ajustar visualmente un determinado valor. Consta
de dos partes: una es el propio slider o marcador y las propias marcas. El slider puede
ser ajustado a un determinado valor y su posición corresponde a ese valor que se asigna
a la propiedad Value. El marcador se mueve en incrementos que se pueden especificar.

Las propiedades más importantes de este control son: Value, TickFrequency, Minimum,
y Maximum. TickFrequency es el espaciamiento entre las marcas. Minimum y Maximum
son los valores mínimo y máximo que puede representar el control.

También tienen importancia las propiedades SmallChange y LargeChange, que


representan el número de posiciones que se moverá el marcador en respuesta a pulsar
las teclas izquierda o derecha y PAGE UP o PAGE DOWN -y también a un click de ratón en
el propio control- respectivamente.

Esta clase deriva directamente de la clase Control.

Propiedades
AutoSize Define si el control se ajusta en tamaño
automáticamente.
LargeChange Valor que se añade o resta a la propiedad
Value cuando se mueve el slider por un
click de ratón o con las teclas AV PAG o
RE PAG.
Maximum Límite superior de la propiedad Value.
Minimum Límite inferior de la propiedad Value.
Orientation Orientación del TrackBar
SmallChange Valor que se añade o resta a la propiedad
Value cuando se mueve el slider desde el
teclado con las teclas izquierda o derecha..
TickFrequency Es el incremento de valor entre las
pequeñas marcas dibujadas en el control.
TickStyle Indica el modo de visualización del control.
Value Es el valor numérico que representa la
posición actual del slider.

Eventos
Scroll Ocurre cuando el slider se mueve por
accion del ratón o por el teclado.
ValueChanged Ocurre cuando la propiedad Value cambia.

29/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Ejemplo: trabajando con el control TrackBar.

En la siguiente aplicación las cajas de texto actualizan los valores de los TrackBar en
cada momento.

a) Cree un nuevo proyecto denominado


BarrasDeDesplazamiento.
b) Cambie el nombre del fichero Form1.cs a
FormularioPrincipal.cs pulsando en la ventana Explorador de Soluciones
y cambiando la propiedad Name del archivo por el nuevo nombre.
c) Modifique el nombre de la clase Form1 a
FormularioPrincipal. Para ello, pulse en la ventana Vista de clases, el ítem
Form1 para que tenga el foco, cambie la propiedad Name del formulario de Form1 a
FormularioPrincipal.
d) Para ver el código de la aplicación pulse con el
botón derecho el formulario y escoja la opción Ver código.
e) Cambie –esto es error de la beta- la línea
Application.Run(new Form1());
por la línea
Application.Run(new FormularioPrincipal());

f) Establezca la siguiente propiedad del formulario FormularioPrincipal

Text: Aplicación demo de Barras de desplazamiento

g) Sitúe dos controles TrackBar, en el formulario y haga que sean más o menos del
mismo tamaño.

h) A los dos controles TrackBar se les asignan las siguientes propiedades:


Name: th y tv respectivamente, indicando que son dos TrackBar, uno
horizontal y otro vertical.
Orientation: Horizontal y Vertical respectivamente. Definen la
orientación.
Maximun: 100 Valor máximo del track.
Minimum: 0 Valor mínimo del track.
LargeChanged: 5 Incrementos grandes de valor.
SmallChanged:1 Incrementos de valor.
Value: 0 Indica el valor actual del track. Inicialmente, valor 0.
TickFrecuency: 5 Frecuencia de las señales dibujadas en el track.
TickStyle: BottomRight Estilo de la señal que indica el valor.

i) Añada cajas de texto, del mismo tamaño, con las siguientes propiedades:
Name: txtValorBarraHorizontal y txtValorBarraVertical
respectivamente.
Text: 0
j) Añada dos etiquetas con las siguientes propiedades:
AutoSize: True
Text: Valor Barra Horizontal y Valor Barra Vertical,
respectivamente

30/48
Marco Besteiro y Miguel Rodríguez Controles Windows

k) El aspecto final de la aplicación es el de la figura 16.14:


Se puede ajustar los márgenes, tamaños y posiciones relativas con los controles
situados en la barra de herramientas del IDE (figura 16.13) y con Crtl+flechas
de posicionamiento

Figura 16.13

Figura 16.14

l) Se pretende que cuando cambie el indicador de posición se indique su valor en


los cuadros de texto. Para ello,
• Pulse sobre la barra vertical para tener el foco.
• En la ventana de propiedades, doble click sobre el evento
ValueChanged del TrackBar
• Escriba el siguiente código:
txtValorBarraHorizontal.Text = th.Value.ToString();

y en otro control,
txtValorBarraVertical.Text = tv.Value.ToString();

De esta manera se asigna a la propiedad Text de las cajas de texto los valores de los
controles trackBar cada vez que éstos cambien. Observe el lector que se utiliza el

31/48
Marco Besteiro y Miguel Rodríguez Controles Windows

método ToString() que tiene cualquier objeto por heredarlo de la clase Object para
convertir la cantidad que se obtiene de los trackBar a string.

Compile y ejecute la aplicación.

Se puede observar que esta aplicación queda un poco incompleta porque lo lógico sería
que si el usuario cambia el valor de las cajas de texto, también cambiaran los valores en
los TrackBar. Además sería conveniente controlar la entrada de la caja de texto para
que sea numérica. No se ha hecho aquí para no complicar demasiado el código. Sin
embargo, se realiza un ejemplo muy parecido al explicar la clase ScrollBar.

La clase ScrollBar

Muchos de los controles que precisan de barras de desplazamiento ya las proporcionan


directamente. Esto sucede con los controles TextBox, ListBox y ComboBox.

Este control se utiliza en aquéllos controles que no lo proporcionan directamente, como,


por ejemplo, PictureBox.

La jerarquía de esta clase es la siguiente:

Control

ScrollBar

HScrollBar VScrollBar

Figura 16.15

Propiedades

La propiedad principal es Value, que es el valor actual en la barra de desplazamiento.


Además son también importantes las propiedades Minimum y Maximum que determinan
el rango de los valores que el usuario puede seleccionar, LargeChange y SmallChange
que definen el incremento cuando se produce incrementos grandes –por pulsación del
ratón en el control- y pequeños –al pulsar en los extremos del control-.

Eventos
Scroll Ocurre cuando se mueve la barra de desplazamiento. Es el evento
por defecto.
ValueChanged Ocurre cuando cambia el valor de la propiedad Value.

32/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Ejemplo: trabajando con el control ScrollBar.

En esta aplicación se define el color de fondo de un panel a través de los valores


numéricos correspondientes a las barras de desplazamiento (16.16).

Figura 16.16

Para ello cree un nuevo proyecto llamado DialogoColor y en el formulario principal


sitúa los controles como aparecen en la figura 16.16.

Asigne las siguientes propiedades:

-Formulario:
Name: FormularioColor
Text: Formulario de Color
FormBorderStyle: FixedDialog

Cambiar también (sólo en la versión beta) la línea de método Main():


Application.Run(new Form1());

por la línea:

33/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Application.Run(new FormularioColor());

Añada un panel, tres etiquetas, tres cajas de texto y tres barras de desplazamiento con la
situación de la figura anterior y con las propiedades siguientes:

-panel:
Name: panel
BackColor: Black

-Etiquetas:
Name: los que vienen por defecto, o sea, label1, label2 y label3.
Autosize: true

-Cajas de texto:
Name: txtRojo, txtVerde y txtAzul respectivamente.
Text: 0 (en las tres)

-Barras de desplazamiento (ScrollBar)


Name: scbRojo, scbVerde y scbAzul.
LargeChanged: 10
Maximun: 255
Minimun: 0
SmallChanged: 1
Value: 0

A continuación llame al evento ValueChanged de scbRojo y llámele


scb_ValueChanged. Las tres barras de desplazamiento compartirán el mismo método y
código. Escriba el siguiente código:

private void scb_ValueChanged(object sender, System.EventArgs e)


{
//Se recogen los valores de las barras de desplazamiento
int nRojo=scbRojo.Value;
int nVerde=scbVerde.Value;
int nAzul=scbAzul.Value;

//Se asignan los valores a las cajas de texto


txtRojo.Text=nRojo.ToString();
txtVerde.Text=nVerde.ToString();
txtAzul.Text=nAzul.ToString();

//Se crea el color y se asigna al fondo del panel


Color miColor=Color.FromArgb(nRojo,nVerde,nAzul);
panel.BackColor=miColor;
}

En el código anterior, en primer lugar se obtienen los valores de cada una de las barras
de desplazamiento y se asignan a tres variables enteras. Posteriormente, se asignan estos
valores a las cajas de texto, para que haya una correspondencia entre los valores de las
barras y las cantidades de las cajas de texto.

A continuación, en la línea:

Color miColor=Color.FromArgb(nRojo,nVerde,nAzul);

34/48
Marco Besteiro y Miguel Rodríguez Controles Windows

se asigna al objeto miColor de la estructura Color, un color con el método estático


FromArgb() que devuelve un objeto de tipo Color formado por la mezcla de los
colores rojo, verde y azul en cantidades que vienen indicadas en cada uno de los tres
argumentos con cantidades comprendidas entre 0 y 255. La estructura Color se trata en
el capítulo dedicado al GDI.

El formato de este método es:

public static Color FromArgb(int rojo, int verde, int azul);

Posteriormente, este color se asigna a la propiedad BackColor de panel.

Hay que considerar que este código sirve para los tres controles. Para esto, debe
asociarse este mismo evento de nombre scb_ValueChanged a los controles scbVerde y
scbAzul. También se deben definir los eventos ValueChanged de las otras dos cajas de
desplazamiento. Para ello, se debe hacer click en la ventana de propiedades del control
scbVerde, en el evento ValueChanged; pulse en la parte de la derecha; sobre la flecha
situada al final de la línea del evento aparece el nombre scb_ValueChanged. Pulse
sobre él y de modo automático se asocia este mismo evento al control scbVerde.
Realice la misma operación con el control scbAzul.

Ahora hay que considerar el paso inverso. Se trata de que cuando se cambien las
cantidades de las cajas de texto, se modifiquen automáticamente y se sitúen en los
valores correspondientes las barras de desplazamiento y se asocie el color
correspondiente a estas cantidades al panel.

En este ejercicio no se van a considerar los posibles errores en la introducción de


valores en las cajas de texto, para no complicar excesivamente el ejercicio.

Además, se considerará que no se cambie el color hasta que no se pulse ENTER. Por
eso, se trata el evento KeyPress.

Como las tres cajas de texto tienen el mismo código, se compartirán el mismo nombre
para las tres como se ha hecho anteriormente. Se sigue el mismo camino anterior:
doble click sobre el evento KeyPress de uno de las tres cajas de texto –por ejemplo la
primera y de modo automático se asocia el nombre txtRojo_KeyPress al control, ya
que éste es el control por defecto de este control. Vuelva a la ventana de propiedades, y
cambie el nombre por uno un poco más general, como por ejemplo, txt_KeyPress o
cualquier otro.

Escriba el siguiente código en la primera de las cajas de texto.

private void txt_KeyPress(object sender, KeyPressEventArgs e)


{
//Aquí se debería controlar que la entrada sea numérica
int n=int.Parse(((TextBox)sender).Text);
if(n<=255 && n>=0)
{
if(e.KeyChar=='\r')
{
int nRojo=int.Parse(txtRojo.Text);

35/48
Marco Besteiro y Miguel Rodríguez Controles Windows

int nVerde=int.Parse(txtVerde.Text);
int nAzul=int.Parse(txtAzul.Text);

scbRojo.Value=nRojo;
scbVerde.Value=nVerde;
scbAzul.Value=nAzul;
Color miColor=Color.FromArgb(nRojo,nVerde,nAzul);
panel.BackColor=miColor;
}
}
else
MessageBox.Show("Introduce un número entre 0 y 255");
}

Observaciones:

a) En la línea
int.Parse(txtRojo.Text);
se convierte la cantidad correspondiente a la caja de texto –que es un string- a
un entero.
b) Se chequea si el número introducido está entre 0 y 255
c) En la línea if(e.KeyChar=='\r') se chequea si la tecla pulsada es un ENTER,
que corresponde al carácter ‘\r’.
d) Se actualizan los valores de las barras con las cantidades correspondientes de las
cajas de texto

La clase PictureBox

Un PictureBox se utiliza para visualizar gráficos: bitmaps, iconos, ficheros JPEG, GIF
u otros tipos de archivos.

Esta clase deriva directamente de la clase Control.

Su propiedad Image define la imagen que se visualiza. El tamaño y posicionamiento de


la imagen en el control se pueden controlar por medio de la propiedad SizeMode que
puede tomar valores de la enumeración PictureBoxSizeMode. El control PictureBox
se visualiza por defecto sin bordes, pero se puede modificar con la propiedad
BorderStyle.

Propiedades
BorderStyle Define el borde del control. Puede ser None, FixedSimple y
Fixed3D.
Image La imagen que se visualiza en el control.
SizeMode Modo de posicionamiento y visualización de la imagen. A
continuación se muestran los valores que puede tomar.

Nota: Valores de la enumeración PictureBoxSizeMode:

AutoSize El tamaño del control se modifica hasta ajustarse al de la imagen.


CenterImage Si la imagen es más grande que el control se visualiza en el centro

36/48
Marco Besteiro y Miguel Rodríguez Controles Windows

de la imagen. En el caso contrario, se visualiza en el centro del


control.
Normal La imagen se sitúa en la esquina superior izquierda del control. Si
la imagen es más grande que el control, no se visualiza entera.
StretchImage Se modifica el tamaño de la imagen para que se ajuste al control.

Ejemplo: trabajando con barras de desplazamiento y con el control


PictureBox.

Esta aplicación lee una imagen al hacer doble click sobre el formulario y cuando se
cambia el tamaño del formulario se refresca la imagen. Es posible que no se entiendan
bien algunas de las líneas de código, en concreto las que se refieren a la carga de la
imagen. Se explicarán en detalle más adelante.

Cree un nuevo proyecto denominado ProyectoScrollBar con un control PictureBox


de nombre cajaImagen y con su propiedad Dock a Fill para que ocupe todo el
formulario y dos barras de desplazamiento VScrollBar y HScrollBar, de nombres
sbHor y sbVer y con sus propiedades Dock a Left y Bottom respectivamente. Añada un
control openFileDialog al formulario y cambie su propiedad Name a dlgAbrir.

Figura 16.17

Al hacer doble click sobre el control PictureBox se carga una imagen. Para ello,
escriba el siguiente código en el evento DoubleClick del PictureBox

private void cajaImagen_DoubleClick(object sender, System.EventArgs e)


{
// Dialogo para abrir un fichero
if(dlgAbrir.ShowDialog() != DialogResult.Cancel)
{

37/48
Marco Besteiro y Miguel Rodríguez Controles Windows

// Abre la imagen en el PictureBox y la presenta


cajaImagen.Image = Image.FromFile(dlgAbrir.FileName);
//Añade código para "ajustar" la imagen
this.PresentaElScrollBar();
}

Se desea también que cuando cambie el tamaño del formulario, se refresque la imagen.
Para ello, escriba el código siguiente en el evento Resize de Form1.

private void cajaImagen_Resize(object sender, System.EventArgs e)


{
/* Si el PictureBox tiene imagen, verla si necesita scrollbars
y refrescar la imagen*/
if(cajaImagen.Image != null)
{
this.PresentaElScrollBar();
this.Refresh();
}
}

Además, cuando la imagen sea más pequeña que el formulario, se presentan las barras
de desplazamiento y se trata el evento Scroll de las barras. Ambas tienen el mismo
evento.

private void sbVer_Scroll(object sender, ScrollEventArgs e)


{
/* Crea un objeto Graphics y dibuja una parte
de la imagen en el PictureBox. */
Graphics g = cajaImagen.CreateGraphics();
g.DrawImage(cajaImagen.Image,
new Rectangle(0, 0, cajaImagen.Width - sbHor.Height,
cajaImagen.Height - sbVer.Width),
new Rectangle (sbHor.Value, sbVer.Value,
cajaImagen.Width-sbHor.Height,
cajaImagen.Height-sbVer.Width), GraphicsUnit.Pixel);

El método PresentaElScrollBar() se encarga de presentar las barras de


desplazamiento cuando sea necesario.

public void PresentaElScrollBar()


{
/// Si la imagen es más ancha, presenta el HScrollBar
if (cajaImagen.Width > cajaImagen.Image.Width)
sbHor.Visible = false;

38/48
Marco Besteiro y Miguel Rodríguez Controles Windows

else
sbHor.Visible = true;
// Si la imagen es más alta, presenta el VScrollBar
if (cajaImagen.Height > cajaImagen.Image.Height)
sbVer.Visible = false;
else
sbVer.Visible = true;
}

La clase Timer

Permite que ocurra un evento cada determinado intervalo de tiempo. No deriva de la


clase Control, sino de la clase Component.

Propiedades

Enabled Propiedad booleana que habilita o deshabilita el lanzamiento de los


eventos de reloj. Se puede conseguir el mismo efecto con los métodos
Star() y Stop().
Interval Indica, en milisegundos, el intervalo de tiempo en que se producirán los
disparos o eventos de reloj.

Métodos

Star() y Stop() Habilitan y deshabilitan el reloj


OnTick() Este método puede seer sobreescrito para una clase que derive de
Timer.

Eventos

El evento de reloj se denomina Tick. Ocurre cuando transcurre el intervalo de reloj


indicado.

Ejemplo: trabajando con el control Timer.

Esta aplicación implementa un cronómetro muy simple .


Para ello, cree un nuevo proyecto para Windows. Añada a su formulario principal un
control de la clase Timer –se situará en la parte inferior del IDE, fuera del formulario,
para indicar que es un control no visual- y cambie las siguientes propiedades del
control:

Name: reloj
Interval: 100 (intervalo de décimas de segundo)

39/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Enabled: true

Añada una etiqueta al formulario y cambie las propiedades siguientes:

Name: segundos
Text: 0

Defina cuatro variables estáticas, inicializadas a 0, que corresponderán a las décimas,


segundos, minutos y horas, como miembros de las clase Form1:

static int hh=0;


static int mm=0;
static int ss=0;
static int dd=0;

El aspecto final de la aplicación será, más o menos el de la figura 16.18:

Figura 16.18

A continuación, escriba el siguiente código en el evento Tick del reloj:

private void reloj_Tick(object sender, System.EventArgs e)


{
//Cada evento de reloj, suma una décima
dd++;
//Si se ha llegado a 10 décimas
if(dd==10)
{
//poner las décimas a cero y sumar un segundo
dd=0;
ss++;
//Si se ha llegado a 60 segundos
if(ss==60)
{
//Poner segundos a cero y sumar un minuto
ss=0;
mm++;
//Si se ha llegado a 60 minutos
if(mm==60)
{
//minutos a cero, y sumar una hora

40/48
Marco Besteiro y Miguel Rodríguez Controles Windows

mm=0;
hh++;
}
}
}
//Escribir la hora en el formato: hh:mm:ss:dd
hora.Text = hh.ToString() + ":" + mm.ToString() + ":"
+ ss.ToString() + ":" + dd.ToString();
}
Compile y ejecute la aplicación.

41/48
Marco Besteiro y Miguel Rodríguez Controles Windows

La clase DateTime

Esta clase no es un control pero es indispensable para trabajar con los dos controles que
se van a estudiar a continuación. Un objeto de la clase DateTime encapsula información
del día y la hora.

Propiedades
Date Es de tipo DateTime. Obtiene la fecha actual.
Day Es de tipo entero. Obtiene el día del mes.
DayOfWeek Día de la semana.
DayOfYear Día del año.
Hour Hora.
Millisecond Milisegundos
Minute Minutos.
Month Mes.
Second Segundos.
Ticks Número de veces que han pasado intervalos de 100
nanosegundos.
TimeOfDay Hora dentro del día.
Year Año.

• Propiedades estáticas:

MaxValue Constante que representa el valor más grande posible que puede
tomar el objeto DateTime.
MinValue Constante que representa el valor más pequeño posible que puede
tomar el objeto DateTime
Now Objeto DateTime que encapsula la hora actual del ordenador.
Today Objeto DateTime con la fecha actual.

Métodos
ToLongDateString(),ToLongTimeString(), Convierten la fecha o la hora a
ToShortDateString(),ToShortDateString(), distintos formatos de cadena.
ToShortTimeString(), ToString()

• Métodos estáticos:

DaysInMonth Número de días de un determinado mes de un año concreto.

Ejemplo: trabajando con la clase DateTime.

42/48
Marco Besteiro y Miguel Rodríguez Controles Windows

Esta aplicación presenta en pantalla los distintos formatos de esta clase. Para ello, se
asignan a la propiedad Text de cada una de las diez cajas de texto un formato de la
fecha u hora distintos (figura 16.19). Previamente, se crea un objeto de la clase
DateTime:

public Form1()
{
InitializeComponent();

//Se crea un objeto de tipo DateTime con el día y hora actual


DateTime ahora=DateTime.Now;

//Se presenta en pantalla en 10 cajas de texto


textBox1.Text=ahora.Date.ToString();
textBox2.Text=ahora.ToString();
textBox3.Text=ahora.ToLongDateString();
textBox4.Text=ahora.ToLongTimeString();
textBox5.Text=ahora.ToShortDateString();
textBox6.Text=ahora.ToShortTimeString();
textBox7.Text=ahora.Day.ToString();
textBox8.Text=ahora.Month.ToString();
textBox9.Text=ahora.Year.ToString();
textBox10.Text=ahora.Hour.ToString();
}

Figura 16.19

43/48
Marco Besteiro y Miguel Rodríguez Controles Windows

La clase DateTimePicker

Se utiliza para seleccionar una determinada fecha, de manera gráfica. Esta clase deriva
directamente de la clase Control. Es un control mezcla de un control ComboBox que
contiene una determinada fecha y un calendario –que se estudiará posteriormente-
(figura 16.20).

Figura 16.20

C# permite trabajar de una manera muy flexible con los formatos de fecha y hora. La
propiedad CustomFormat permite definir el formato de la presentación en el control. Se
debe encerrar entre comillas simples las letras “reservadas” de esta propiedad que son d
(día) m(mes) y(año) h(horas) m(minutos) s(segundos) así como : y /. Para que tenga
validez el formato, el valor de la propiedad Format debe ser Custom. Por ejemplo, para
presentar en pantalla dia 06/01/2001 a las 11:34 basta con poner la propiedad
CustomFormat el string: 'd'ia dd'/'mm'/'yyyy a la's' hh':'mm.

Para más información, véase la ayuda: “Date and Time Format Strings”.

Propiedades
CalendarFont Propiedades para el diseño gráfico del control.
CalendarForeColor Con ellas se puede definir el tipo de letra y su
CalendarMonthBackground
CalendarTitleBackColor color, así como el color de fondo del control y
CalendarTitleForeColor del calendario que se despliega.
CalendarTrailingForeColor
Checked Cuando la propiedad ShowCheckBox es true
indica el estado del control CheckBox adjunto a
la fecha
CustomFormat Define el formato personalizado de la fecha y/o
la hora.

44/48
Marco Besteiro y Miguel Rodríguez Controles Windows

DropDownAlign Indica si la lista que se despliega estará alineada


a la izquierda o a la derecha.
Format Indica el formato de la hora. Si se desea un
formato personalizado, debe elegirse el valor
Custom y debe definirse dicho formato en la
propiedad CustomFormat,
MaxDate Define las fechas límites que se pueden
MinDate seleccionar en este control.
ShowCheckBox Valor booleano que indica si se adjunta o no un
control CheckBox en el control.
ShowUpDown Indica si se utiliza un control up-down para
selecionar la fecha o un ComboBox que
despliegue un calendario.
Value Es el valor fecha y hora asignado al control.

Eventos
CloseUp Ocurre cuando se cierra el calendario asociado al control.
DropDown Ocurre cuando se despliega el calendario asociado al control.
ValueChanged Ocurre cuando cambia la propiedad Value, es decir, cuando se
selecciona un fecha diferente a la actual. Es el evento por defecto
del control.

45/48
Marco Besteiro y Miguel Rodríguez Controles Windows

La clase MonthCalendar

Esta clase también deriva directamente de la clase Control. El control correspondiente


a la clase MonthCalendar permite seleccionar una fecha o un rango de días de manera
visual. Mediante las propiedades MinDate y MaxDate se puede limitar el abanico de
fechas a elegir.

Es posible modificar el aspecto gráfico del calendario cambiando los valores de las
propiedades ForeColor, TitleBackColor, TitleForeColor, TrailingForeColor y
BackColor.

Muchas veces es más sencillo utilizar un control DateTimePicker en lugar de


MonthCalendar si no se pretende trabajar con un rango de días.

Propiedades
DateTime[] BoldedDates Es el array de objetos de tipo DateTime
que determina los días señalados en
negrita.
CalendarDimensions El número de filas y de columnas que
tiene el control.
Day FirstDayOfWeek Define el primer día de la semana. Por
defecto es Day.Default
DateTime MaxDate El día más lejano del futuro que es posible
seleccionar.
int MaxSelectionCount El máximo número de días que es posible
seleccionar. Por defecto es 7.
DateTime MinDate El día más lejano del pasado que es
posible seleccionar.
DateTime[]MonthlyBoldedDates Cambio de meses al hacer un scroll en el
int ScrollChange control.
DateTime SelectionEnd Es el día final del rango de días
seleccionado.
SelectionRange SelectionRange Devuelve un objeto de la clase
SelectionRange. Esta clase representa el
rango de días seleccionado. Tiene dos
propiedades: Start y End, que son dos
objetos de la clase DateTime, que indican
la fecha de comienzo y la de final del
rango. Si sólo se selecciona un día Start
y End son iguales.
DateTime SelectionStart Define la fecha de comienzo en la
selección de un rango de días.
boolean ShowToday Indica si la fecha representada en la
propiedad TodayDate se presenta en la
parte inferior del control.
boolean ShowTodayCircle Indica si se rodea con un pequeño círculo
la fecha actual.
boolean ShowWeekNumbers Indica si se presenta o no en el control el

46/48
Marco Besteiro y Miguel Rodríguez Controles Windows

número de semana relativo al año.


Color TitleBackColor Color de fondo del area del título del
control.
Color TitleForeColor Color de la letra del título del control.
DateTime TodayDate Es el valor que utiliza el control como
fecha actual.
Color TrailingForeColor Color de los números de los días que no
pertenecen al mes del título del control.

Métodos
void SetDate(DateTime date) Define la fecha actual.
void SetSelectionRange (DateTime d1, DateTime Define las fechas
d2)
seleccionadas.

Ejemplo: trabajando con los controles DateTimerPicker y MonthCalendar.

En esta aplicación se actualiza el texto de una etiqueta con una fecha elegida en un
control DateTimerPicker o en un control MonthCalendar y se actualiza la fecha del
otro control (Figura 16.21).

Figura 16.21

Cree un nuevo proyecto, y llámele ProyectoCalendario.

Añada un control DateTimerPicker y un control MonthCalendar con sus propiedad


Name dtpFecha y mcCalendario respectivamente. Juegue un poco con las

47/48
Marco Besteiro y Miguel Rodríguez Controles Windows

propiedades que definen el “look” de los controles hasta dejar la apariencia que se
desee. Añada también una etiqueta con la propiedad Name etiqueta, y su propiedad
Text vacía.

Se debe imprimir en la etiqueta la fecha sin incluir el año: por ejemplo, imagínese que
está definiendo cumpleaños para una agenda. Para ello, implemente los eventos
ValueChanged y DateChanged de los controles DateTimerPicker y MonthCalendar
respectivamente con el siguiente código:

private void dtpFecha_ValueChanged(object sender, EventArgs e)


{
DateTime hoy = dtpFecha.Value;
mcCalendario.SelectionStart=mcCalendario.SelectionEnd=hoy;
etiqueta.Text ="Cumpleaños de Miriam:" + hoy.Day + "/" +
hoy.Month;
}

private void mcCalendario_DateChanged(object sender,DateRangeEventArgs


e)
{
DateTime hoy = mcCalendario.SelectionStart;
dtpFecha.Value = hoy;
etiqueta.Text ="Cumpleaños de Miriam:" + hoy.Day + "/" +
hoy.Month;
}

Compile y ejecute la aplicación

48/48

También podría gustarte