Você está na página 1de 14

Programacin Visual - C#.

NET
Dpto. de Computacin

Guin de la prctica 1

Programacin Visual en C# .NET


Guin de la prctica 1

OBJETIVOS
Aplicaciones que soportan mltiples documentos Barras de herramienta y de estado Uso de imgenes

TEMPORIZACIN
Desarrollo de la prctica: 2 semanas

BIBLIOGRAFA
Enciclopedia de Microsoft Visual C# Autor: Fco. Javier Ceballos Editorial: RA-MA.

Pgina 1

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

PRCTICA 1 MDI

TABLA DE CONTENIDOS:

Introduccin ............................................................................................. 3 10. Esqueleto de una aplicacin MDI ..................................................... 4 10.1 Crear una ventana hija nueva .......................................................... 4 10.2 Cargar una imagen desde un recurso ............................................... 6 10.3 Ajustar la imagen a la ventana hija .................................................. 6 10.4 Rotar la imagen 90 ......................................................................... 7 10.5 Aadir texto a la imagen ................................................................. 8 10.6 Convertir la imagen a escala de grises ............................................. 8 10.7 Abrir y guardar imgenes .............................................................. 9 10.8 Aadir soporte para arrastrar y soltar ...................................... 11 10.9 Barras de herramientas y de estado................................................ 12 Posibles mejoras (Opcional) .................................................................. 14

Pgina 2

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

Introduccin
Se crear una nueva aplicacin MDI que mostrar imgenes en sus ventanas hijas:

El programa podr mostrar las imgenes en su resolucin original (con barras de desplazamiento si fueran necesarias), o adaptadas al tamao de la ventana hija. Adems, ser posible realizar transformaciones a las imgenes, tales como aadir una rotacin de 90 o un texto predefinido. Las imgenes se cargarn desde los recursos del propio programa, o bien desde archivos bmp, jpg, gif, etc., durante la ejecucin. Tambin se permitir guardar las imgenes.

Pgina 3

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

10. Esqueleto de una aplicacin MDI


Una vez haya creado un nuevo proyecto, cambie el nombre del formulario principal por VisorImgenes. Para que este formulario sea capaz de gestionar mltiples ventanas hijas, es necesario activar su propiedad IsMdiContainer. Hecho esto, cree la barra de mens principal con los mens Archivo, Ver, Ventana y Ayuda. La barra de mens posee una propiedad llamada MdiWindowListItem donde deber introducir el nombre del men Ventana, para que dicho men pueda mostrar automticamente una lista con las ventanas hijas existentes, e indicar con una seal cul es la activa. Para crear el dilogo Acerca de, puede hacer uso de la plantilla existente AboutBox (Agregar Windows Forms > Cuadro Acerca de). A continuacin aada la orden correspondiente al men Ayuda, con su manejador del evento Click. Por ltimo, aada a Ventana las rdenes Cascada, Mosaico horizontal y Mosaico vertical y ascieles los siguientes manejadores:
private void ventana_cascada_Click (object sender, EventArgs e) { this.LayoutMdi(MdiLayout.Cascade); } private void ventana_mosaicoHorizontal_Click(object sender, EventArgs e) { //. . . } private void ventana_mosaicoVertical_Click(object sender, EventArgs e) { //. . . }

Agregue al men Archivo las rdenes Salir (cerrar el programa en su totalidad), Cerrar (cerrar la ventana hija activa) y Nuevo (crear una nueva ventana hija). Los manejadores de las dos ltimas rdenes los implementaremos posteriormente, mientras que el de Salir lo puede implementar ya (debe consistir simplemente en una llamada al mtodo Close del formulario principal).
Compilar y ejecutar para ver el resultado.

10.1 Crear una ventana hija nueva


Aada un manejador para el evento Click de la orden Nuevo del men Archivo, y modifquelo como se muestra a continuacin:
private void archivo_nuevo_Click(object sender, EventArgs e) { string ttulo = "Doc" + (this.MdiChildren.Length + 1);

Pgina 4

Programacin Visual - C#. NET


Dpto. de Computacin NuevaHija(ttulo); }

Guin de la prctica 1

Haga clic con el botn derecho sobre la llamada a NuevaHija, y seleccione la opcin Generar cdigo auxiliar del mtodo. Modifique el mtodo generado segn se indica a continuacin:
private void NuevaHija(string ttulo) { VentanaHija hija = new VentanaHija(ttulo); hija.MdiParent = this; hija.PictureBox.SizeMode = PictureBoxSizeMode.AutoSize; hija.AutoScroll = true; hija.Show(); }

La clase VentanaHija no ha sido creada an. Para hacerlo, vaya al men Proyecto y seleccione la opcin Agregar Windows Forms> Windows Forms. Introduzca VentanaHija.cs como nombre para el nuevo archivo de cdigo. Arrastre un control PictureBox sobre el formulario de nombre m_PictureBox. Aada la siguiente propiedad a la clase VentanaHija recin creada:
public PictureBox PictureBox { get { return m_PictureBox; } }

A continuacin modifique el constructor de VentanaHija para que tome un parmetro ttulo de tipo string. Dentro del cuerpo de dicho constructor, aada la siguiente lnea tras la llamada a InitializeComponent:
this.Text = ttulo;

Compilar y ejecutar para ver el resultado.

Aada la siguiente propiedad pblica a la clase VisorImgenes:


public VentanaHija HijaActiva { get { return (VentanaHija)this.ActiveMdiChild; } }

Esta propiedad nos permite acceder rpidamente a la ventana hija activa, y adems realiza la conversin cast a la clase VentanaHija de forma automtica. Aada ahora el siguiente manejador a la orden Archivo > Cerrar, que muestra cmo se utiliza la propiedad que acabamos de aadir:
private void archivo_cerrar_Click(object sender, EventArgs e) { this.HijaActiva.Close(); }

Sepa que el evento MdiChildActivate del formulario principal nos avisa cuando el usuario cambia la ventana hija activa.

Pgina 5

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

Compilar y ejecutar para ver el resultado.

10.2 Cargar una imagen desde un recurso


Aada ahora un recurso a la aplicacin (Proyecto > Agregar clase > Archivo de recursos). Esto aade una nueva clase Resource1 a nuestro proyecto. A continuacin, utilizando el propio editor de Visual Studio aada una nueva imagen (Agregar recurso) que se llamar, por ejemplo, Image1 (esto crea una variable esttica dentro de la clase Resource1). Aada una nueva orden Cargar al men Archivo y asocie a su evento Click el siguiente manejador:
private void imagen_cargar_Click(object sender, EventArgs e) { this.HijaActiva.PictureBox.Image = Resource1.Imagen; }

Este mtodo asigna al control PictureBox de la ventana activa una imagen obtenida a partir de los recursos de la aplicacin.
Compilar y ejecutar para ver el resultado.

En el estado actual de la aplicacin, desde que el usuario crea una nueva ventana ejecutando Archivo > Nuevo hasta que carga una imagen con la orden correspondiente, la ventana no tiene ninguna imagen asociada, lo que posibilita actuaciones incorrectas. Para evitar esto, haga que al crear una nueva ventana se cargue automticamente la imagen del recurso. Elimine a continuacin la orden Imagen > Cargar, que ya no es necesaria.
Compilar y ejecutar para ver el resultado.

10.3 Ajustar la imagen a la ventana hija


En este apartado aadiremos a la aplicacin la posibilidad de mostrar la imagen redimensionada para adaptarse al tamao de la ventana. Esta opcin ser accesible a travs de un men Imagen que estar asociado a cada ventana hija, pero que se mostrar fusionado con el men principal. Desde la vista de diseo del formulario VentanaHija, aada un control MenuStrip con la propiedad Visible desactivada. Aada a esta barra de mens un men Imagen con una orden llamada Ajustar a ventana.
Compilar y ejecutar para ver el resultado.

Al ejecutar la aplicacin puede ver que la barra de mens de la ventana hija se integra con la barra de mens del formulario principal, y que desaparece cuando no existe ninguna ventana hija. Sin embargo, existe un pequeo problema ya que el men Imagen aparece a la derecha de los mens Ventana y Ayuda, lo cual no es el comportamiento habitual de las aplicaciones de Windows. Para solucionar esto,

Pgina 6

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

seleccione el men Imagen y cambie su propiedad MergeAction por Insert, y su propiedad MergeIndex por 2.
Compilar y ejecutar para ver el resultado.

Asocie el siguiente manejador con el evento Click de la orden Ajustar a ventana:


private void imagen_ajustar_Click(object sender, EventArgs e) { // Si no estamos en modo ajustar, activamos este modo if (this.PictureBox.SizeMode == PictureBoxSizeMode.AutoSize) { this.AutoScroll = false; this.PictureBox.Size = this.ClientSize; this.PictureBox.SizeMode = PictureBoxSizeMode.Zoom; } // Si estamos en modo ajustar, desactivamos este modo else if (this.PictureBox.SizeMode == PictureBoxSizeMode.Zoom) { this.AutoScroll = true; this.PictureBox.SizeMode = PictureBoxSizeMode.AutoSize; } }

Cambie Zoom por StretchImage y compare los resultados.


Compilar y ejecutar para ver el resultado.

Qu pasa cuando selecciona la opcin Ajustar a ventana y cambia el tamao de la ventana hija? Solucione este problema aadiendo un manejador al evento Resize de la clase VentanaHija. Modifique este manejador como se indica:
private void VentanaHija_Resize(object sender, EventArgs e) { if (this.PictureBox.SizeMode == PictureBoxSizeMode.Zoom) this.PictureBox.Size = this.ClientSize; }

Compilar y ejecutar para ver el resultado.

Es importante dar informacin al usuario sobre si el modo Ajustar est activado en un determinado momento. Para ello, aada la siguiente lnea al final del manejador imagen_ajustar_Click (se supone que ha cambiado la propiedad Name de la orden Ajustar a ventana por menImagenAjustar):
menImagenAjustar.Checked = this.PictureBox.SizeMode == PictureBoxSizeMode.Zoom;

10.4 Rotar la imagen 90


Aada una orden al men Imagen que permita rotar la imagen 90 cada vez que sea ejecutada, independientemente de si sta est ajustada a la ventana hija o no. Use para

Pgina 7

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

ello el mtodo RotateFlip de la clase Image. Tenga en cuenta que tendr que modificar el tamao del control PictureBox antes de efectuar la rotacin, o de lo contrario parte de la imagen se perder en el caso de no ser perfectamente cuadrada. Adems, no olvide llamar al mtodo Refresh del PictureBox cuando haya finalizado la rotacin, para repintarlo correctamente.
Compilar y ejecutar para ver el resultado.

10.5 Aadir texto a la imagen


Aada una nueva orden llamada Aadir texto al men Imagen. Asciele el siguiente manejador:
private void imagen_aadirTexto_Click(object sender, EventArgs e) { using(Graphics gfx = Graphics.FromImage(this.PictureBox.Image)) { // Utilizar el mtodo DrawString de gfx para pintar el texto // "Programacin Visual" en la posicin 0,0 del rea de // cliente, utilizando una fuente Arial de 20 ptos // y una brocha blanca } // Refrescar el picture box }

El mtodo esttico FromImage de la clase Graphics nos proporciona un objeto con el que podemos dibujar sobre una imagen.
Compilar y ejecutar para ver el resultado.

10.6 Convertir la imagen a escala de grises


Como hemos visto en el apartado anterior, es fcil realizar transformaciones sencillas sobre una imagen empleando un objeto Graphics creado a partir de ella. Otra transformacin interesante es convertir la imagen a un espacio de color diferente. Para ello hay que crear una matriz 5x5 de transformacin y redibujar la imagen usando el mtodo DrawImage y la matriz de transformacin. Para poner esto en prctica, aada una nueva orden Escala de grises al men Imagen, y asciele el siguiente manejador:
private void imagen_escalaGrises_Click(object sender, EventArgs e) { PictureBox pictureBox = this.PictureBox; Image imagen = pictureBox.Image; using(Graphics gfx = Graphics.FromImage(imagen)) { // Matriz para realizar una transformacin al gris // manteniendo los valores de luminancia correctos ColorMatrix cm = new ColorMatrix(new float[][]{ new float[]{0.3f,0.3f,0.3f,0,0}, new float[]{0.59f,0.59f,0.59f,0,0},

Pgina 8

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

new float[]{0.11f,0.11f,0.11f,0,0}, new float[]{0,0,0,1,0}, new float[]{0,0,0,0,1}}); ImageAttributes ia = new ImageAttributes(); ia.SetColorMatrix(cm); // Utilizar el mtodo DrawImage de gfx para redibujar la // imagen usando los atributos de imagen especificados por ia } // Refrescar el picture box }

Para que este cdigo funcione tendr que hacer visible el espacio de nombres System.Drawing.Imaging, al que pertenecen la clase ColorMatrix e ImageAttributes.
Compilar y ejecutar para ver el resultado.

10.7 Abrir y guardar imgenes


Aada a la aplicacin la funcionalidad necesaria para que desde la orden Abrir del men Archivo se pueda cargar cualquier fichero de imagen (incluya al menos soporte para los formatos bmp, jpg y gif). Esto podra hacerse mediante un manejador con la siguiente estructura:
private void archivo_abrir_Click(object sender, EventArgs e) { // Mostrar dilogo OpenFileDialog // Mediante las propiedades Filter y Title del dilogo, // seleccione el tipo de archivos que se permiten abrir, // as como un ttulo explicativo para la ventana // Si el resultado del dilogo es distinto de OK, terminar byte [] contenidoArchivo = File.ReadAllBytes(rutaArchivo); // Creamos un flujo de tipo MemoryStream pasndole el contenido // del archivo // Usamos el mtodo FromStream de la clase Image para crear una // imagen a partir del flujo // Creamos una nueva ventana hija con el mtodo @, // pasndole como ttulo el nombre del archivo abierto. // Obtenemos una referencia a la nueva ventana mediante la // propiedad HijaActiva // Le asignamos "imagen" al picture box de la nueva ventana }

Compilar y ejecutar para ver el resultado.

Aada un men Archivo a la barra de mens del formulario VentanaHija. Cambie su propiedad MergeAction por MatchOnly. Esto har que se integre con el men
Pgina 9

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

Archivo del formulario principal. Agregue al nuevo men dos rdenes Guardar y Guardar como, que se encargarn de guardar en disco la imagen mostrada en la ventana activa, y un separador. Cambie la propiedad MergeAction de estos tres elementos por Insert, y su propiedad MergeIndex por 3, 4 y 5, respectivamente, para que se inserten en el lugar apropiado del men Archivo del formulario principal. Utilice el siguiente esquema para el manejador de Guardar como:
private void archivo_guardarComo_Click(object sender, EventArgs e) { // Mostrar dilogo SaveFileDialog y configurarlo de forma // anloga al OpenFileDialog de la opcin "Abrir" // Si el resultado del dilogo es distinto de OK, terminar if (dlgGuardar.FileName.ToUpper().EndsWith(".JPG")) // Usar el mtodo Save para guardar la imagen en formato jpg //Anlogamente con el resto de formatos permitidos // Actualizar ttulo de esta ventana }

Respecto al manejador de Guardar, debe tener en cuenta que si el ttulo de la ventana es DocN entonces la imagen no ha sido guardada con anterioridad, por lo que el proceso es anlogo al de Guardar como. En cambio, si el ttulo de la ventana ya es el de una ruta de un archivo, simplemente hay que guardar la imagen en esa ruta:
private void archivo_guardar_Click(object sender, EventArgs e) { if (ttulo de la hija activa comienza con "Doc") // Mismo cdigo que "Guardar como..." else // La guardamos en el mismo archivo del que se la lemos }

Para evitar tener cdigo duplicado, utilice la herramienta de refactorizacin para convertir el cdigo del manejador de Guardar como en un nuevo mtodo GuardarComo al que llamen tanto dicho manejador como el de Guardar.
Compilar y ejecutar para ver el resultado.

Ejecute su aplicacin y seleccione, sin haber abierto ninguna ventana, la orden Archivo > Cerrar. Qu pasa? El manejador de dicha orden espera que exista una ventana activa sobre la que trabajar, pero en este caso no la hay (la propiedad ActiveMdiChild vale null). Como resultado, el entorno de ejecucin lanza una excepcin de tipo NullReferenceException. Para evitar esto existen dos enfoques posibles. Uno de ellos pasa por comprobar, en los mtodos de la clase VisorImgenes en los que sea oportuno, que existe una ventana activa. As por ejemplo, podramos aadir al comienzo del manejador de la orden Archivo > Cerrar el siguiente cdigo:
private void archivo_cerrar_Click(object sender, EventArgs e) { if(this.HijaActiva == null)

Pgina 10

Programacin Visual - C#. NET


Dpto. de Computacin {

Guin de la prctica 1

MessageBox.Show("No hay ninguna ventana activa","Error", MessageBoxButtons.OK,MessageBoxIcon.Error); return; } // Lo dems igual que antes }

Otro enfoque ms intuitivo para el usuario consiste en no mostrar las rdenes que trabajan sobre la ventana activa cuando dicha ventana no existe, o mostrarlas inhabilitadas. Un buen sitio para hacer esto es el manejador del evento MdiChildActivate, que es invocado cada vez que se cambia la ventana hija activa. Por ejemplo, para conseguir que la orden Archivo > Cerrar aparezca inhabilitada cuando no exista ninguna ventana sobre la que trabajar, aada el siguiente cdigo al final de dicho manejador:
menArchivoCerrar.Enabled = this.HijaActiva != null;

Deber hacer lo propio con el resto de opciones de men que no tengan sentido si no existe una ventana activa (por ejemplo, Ventana > Mosaico). Use la herramienta de refactorizacin para extraer todo este cdigo en un nuevo mtodo llamado ActualizarMens, y llame a este mtodo tambin desde el constructor para que inicialmente los mens aparezcan en el estado correcto.
Compilar y ejecutar para ver el resultado.

10.8 Aadir soporte para arrastrar y soltar


En una interfaz grfica de usuario, llamamos arrastrar y soltar (drag-and-drop) al proceso por el cual el usuario hace clic sobre un objeto y lo arrastra encima de otro. Un ejemplo muy comn es arrastrar el icono de un archivo sobre una aplicacin para abrirlo con ella. Aadiremos esta funcionalidad de forma que el usuario pueda seleccionar una imagen en el explorador de Windows y arrastrarla sobre nuestra aplicacin para visualizarla. Para que la aplicacin acepte el arrastre de archivos, active la propiedad AllowDrop del formulario principal. A continuacin, aada el siguiente manejador para el evento DragEnter de dicho formulario:
private void VisorImgenes_DragEnter(object sender, DragEventArgs e) { // Nos aseguramos de que lo que se est arrastrando son archivos if(!e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.None; return; } string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); foreach (string file in files) { *

Pgina 11

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

if (!file.ToUpper().EndsWith(".JPG") && !file.ToUpper().EndsWith(".BMP") && !file.ToUpper().EndsWith(".GIF")) { e.Effect = DragDropEffects.None; // Uno de los archivos no // es una imagen return; } } e.Effect = DragDropEffects.Copy; // Correcto, son todo imgenes }

Este manejador nos permite seleccionar qu tipos de objetos se pueden arrastrar sobre nuestra aplicacin (en este caso, archivos de extensin jpg, bmp o gif). Si el usuario arrastra un objeto que no corresponde a esta descripcin, el cursor adopta la forma de un signo de prohibicin y la operacin no se puede finalizar.
Compilar y ejecutar para ver el resultado.

Aada a continuacin el siguiente manejador del evento DragDrop, que se encarga de abrir los archivos arrastrados una vez que el usuario ha soltado el botn del ratn:
private void VisorImgenes_DragDrop(object sender, DragEventArgs e) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); foreach (string file in files) AbrirArchivo(file); }

Deber aadir el mtodo AbrirArchivo, que tendr una implementacin similar a la de las ltimas lneas del manejador de la orden Archivo > Abrir. Para evitar duplicar cdigo, genere este mtodo usando la herramienta de refactorizacin Extraer mtodo.
Compilar y ejecutar para ver el resultado.

10.9 Barras de herramientas y de estado


Cree una barra de herramientas en el formulario principal y agrguele botones asociados a las funciones ms importantes del men principal (Nuevo, Abrir, Acerca de). Para estos botones, especifique los mensajes que deben aparecer al poner el ratn sobre ellos (propiedad Text). Nota: una forma sencilla de asociar un icono a un botn de la barra de herramientas es crearlo con un programa de dibujo (por ejemplo, MS Paint) y a continuacin importarlo en Visual Studio usando la opcin Recurso local > Importar de la ventana que aparece al pulsar en la propiedad Image del botn. Con el fin de evitar la duplicacin de cdigo, asocie a cada botn de la barra de herramientas el manejador del evento Click que ya cre para la correspondiente orden de men.
Compilar y ejecutar para ver el resultado.

Pgina 12

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

Como vimos en un apartado anterior, el men Imagen y la parte del men Archivo correspondiente a las rdenes de guardar son especiales, ya que pertenecen a la ventana hija activa, pero aparecen integrados con el men principal. Sus correspondientes botones de barra de herramientas se comportarn de forma anloga. Para ello, aada una barra de herramientas al formulario VentanaHija. Desactive la propiedad Visible de esta barra de herramientas, y aada botones para las rdenes Guardar, Ajustar a ventana, Aadir texto, Rotar y Escala de grises. Inserte un separador entre las dos primeras y asocie a cada botn el manejador de la opcin de men correspondiente. Para que los botones de la nueva barra de herramientas se inserten en el lugar apropiado de la barra principal tendr que cambiar su propiedad MergeAction por Insert. Cambie tambin su propiedad MergeIndex dndole a cada botn un valor que permita que se inserte donde le corresponde (ver figura siguiente). A diferencia de las barras de mens, la fusin de las barras de herramientas no es automtica, sino que hay que llamar explcitamente al mtodo Merge de ToolStripManager. El sitio ms apropiado para realizar esta operacin es el manejador del evento MdiChildActivate del formulario MDI:
private void VisorImgenes_MdiChildActivate( object sender, EventArgs e) { // ... ToolStripManager.RevertMerge(this.barraHerramientas); VentanaHija ventanaHijaActiva = this.ActiveMdiChild as VentanaHija; if (ventanaHijaActiva != null) ToolStripManager.Merge(ventanaHijaActiva.barraHerramientas, this.barraHerramientas); }

Compilar y ejecutar para ver el resultado.

Pruebe ahora a quitar la llamada al mtodo RevertMerge y compare los resultados.


Pgina 13

Programacin Visual - C#. NET


Dpto. de Computacin

Guin de la prctica 1

No olvide que el botn correspondiente a la orden Ajustar a ventana debe aparecer marcado (Checked=true) cuando esta opcin se encuentre activada para la ventana hija activa.
Compilar y ejecutar para ver el resultado.

A continuacin aadir una barra de estado. Para ello, aada un control StatusStrip al formulario VisorImgenes desde la caja de herramientas. A continuacin, coloque en ella una etiqueta de texto de estado (StatusLabel) llamada etiquetaEstado. Active la propiedad Spring de esta etiqueta, y cambie su propiedad TextAlign a MiddleLeft. Haciendo uso de los eventos MouseEnter y MouseLeave de los mens, botones, etc., muestre la informacin que desee en la barra de estado (por ejemplo, para la orden de men Archivo > Nuevo y para su correspondiente botn de la barra de herramientas puede mostrar el texto Crea una nueva ventana con una imagen predefinida.
Compilar y ejecutar para ver el resultado.

Para finalizar deber agregar al men Ver rdenes que permitan mostrar u ocultar la barra de estado y la barra de herramientas. Estas rdenes debern aparecer marcadas (Checked=true) cuando la barra correspondiente est visible (pista: use el evento DropDownOpened del men Ver).
Compilar y ejecutar para ver el resultado.

Posibles mejoras (Opcional)


Como posibles mejoras puede aadir ms funcionalidad al programa. Un primer paso sera hacer que permita abrir imgenes de ms tipos (bmp, png, tiff, etc.), as como guardarlas en estos mismos formatos. Tambin puede aumentar la funcionalidad en las rotaciones, permitiendo ngulos distintos de 90, y variando el eje de rotacin. Otra opcin sera extender la orden Aadir texto para que permitiese elegir el lugar de insercin del texto y la fuente empleada para ste. O jugar con los valores de la matriz de transformacin en la opcin Convertir a escala de grises para implementar otras opciones relacionadas (Escala de rojos, Escala de azules, etc.). Por ltimo podra aadir la funcionalidad para que la aplicacin fuera compatible con el portapapeles de Windows. Para ello, puede aadir un nuevo men Edicin con las rdenes Copiar y Pegar, y en los manejadores de estas rdenes puede usar los mtodos SetData y GetData, o bien SetImage y GetImage, de la clase Clipboard para leer o escribir la imagen en el portapapeles.

Pgina 14