Mode:       
Tuesday, March 09, 2010    Register  •  Login
   
 
   
   
   
 
 
     
 
   Publica en MSDNCuenca Minimize

CONSTRUYENDO UN PRESENTADOR DE IMÁGENES BÁSICO CON C#

 

Muchas de las veces cuando deseamos realizar una pequeña presentación de nuestras imágenes que tenemos en nuestra carpeta de “Mis Imágenes” usamos  MS PowerPoint ó usamos la funcionalidad de Windows “Ver como una presentación”, en ambos casos tenemos un resultado final “Ver las imágenes como una presentación” la aplicación que se ha desarrollado es un pequeño explorador de imágenes (Figura 1) construido con C#,  el cual nos permitirá realizar una exploración de las imágenes y posteriormente visualizarlas en toda la pantalla del computador (Figura 2).
 

Figura 1: Explorador y Presentador de imágenes
 
Figura 2: Vista de imagen en tamaño Full Screan
PASO 1
Comencemos analizando el código para obtener la ruta del directorio “Mis Imágenes” para lo cual examinaremos la clase Ficheros
public class Ficheros
{
    public static string MisImagenes()
    {
      return Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
    }
}
Usaremos   Environment.GetFolderPath()   obtendremos una cadena del tipo string la cual contendrá la ruta del directorio “Mis Imágenes” para lo cual nos valemos del un enumerador como lo es Environment.SpecialFolder.MyPictures el cual sirve para especificar las constantes enumeradas que se utilizan para recuperar rutas de acceso a directorios en carpetas especiales de sistema (Special Folder).
El motivo de construir esta pequeña clase se fundamenta por motivos de que de las diferentes versiones de sistemas operativos de Windows XP y Vista (Español, Ingles ) el nombre de la carpeta “Mis imágenes” cambia dependiendo del idioma Ej. C:/Documents and Settings/<usuario>/Mis ImágenesC:/Documents and Settings/<usuario>/My Pictures ó C:/Users/<usuario>/My Pictures  etc., lo cual nos evita quemar en código la ruta de dicha carpeta.

A continuación creamos un nuevo formulario (Form1) y luego procedemos a arrastras los siguientes controles de TOOLBOX: Colocamos dentro del formulario un ToolStrip y un MenuStrip seguido, arrastramos un SplitContainer el cual dividirá el formulario en dos areas de trabajo (Panel1 a la izquierda y Panel2 a la derecha). En el Panel1 arrastramos a su interior el control TreeView (treeView1), y en el Panel2 colocamos un ListView (listView1), a continuación colocamos un control ImageList (imageList2).

Figura 3: Controles que conforman la aplicación.
 
Presionamos F7 para examinar el código del formulario y definimos una variable privada FileInfo de tipo array la cual llamaremos fullNameImages (FileInfo[] fullNameImages; ),  la cual nos servirá para acceder a información de los archivos cargados en la misma, a continuación revisaremos el código que usaremos para cargar el listView1 con las miniaturas de las imágenes.
¿Cómo funciona este método?
La idea del algoritmo consiste en:
1)      Seleccionamos los ficheros de tipo “*.jpg” ayudándonos del path ó ruta que deseemos y cargamos dicho resultado en el arreglo de tipo fullNameImages (FileInfo[]) que definimos anteriormente.
2)      Recorremos el arreglo fullNameImages con un foreach, y procedemos a añadir cada imagen a nuestro imageList2, luego procedemos a añadir los ítems a nuestro listView1 los cuales son nuestras imágenes del imageList2 para lo cual al momento de añadirlo usaremos un índice, un nombre para el Item que en nuestro caso es el nombre del fichero de imagen y el imagekey que en nuestro caso es la ruta del fichero.
3)      Regresamos a la ventana de diseño y procedemos a hacemos click en el listView1 y en la ventana de propiedades nos ubicamos en Behavior y cambiamos la propiedad LargeImageList y seleccionamos imageList2.
4)      Seleccionamos el imageList2 y lo configuramos de la siguiente manera:
a.     Image Size: 100, 100
b.     Image Bit Depth: depth24bit
Esto lo hacemos para poder visualizar las imágenes en un tamaño aceptable y de buena calidad.
 
///<summary>
/// Obtiene las imagenes tipo [JPG] del directorio deseado y las carga en [ListView]
///</summary>
///<param name="directorio"></param>
void CargarMiniaturas(string directorio)
{
   try
   {
      if (listView1.Items.Count > 0) //Limpia el contenido de los controles
      {
           listView1.Clear();
           imageList2.Images.Clear();
      }
      fullNameImages = new DirectoryInfo(directorio).GetFiles("*.jpg");
      int c = 0;
      foreach (FileInfo info in fullNameImages)
      {                         //ImageKey,    Imágen
          imageList2.Images.Add(info.FullName, (Image)(new Bitmap(info.FullName)));
                                //indice, Nombre Imagen, ImageKey
          listView1.Items.Insert(c, info.Name, info.FullName);
          c++;
      }
    }
    catch
    {
      throw;
    }
}
 
El código antes mencionado lo usaremos tanto al momento de cargar las imágenes al inicio y en el transcurso del uso de la aplicación. El código que seguidamente encontraremos se ejecutara al momento de iniciar la aplicación, a través del evento Load del formulario.
El funcionamiento es así:
1)      Instanciamos un objeto de tipo DirectoryInfo al cual le enviaremos la ruta (path) de donde se encuentra la carpeta Mis Imágenes, esto con el fin de obtener todos los directorios que se encuentre dentro de dicha carpeta.
2)      Haciendo uso de un foreach recorremos el arreglo de directorios producto de llamar al método GetDirectories el cual nos retorna un arreglo de tipo DirectoryInfo con la ruta de los directorios. A continuación añadimos un nuevo nodo al treeView1 con la ruta completa del subdirectorio.
Nota: Esta operación se realiza por única vez al momento de iniciar la aplicación.
3)      Llamamos al método CargarMiniaturas para lo cual enviamos por defecto la ruta de la carpeta “Mis Imágenes” con el fin de mostrar por defecto las imágenes que se encuentran directamente bajo dicho directorio.
4)     private void Form1_Load(object sender, EventArgs e)
5)     {
6)       try
7)       {
8)           DirectoryInfo objDI = new DirectoryInfo(Ficheros.MisImagenes());
9)           treeView1.Nodes.Add("------");
10)      treeView1.Nodes.Add(Ficheros.MisImagenes());
11)                
12)      TreeNode t = new TreeNode("Directorios");
13)      foreach (DirectoryInfo carpetas in objDI.GetDirectories())
14)      {
15)           t.Nodes.Add(carpetas.FullName);                   
16)      }
17)      treeView1.Nodes.Add(t);
18)      CargarMiniaturas(Ficheros.MisImagenes());
19) 
20) 
21)     /* foreach (DirectoryInfo carpetas in objDI.GetDirectories())
22)     {
23)       treeView1.Nodes.Add(carpetas.FullName);
24)     }
25)     CargarMiniaturas(Ficheros.MisImagenes());
26)     */ 
27)   }
28)   catch (Exception exx )
29)   {
30)       MessageBox.Show(exx.Message);            
31)   }           
32)   }
 
Hasta este momento lograremos visualizar algo parecido a lo que se muestra en la Figura 1
 
 
PASO 2
Creando el formulario que actuara como Full Screan para presentar las imágenes.
Procedemos a crear un nuevo formulario (Form2) y procedemos a modificar el constructor por defecto del formulario de la siguiente forma:
public Form2(FileInfo[] rutasFicheros, int tiempo )
{
   InitializeComponent();
   RutasFicheros = rutasFicheros;
   crono.Interval = tiempo;
   ////////// CONFIGURACION DEL FORM /////////
   this.ShowIcon = false;
   this.ShowInTaskbar = false;
   this.FormBorderStyle = FormBorderStyle.None;
   this.Bounds = Screen.PrimaryScreen.Bounds;
   this.BackgroundImageLayout = ImageLayout.Zoom;
   this.BackColor = Color.Black;
   Cursor.Hide();
   ///////////////////////////////////////////
}
//// Obtener la posicion actual del cursor al momento de cargarce el formulario
Point pos = Cursor.Position;
//// Propiedad para almacenar las rutas de los ficheros de imagen
private FileInfo[] RutasFicheros
{
     get; set;
}
 
El motivo por el que el constructor recibe dos parámetros de tipo FileInfo[] y int, es debido que el primero se refiere a las rutas de las imágenes a proyectar y el tiempo que se tardar por cada imagen.
El código que se encuentra dentro de las líneas comentadas CONFIGURACION DEL FORM, son configuraciones que nos servirán para crear una pantalla que cubrirá toda el área visible de la pantalla principal las cuales definirán el BackColor del formulario a negro y ocultaran el cursor entre otras.
A continuación procedemos a arrastrar un control Timer (crono) desde el ToolBox a nuestro formulario (Form2) y procedemos a hacer doble click sobre dicho control (crono) el cual nos generara el evento Tick tal y como se muestra a continuación.
 
private void crono_Tick(object sender, EventArgs e)
{
 try
 {
     MostrarImagenes();
 }
 catch (Exception EX)
 {
      MessageBox.Show(EX.Message, "Error", MessageBoxButtons.OK,
      MessageBoxIcon.Error);
      this.Close();
 }
}
 
Este evento llamara al método MostrarImagenes, el cual ejecutara las siguientes instrucciones
int contador = 0;
void MostrarImagenes()
{
   if (contador < RutasFicheros.Length)
   {
   // A la imagen se le añade una leyenda al pie y se hace un cast para mostrarla
      this.BackgroundImage =
                    (Image)new Imagenes.CopyRight().AnadirCopyRight(
                      RutasFicheros[contador].FullName,
                      Properties.Resources.Leyenda
                    );
      contador++;
   }
   else contador = 0;
}
 
Dado que RutasFicheros es del tipo FileInfo[] , podemos darnos cuenta que no es más que un simple arreglo. Por lo que usaremos un contador para ir recorriendo uno a uno las posiciones de RutasFicheros cada vez que sea llamado por el evento Tick del Timer (crono), y de donde obtendremos el Full Path del archivo que contiene la imagen que será anexada como imagen de fondo y a la que se le añadirá una pequeña leyenda para su presentación.
Al ejecutarse este formulario se cargara una pantalla que cubrirá toda la pantalla y que mostrara una a una las imágenes en formato de presentación.
Para poder cerrar la pantalla en ejecución (Form2) creamos los eventos: MouseDown y MouseMove con el nombre EventoRaton tal y como se muestra a continuación
private void EventoRaton(object sender, MouseEventArgs e)
{
     if (pos.X != e.X || pos.Y != e.Y) this.Close();
     if (e.Clicks > 0) this.Close();          
}
Este evento se encargara de capturar algún movimiento ó click realizado por el ratón (Point pos = Cursor.Position;) y procederá a cerrar el formulario.
Todo el código antes descrito se ejecutara al iniciar el evento Load del formulario (Form2)
private void Form2_Load(object sender, EventArgs e)
{
      crono.Enabled = true;
      MostrarImagenes();
}
 
 
 
 
 
PASO 3
Añadiendo CopyRight ó Leyenda a una imágen
El proceso de añadir una leyenda a una imagen es muy sencillo y consiste en cargar la imagen desde el archivo en un Bitmap y luego definir tipo de fuente, tamaño a usar, definir la posición del texto dentro de la imagen y seguidamente a dibujar el texto en la imagen, luego liberamos los recursos usados y retornamos un Bitmap el cual contiene la imagen que se mostrara como Imagen de fondo en el form2.
using System;
using System.Data;
using System.Configuration;
using System.Drawing;
namespace Imagenes
{
    ///<summary>
    /// Añade CopyRight o leyenda al pie de una imágen
    ///</summary>
    public class CopyRight
    {
        public Bitmap AnadirCopyRight(string fichero, string leyenda)
        {
            try
            {                                             
                Bitmap bmp = new Bitmap(fichero);
                Graphics grafico = Graphics.FromImage(bmp);
 
                //Se define el tipo de color de la fuente
                SolidBrush colortexto = new SolidBrush(Color.Orange );
                //Se define el tipo de fuente de la leyenda
                Font tipofuente = new Font("Arial", 12,FontStyle.Bold);
                SizeF tamanotexto = new SizeF();
                tamanotexto = grafico.MeasureString(leyenda, tipofuente);
 
                float x = ((float)bmp.Width - tamanotexto.Width - 3);
                float y = ((float)bmp.Height - tamanotexto.Height - 3);
                float w = ((float)x + tamanotexto.Width);
                float h = ((float)y + tamanotexto.Height);
                RectangleF area = new RectangleF(x, y, w, h);
                grafico.FillRectangle(new SolidBrush(Color.Transparent ), area);
                //Se imprime el texto en la imagen
                grafico.DrawString(leyenda, tipofuente, colortexto, area);               
                //Se libera los recursos
                colortexto.Dispose();
                tipofuente.Dispose();
                grafico.Dispose();
               
                return bmp;                                               
            }
            catch
            {
                throw;
            }
        }
    }
}
 
Nota: Este código se lo puede usar por separado para añadir a un gran número de imágenes una leyenda como las que se puede observar cuando se copia una imagen de MS Encarta esto con el fin de mantener el derecho de autor de una imagen.
PASO 4
Añadiendo funcionalidades extra a la imagen
Hasta el momento tenemos construido un pequeño explorador de imágenes que nos permite visualizar las imágenes en modo presentación, pero podemos añadir una nueva funcionalidad como lo es abrir una imagen al seleccionarla, para lo cual se construye la siguiente clase.
namespace CORE
{
    public static class LauncherApplication
    {
        ///<summary>
        /// Abre el archivo para ser mostrado
        ///</summary>
        public static void LanzarAplicacion(string fullpath )
        {                       
            try
            {               
                Process.Start(fullpath);
            }
            catch
            {               
                throw;
            }                   
        }
    }
}
Esta clase es muy sencilla, ya que delegara al SO la tarea de abrir el archivo de imagen seleccionada con el Software de imágenes usado por defecto para abrir el tipo de imágenes JPG. Esto se logra a través de usar la clase Process la cual implementa un método Start el cual recibe como parámetro el Full Path de nuestra imágen.
Seguido de construir la antes mencionada clase nos ubicamos en el Form1 y seleccionamos el control listView1 y creamos el evento ItemSelectionChanged al cual le añadiremos el siguiente código, el cual usaremos para extraer el FullPath de la imagen seleccionada ya que al momento de crear el ítem del ListView definimos un ImageKey. Dicho FullPath lo usaremos para enviarlo como parámetro a la clase LauncherApplication.
private void listView1_ItemSelectionChanged(object sender,
                                           ListViewItemSelectionChangedEventArgs e)
{
   try
   {
     if (e.Item.Selected)               
        CORE.LauncherApplication.LanzarAplicacion(e.Item.ImageKey);
  }
   catch (Exception ex)
  {
      MessageBox.Show(ex.Message);
   }
}
 

 

del mismo autor otro artículo:

COMO APAGAR EL COMPUTADOR

 

Introducción

En este articulo te explicare como apagar tu PC a determinada hora usando el comando SHUTDOWN.EXE el cual lo encontramos en todas las versiones de Windows XP, Windows Server 2003 y Windows Vista utilizando Microsoft Visual C#.
 
SHUTDOWN
Antes de comenzar te explico en qué consiste el comando Shutdown de Windows.
Nota: Shutdown es una pequeña aplicación que se incluye los sistemas operativos de Microsoft para encargarse de las operaciones de apagado, reinicio e hibernación de la PC local ó de una PC que se encuentre en red.
 
Shutdown puede ayudarse de algunas opciones para apagar, reiniciar, una PC, estas opciones las encuentras a continuación.
 
Si deseas saber más sobre shutdown (C:/Windows/system32/SHUTDOWN.EXE) te recomiendo que abras una ventana de consola y ejecutes el comando y te mostrara la lista de las opciones de apagado. Aquí solo te muestro unas las más importantes.
 
Usage: shutdown [/i | /l | /s | /r | /g | /a | /h | /e] [/m \\computer][/t xxx][/d [p|u:]xx:yy ]
/i Muestra la interface de usuario (GUI).
/l Log off.
/s Apaga la computadora.
/r Apaga y reinicia la computadora.
/g Apaga y reinicia la computadora. Usada para registrar aplicaciones.
/a Aborta un apagado de sistema.
/h Hibernar la computadora.
/e Documenta la razón por la cual se apagara la computadora.
/m \\computer Especifica el target de la computadora a apagar.
/t xxx El periodo en que se apagar la computadora el cual se encuentre entre 0-600. Tiene por defecto asignado 30 segundos.
/d [p|u:]xx:yy Provee la razón por la que se reinicia ó apaga el PC.
(p indica que es planeado. u indica que es planeado por el usuario.)
 
Como ya viste en la lista de argumentos que puedes usar con shutdown.exe puedes darte cuenta que para apagar la PC tienes que ejecutar “shutdown –s” ó si deseas reiniciar “shutdown –r” ., etc. todo a criterio de para que lo vayas a usar.
 
La mayoría de la gente por lo general olvida apagar su PC, lo cual conlleva a que la PC este encendida durante un largo periodo sin desarrollar ninguna tarea y a su vez consumiendo energía.
 
La aplicación de ejemplo te muestra una idea de cómo apagar la computadora en un rango de 1-60 segundos. Para lo cual usaremos la clase Process que trae el Framework de .Net, además usaremos Thread's para poder seguir trabajado mientras la aplicación se ejecuta paralelamente.
 
 
A continuación sigue código en Visual C#:
 
public class class_apagado
{
    string argumento = null;
    DateTime tmp;
    public class_apagado(string argumento, DateTime tmp)
    {
        this.argumento = argumento;
        this.tmp = tmp;
    }      
    public void Shut_Down()
    {
      try
      {
        while (true)
        {                   
          if(tmp.ToLongTimeString()==DateTime.Now.ToLongTimeString())
          {
              Process proceso = new Process();
              proceso.StartInfo.UseShellExecute = false;
              proceso.StartInfo.RedirectStandardOutput = true;
              proceso.StartInfo.FileName = "shutdown.exe";
              proceso.StartInfo.Arguments = this.argumento;
              proceso.Start();
              break;
          }
        }
      }
      catch
      {
          throw;
      }
   }
}
 
Expliquemos cómo funciona la clase (class_apagado) que se encargara de apagar el computador, la clase recibe como parámetros de entrada los siguientes argumentos que en nuestro caso puede ser “-r”, “-s” ó “-h” y la fecha con su hora a la que tiene que apagarse.
El método Shut_Down() implementara un bucle while que se encargara de validar la fecha y hora actual con la que deseamos que se apague el computador, en el caso de que se cumpla la condición se instanciara la clase Process la cual nos ayudara a manejar este tipo de procesos a dicha instancia definimos UseShellExecute a false el cual es para indicar si se va a usar el Shell del SO, RedirectStandarOutput a true. Definimos: “proceso.StartInfo.FileName = “shutdown.exe” “ esto con el fin de indicar que comando se ejecutara y seguido de eso definimos “ proceso.Startinfo.Arguments = this.argumento; ” este argumento llegaría a ser “-r”, “-s” ó “-h” dependiendo de la necesidad y para ejecutar el comando con su respectivo argumento usamos el método Start().
 
 
 
El código antes mencionado se lo debe implementar de la siguiente forma si deseamos apagar el computador.
class_apagado demo = new class_apagado(“-s” , fecha_futuro);
Thread hilo = new Thread(new ThreadStart(demo.Shut_Down));
hilo.IsBackground = true;
hilo.Name = "Apagado"; //esta línea se la puede omitir
hilo.Start();
Nota: fechaFuturo debe ser del tipo DateTime Con la fecha a futuro
El motivo de usar hilos es porque sin el uso de los mismos la aplicación se congelaría y conllevaría a un uno ineficiente del sistema. Por lo que la implementamos en modo BACKGROUND.
 
Print    
     
     
 
   Artículos Minimize
 TitleOwnerCategoryModified DateSize (Kb) 
 
Print    
     
     
 
   En línea Minimize
People Online People Online:
Visitors Visitors: 2
Members Members: 0
Total Total: 2

Online Now Online Now: