Índice de la sección dedicada a punto NET (en el Guille)

PortapapelesCS

Publicado el 15/Ene/2002


Varios ejemplos con cosas cómo:
Arrastrar y soltar ficheros en un formulario,
Seleccionar ficheros con el OpenFileDialog,
Leer ficheros de texto y asignarlo a un TextBox Multiline,
Leer ficheros de imágenes y asignarlos a un PictureBox,
Copiar texto y/o imágenes en el portapapeles,
Pegar una imagen desde el portapapeles,
Mostrar los tipos de datos que hay en el portapapeles,
Usar una función del API para convertir nombres cortos en nombres largos,
Usar TabControl con scroll virtual (en el caso del contenedor de la imagen),
Uso de Anchor para autoajustar los controles cuando se cambia el tamaño del formulario.
(no se si se me olvida alguna otra cosa...)
 

Este mismo ejemplo también está disponible en VB.NET

 

Como has podido comprobar, son un montón de cosas las que te muestro en el código del PortapapelesCS no sólo lo que el título indica, (por eso he puesto esa lista de cosillas que te voy a mostrar y explicar con esta aplicación creada en Visual Studio.NET beta 2 en español, que es la versión "pública" que hay por ahora... salvo que hayas conseguido la RC1, pero como esa versión está más limitada... he comprobado que esto que te cuento funcione en la Beta 2.

En esta aplicación se usa una función del API para convertir un nombre corto en uno largo, la declaración usada es de la función para UNICODE, por tanto, si estás usando el Windows 98 o el Windows ME, tendrás que usar la versión ANSI, si no lo haces... no te funcionará lo de convertir el nombre corto en uno largo y por tanto parecerá que no funciona lo de arrastrar/soltar ficheros en el formulario.
Estás sobre aviso.

También te muestro este mismo código en VB.NET, (en el link que hay un poco más arriba).
Te diré que inicialmente creé este ejemplo con el VB.NET.
Después añadí un nuevo proyecto C# y copié todos los controles del formulario de VB y los pegué en el de C#.
Lo mismo hice con el código, aunque primero creé los eventos correspondientes a cada botón, etc.
Después simplemente copié el código de cada evento y lo pegué... y por supuesto tuve que "convertirlo" para que funcionara en C#, pero los cambios simplemente fueron necesarios para adaptar la sintaxis del VB a la de C#, ya que no es igual... como te imaginarás, pero gracias al uso del .NET Framework, los cambios son mínimos, ya que el funcionamiento real en VB y C# es idéntico, con la excepción de la mencionada sintaxis.


Aquí sólo te voy a mostrar el código, si quieres ver las explicaciones sobre el código, échale un vistazo a la versión de esta aplicación para VB.NET, ya que, como he comentado, es prácticamente igual a la de C#.

El código del formulario:


/// <summary>
/// Terminar el programa.
/// </summary>
private void btnSalir_Click(object sender, System.EventArgs e)
{
    this.Close();
}

/// <summary>
/// Seleccionar un fichero.
/// </summary>
private void btnExaminar_Click(object sender, System.EventArgs e)
{
    openFD.Filter = "Ficheros soportados|*.bmp;*.jpg;*.gif;*.txt;*.rtf;*.htm*;*.asp*|Imágenes (*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif|Textos (*.txt;*.rtf)|*.txt;*.rtf;*.htm*;*.asp*|Todos los ficheros (*.*)|*.*";
    openFD.FileName = TextBox1.Text;
    if( openFD.ShowDialog() == DialogResult.OK )
        TextBox1.Text = openFD.FileName;
}

/// <summary>
/// Leer el fichero indicado y mostrarlo en el textbox o en el picture.
/// Por defecto cualquier fichero "no soportado" lo tomaremos como texto
/// </summary>
private void btnMostrar_Click(object sender, System.EventArgs e)
{
    int EsTexto = 1;

    if( TextBox1.Text.IndexOf(".txt")>-1 )
        EsTexto = 1;
    else if( TextBox1.Text.IndexOf(".rtf")>-1 )
        EsTexto = 1;
    else if( TextBox1.Text.IndexOf(".htm")>-1 )
        EsTexto = 1;
    else if( TextBox1.Text.IndexOf(".asp")>-1 )
        EsTexto = 1;
    else if( TextBox1.Text.IndexOf(".bmp")>-1 )
        EsTexto = 2;
    else if( TextBox1.Text.IndexOf(".jpg")>-1 )
        EsTexto = 2;
    else if( TextBox1.Text.IndexOf(".gif")>-1 )
        EsTexto = 2;
    //
    if( EsTexto == 1 )
    {
        // Si es un fichero de texto
        System.IO.StreamReader sr;
        //
        // Interceptamos los posibles errores
        try
        {
            sr = new System.IO.StreamReader(TextBox1.Text, System.Text.Encoding.Default);
            TextBox2.Text = sr.ReadToEnd();
            sr.Close();
            TextBox2.SelectionStart = TextBox2.Text.Length;
        }
        catch( Exception ex )
        {
            MessageBox.Show("Error al abrir el fichero:\n" + ex.Message, "Abrir fichero");
        }
        TabControl1.SelectedIndex = 0;
    }
    else if( EsTexto == 2 )
    {
        // Si es un fichero de imagen
        try {
            PictureBox1.Image = Image.FromFile(TextBox1.Text);
        }
        catch( Exception ex ) {
            MessageBox.Show("Error al asignar el fichero a la imagen.\n" + ex.Message, "Abrir fichero");
        }
        TabControl1.SelectedIndex = 1; 
    }
    else
        lblInfo.Text = " No es un formato reconocido: " + TextBox1.Text;
}

/// <summary>
/// Copiar el contenido del TextBox2 en el portapapeles.
/// </summary>
private void btnCopiarTxt_Click(object sender, System.EventArgs e)
{
    Clipboard.SetDataObject(TextBox2.Text, true);
}

/// <summary>
/// Copiar la imagen del PictureBox1 en el portapapeles.
/// </summary>
private void btnCopiarImg_Click(object sender, System.EventArgs e)
{
    Clipboard.SetDataObject(PictureBox1.Image, true);
}

/// <summary>
/// Algunas asignaciones al cargar el formulario.
/// </summary>
private void Form1_Load(object sender, System.EventArgs e)
{
    TextBox1.Text = "";
    TextBox2.Text = "";
    Location = new Point(Width / 2, 0);
    TabControl1.TabPages[1].AutoScroll = true;
}

/// <summary>
/// Cuando se está arrastrando en el formulario.
/// </summary>
private void Form1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}

/// <summary>
/// Cuando se suelta un fichero o lo que se está arrastrando, en el formulario.
/// Sólo vamos a permitir ficheros
/// </summary>
private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
    //
    // Comprobar si el tipo de datos es el que queremos
    if( e.Data.GetDataPresent("FileName", false) )
    {
        // El nombre del fichero soltado
        TextBox1.Lines = (string[]) (e.Data.GetData("FileName", false));
        // Se convierte en nombre largo
        TextBox1.Text = guilleCS.MgsWinAPI.GetLongFileName(TextBox1.Text);
        // Se posiciona el cursor al final
        TextBox1.SelectionStart = TextBox1.Text.Length;
    }
}

private void btnPegarImg_Click(object sender, System.EventArgs e)
{
    // Pegar la imagen del portapapeles en el Picture1
    // Se comprueba si hay alguna imagen
    //
    // Mostrar los formatos que hay en el clipBoard
    TextBox2.Lines = Clipboard.GetDataObject().GetFormats();
    if( Clipboard.GetDataObject().GetDataPresent("Bitmap") )
    {
        //MessageBox.Show("Si hay datos del tipo Bitmap");
        PictureBox1.Image = (Bitmap)(Clipboard.GetDataObject().GetData("Bitmap"));
    }
}

 

Las funciones del API:


/*
 * 
'------------------------------------------------------------------------------
' Módulo con funciones del API					    (13/Ene/02)
'
' ©Guillermo 'guille' Som, 2002
'------------------------------------------------------------------------------
 *
 */
using System;
using System.Runtime.InteropServices;

namespace guilleCS
{
	/// <summary>
	/// Summary description for MgsWinAPI.
	/// </summary>
	public class MgsWinAPI
	{
		public const int MAX_PATH = 260;

		[DllImport("KERNEL32.DLL", EntryPoint="GetLongPathNameW", SetLastError=true,
			 CharSet=CharSet.Unicode, ExactSpelling=true, 
			 CallingConvention=CallingConvention.StdCall)]
		static extern int GetLongPathName(
			string lpszShortPath,	// file name
			string lpszLongPath,	// path buffer
			int cchBuffer			// size of path buffer 
		);

		public static string GetLongFileName(string sFileName)
		{
			// Convertir el nombre indicado en nombre largo
			string s = new string('0',MAX_PATH);
			int i = GetLongPathName(sFileName, s, s.Length);
			if( i > MAX_PATH )
			{
				// Se requiere más espacio
				s = new string('0',i);
				i = GetLongPathName(sFileName, s, s.Length);
			}
			if( i == 0 )
				return "";
			else
				return s.Substring(0, i);
		}

	}
}

 


Nos vemos.
Guillermo

Aquí tienes un link al código completo para C#: PortapapelesCS.zip 13.4KB

Si quieres el de VB.NET, te vas a la página de VB.NET y de allí te lo bajas.
Te recuerdo que tanto el formulario como el ejecutable, están creados con el Visual Studio.NET Beta 2 español, aunque creo que funcionará en cualquier versión posterior.


Ir al índice de .NET

la Luna del Guille o... el Guille que está en la Luna... tanto monta...