Introducción:
Como te he comentado en la "descripción"; veremos cómo usar el método ExtractAssociatedIcon
de la clase Icon, de forma que podamos obtener un objeto de tipo Icon para usarlo en
nuestros programas. También veremos cómo convertir ese icono en un Bitmap para que podamos
usarlo en un control de tipo PictureBox.
En realidad hay poco que explicar, pero más que nada por si te da por buscar
cómo hacerlo, para que lo sepas.
Lo que hay que resaltar es que el método ExtractAssociatedIcon (que es
estático o compartido) espera una cadena con el nombre de un fichero existente, y lo que
devuelve es el icono que está asociado a la extensión (o tipo) de ese fichero.
Lo que no puedes hacer es usarlo de forma genérica para saber el icono
asociado a una extensión en particular, (al menos si no sabes si existe o no un fichero de esa
extensión), para saber eso, (el icono asociado a cualquier extensión), tendrás que usar acceso
al registro de Windows. Estoy preparando una clase que te facilitará eso y mucho más, sigue
atento, je, je.
El código que te voy a mostrar es válido para cualquier versión de .NET Framework, y por tanto
para cualquier versión de Visual Basic y C#.
¿Cómo obtener el icono asociado a un fichero existente?
Pues usando el método ese que te he indicado:
Para Visual Basic 2005:
Dim icono As Icon
icono = System.Drawing.Icon.ExtractAssociatedIcon(Me.txtFic.Text)
Para C# 2005:
Icon icono;
icono = System.Drawing.Icon.ExtractAssociatedIcon(this.txtFic.Text);
¿Cómo convertir de Icon a Bitmap?
Esto no es nuevo en .NET Framework 2.0, en este caso es un método de
instancia de la clase Icon, por tanto tendremos que usar el objeto que queremos convertir a un
Bitmap. El método es: ToBitmap.
Para usarlo, simplemente usamos ese método desde la variable del icono, pero debemos comprobar
que en realidad ese icono tenga algo, ya que si contiene un valor nulo, se producirá una
excepción, por tanto... ¡mejor prevenir que curar!
Para Visual Basic 2005:
If icono IsNot Nothing Then
Me.picIcon.Image = icono.ToBitmap()
Else
Me.picIcon.Image = Nothing
End If
Para C# 2005:
if( icono != null )
{
this.picIcon.Image = icono.ToBitmap();
}
else
{
this.picIcon.Image = null;
}
Un ejemplo que usa de forma práctica lo explicado:
Abajo te pego el código de una aplicación de ejemplo en la que podemos
indicar el fichero del que queremos averiguar el icono asociado.
Ese fichero lo podemos indicar usando un cuadro de diálogo de abrir (OpenFileDialog)
o bien usando Drag & Drop (arrastrar y soltar), para lo cual usamos la comprobación de si el
tipo de fichero soltado es uno de los indicados en la enumeración DataFormats, concretamente
FileDrop.
Ese mismo "tipo" de fichero usado con arrastrar y soltar se puede indicar por
medio de una cadena: "FileDrop", de cualquiera de las dos formas es válido.
Para aceptar ficheros soltados, debemos asignar un valor True a la propiedad
AllowDrop, en este caso del formulario, con idea de que se suelte donde se suelte siempre se
acepte.
Debido a que FileDrop puede contener más de un fichero, el tipo de datos
contenido en el método GetData de la propiedad Data del segundo parámetro del evento DragDrop,
es un array de tipo String, por tanto, si solo queremos saber el nombre del primer fichero,
debemos tomar el que esté en el índice cero, pero debido a que el método GetData devuelve un
valor Object, debemos hacer la conversión (casting) adecuada para convertir ese objeto en un
array de tipo String, este sería el código:
Para Visual Basic .NET (todas las versiones):
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim sFic As String
' Devuelve un array de tipo String,
' solo nos interesa el primer elemento
sFic = CType(e.Data.GetData(DataFormats.FileDrop, True), String())(0)
Me.txtFic.Text = sFic
End If
Para C# (todas las versiones):
if( e.Data.GetDataPresent(DataFormats.FileDrop) )
{
string sFic;
// Devuelve un array de tipo String,
// solo nos interesa el primer elemento
sFic = ((String[])e.Data.GetData(DataFormats.FileDrop, true))[0];
this.txtFic.Text = sFic;
}
Para saber si se aceptan o no ficheros soltados, debemos comprobar de que
tipo es lo que se quiere soltar, en este caso nos interesa FileDrop, pero podríamos
comprobar lo que nos interesara, al menos si en lugar de arrastrar y soltar ficheros queremos
que se puedan arrastrar otras cosas... pero no nos compliquemos.
Esa comprobación debemos hacerla en el evento DragEnter (o DragOver)
y lo que hacemos es usar el método GetDataPresent de la propiedad Data del segundo
parámetro del evento DragEnter.
El código sería como el mostrado antes, pero además debemos asignar un valor para el tipo de
acción que queremos permitir, en este caso he usado el valor DragDropEffects.Copy, el
cual asignaremos a la propiedad Effect del mencionado segundo parámetro del método del
evento.
En el código completo puedes verlo con más detalle.
El icono se muestra a un tamaño de 64x64, para ello he usado el valor
PictureBoxSizeMode.Zoom, el cual he asignado a la propiedad SizeMode del picture, al
pulsar en el checkBox puedes hacer que se muestre al tamaño normal, (32x32).
Aquí tienes una captura del formulario en modo de diseño:
El formulario de la utilidad en modo diseño
Te recuerdo que todo el código necesario (salvo la definición del formulario)
lo tienes abajo, tanto para Visual Basic 2005 como para
Visual C# 2005.
Espero que te sea de utilidad todo lo que te he explicado... ¡esa es la
intención!
Nos vemos.
Guillermo
Al final de la página tienes el ZIP con el código para la versión
2005 de Visual Basic y Visual C#
El código para Visual Basic
|
'------------------------------------------------------------------------------
' Mostrar el icono asociado a un fichero (24/Ago/06)
' Usando el método compartido ExtractAssociatedIcon.
' Para convertir de Icon a Bitmap se usa ToBitmap.
' También se muestra como usar Drag & Drop
'
' ©Guillermo 'guille' Som, 2006
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Public Class Form1
Private Sub Form1_Load( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles MyBase.Load
' Un fichero que seguramente todos tenemos
Dim winDir As String = System.Environment.SystemDirectory
Me.txtFic.Text = winDir & "\desktop.ini"
End Sub
Private Sub btnExaminar_Click( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles btnExaminar.Click
' Seleccionar un fichero
Dim openFD As New OpenFileDialog
openFD.Title = "Selecciona el fichero del que quieres el icono"
openFD.Filter = "Todos los ficheros (*.*)|*.*"
If openFD.ShowDialog = Windows.Forms.DialogResult.OK Then
Me.txtFic.Text = openFD.FileName
End If
End Sub
Private Sub btnMostrar_Click( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles btnMostrar.Click
' Mostrar el icono en el picture
Try
Dim icono As Icon
icono = System.Drawing.Icon.ExtractAssociatedIcon(Me.txtFic.Text)
' Convertirlo a Bitmap y asignarlo a la propiedad Image del picture
If icono IsNot Nothing Then
Me.picIcon.Image = icono.ToBitmap()
Else
Me.picIcon.Image = Nothing
End If
Catch ex As Exception
MessageBox.Show("ERROR:" & ex.Message, _
"Al extraer el icono asociado", _
MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
End Sub
Private Sub Form1_DragEnter( _
ByVal sender As Object, _
ByVal e As DragEventArgs) Handles MyBase.DragEnter
' Aceptar ficheros soltados
' Drag & Drop, comprobar con DataFormats
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.Copy
End If
End Sub
Private Sub Form1_DragDrop( _
ByVal sender As Object, _
ByVal e As DragEventArgs) Handles MyBase.DragDrop
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim sFic As String
' Devuelve un array de tipo String,
' solo nos interesa el primer elemento
sFic = CType(e.Data.GetData(DataFormats.FileDrop, True), String())(0)
Me.txtFic.Text = sFic
End If
End Sub
Private Sub chkAjustar_CheckedChanged( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles chkAjustar.CheckedChanged
' Ampliar el icono a 64x64 o dejarlo en normal
If Me.chkAjustar.Checked Then
Me.picIcon.SizeMode = PictureBoxSizeMode.Zoom
Else
Me.picIcon.SizeMode = PictureBoxSizeMode.Normal
End If
End Sub
End Class
|
El
código para C#
|
//-----------------------------------------------------------------------------
// Mostrar el icono asociado a un fichero (24/Ago/06)
// Usando el método compartido ExtractAssociatedIcon.
// Para convertir de Icon a Bitmap se usa ToBitmap.
// También se muestra como usar Drag & Drop
//
// ©Guillermo 'guille' Som, 2006
//-----------------------------------------------------------------------------
using Microsoft.VisualBasic;
using System;
using System.Windows.Forms;
using System.Drawing;
namespace iconoAsociado_CS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Un fichero que seguramente todos tenemos
string winDir = System.Environment.SystemDirectory;
this.txtFic.Text = winDir + @"\desktop.ini";
}
private void btnExaminar_Click(object sender, EventArgs e)
{
// Seleccionar un fichero
OpenFileDialog openFD = new OpenFileDialog();
openFD.Title = "Selecciona el fichero del que quieres el icono";
openFD.Filter = "Todos los ficheros (*.*)|*.*";
if( openFD.ShowDialog() == System.Windows.Forms.DialogResult.OK )
{
this.txtFic.Text = openFD.FileName;
}
}
private void btnMostrar_Click(object sender, EventArgs e)
{
// Mostrar el icono en el picture
try
{
Icon icono;
icono = System.Drawing.Icon.ExtractAssociatedIcon(this.txtFic.Text);
// Convertirlo a Bitmap y asignarlo a la propiedad Image del picture
if( icono != null )
{
this.picIcon.Image = icono.ToBitmap();
}
else
{
this.picIcon.Image = null;
}
}
catch( Exception ex )
{
MessageBox.Show("ERROR:" + ex.Message,
"Al extraer el icono asociado",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}
private void Form1_DragEnter(object sender, DragEventArgs e)
{
// Aceptar ficheros soltados
// Drag & Drop, comprobar con DataFormats
if( e.Data.GetDataPresent(DataFormats.FileDrop) )
{
e.Effect = DragDropEffects.Copy;
}
}
private void Form1_DragDrop(object sender, DragEventArgs e)
{
if( e.Data.GetDataPresent(DataFormats.FileDrop) )
{
string sFic;
// Devuelve un array de tipo String,
// solo nos interesa el primer elemento
sFic = ((string[])e.Data.GetData(DataFormats.FileDrop, true))[0];
this.txtFic.Text = sFic;
}
}
private void chkAjustar_CheckedChanged(object sender, EventArgs e)
{
// Ampliar el icono a 64x64 o dejarlo en normal
if( this.chkAjustar.Checked )
{
this.picIcon.SizeMode = PictureBoxSizeMode.Zoom;
}
else
{
this.picIcon.SizeMode = PictureBoxSizeMode.Normal;
}
}
}
}
|
Espacios de nombres usados en el código de este artículo:
System.Windows.Forms
System.Drawing
|