Lilypie Primer PicLilypie Primer Ticker

jueves, 19 de julio de 2007

La Librería de imágenes de Visual Studio 2005

Visual Studio incorpora una librería de gráficos, que incluye Bitmaps, Iconos y Animaciones que pueden darles a nuestras aplicaciones una apariencia más profesional e integrada con el Sistema Operativo.

Esta librería se instala junto a VS2005, pero se encuentra muy bien escondida en un oscuro directorio y comprimida en formato zip.

La librería en cuestión se instala por defecto en \Program Files \Microsoft Visual Studio 8\Common7\VS2005ImageLibrary\VS2005ImageLibrary.zip

Al descomprimir este archivo nos encontraremos con 3 carpetas:

Animations. Contiene películas en formato avi y gifs animados

Bitmaps. Contiene bitmaps que son utilizados en menús, toolbars, diálogos, TreeViews, ListViews, botones, etc. Los bitmaps vienen en 16 colores y colores de 24 y 32 bits.

Icons. Muchos iconos típicos de WinXP y Win9x

En cada carpeta se puede encontrar un archivo html con información de las imágenes. A continuación unos screenshots.



martes, 17 de julio de 2007

Ejecutar un instalador .msi que requiere .Net Framework 1.1 bajo .Net Framework 2.0

Si tenemos un archivo de Windows Installer (archivo .msi) que requiere el .Net Framework 1.1 pero en nuestro equipo solo tenemos instalado el .Net Framework 2.0, la aplicación se rehúsa a instalarse y simplemente obtenemos un mensaje como este:

“This setup requires the .NET Framework versión 1.1.4322. Please install the .NET Framework and blah blah blah…”

Una solución sería descargar e instalar el .Net Framework 1.1 como lo exige nuestra aplicación, con la consiguiente pérdida de tiempo y espacio en nuestro disco. Afortunadamente existe otra solución más directa: Modificar el archivo .msi

Ocurre que los archivos de instalación tienen instrucciones para verificar que se cumplan ciertas condiciones antes de ejecutarse, entonces la solución es quitar esas instrucciones con un editor.

Existe una herramienta de Microsoft llamada Orca que sirve para editar los archivos de instalación (.msi, .msm, .psp, y .msp). Esta herramienta está incluida en el Windows SDK, que puede ser descargado libremente. Se puede encontrar más información sobre la herramienta, así como el sitio de descarga aqui.

Una vez instalada la herramienta, abrimos el archivo .msi que queremos editar y buscamos la tabla Custom Action en el panel de la izquierda.


Entonces ubicamos las acciones DIRCA_CheckFx y VSDCA_VsdLaunchConditions y las eliminamos.

Nada más, guardamos el archivo y ya debería funcionar sin mayores protestas.

Ojalá les sea útil.

lunes, 16 de julio de 2007

Un ComboBox que muestra los Fonts instalados en el equipo

En este post compartiré con ustedes una sencilla forma de implementar un ComboBox (o un ListBox) que muestra los tipos de letra que tenemos instalados en el equipo, asi:

Vamos directo al código. Primero necesitamos crear en nuestro Form un campo privado que almacenará los tipos de letra instalados en el equipo y servirá como DataSource de nuestro ComboBox.

private InstalledFontCollection installedFonts = new InstalledFontCollection();

A continuación debemos configurar las Propiedades DataSource y DisplayMember del ComboBox, haremos esto en el constructor del Form, asi:

private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataSource = installedFonts.Families;
comboBox1.DisplayMember =
"Name";
comboBox1.DrawMode =
DrawMode.OwnerDrawFixed;
}

También hemos fijado la Propiedad DrawMode a OwnerDrawFixed, algo que también podríamos haber hecho usando el diseñador gráfico.

Finalmente la verdadera acción tiene lugar en el evento DrawItem del Combo, que implementamos así:

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
FontFamily family = installedFonts.Families[e.Index];
FontStyle style = FontStyle.Regular;
if (!family.IsStyleAvailable(style))
style = FontStyle.Bold;
if (!family.IsStyleAvailable(style))
style = FontStyle.Italic;
Font fnt = new Font(family, 10, style);
Brush brush;
if (e.State == DrawItemState.Selected)
{
brush = new SolidBrush(Color.White);
}
else
{
brush = new SolidBrush(comboBox1.ForeColor);
}


e.DrawBackground();

e.Graphics.DrawString(family.GetName(0),
fnt, brush, e.Bounds.Location);

}

Quizás las líneas en que vamos modificando la variable style merezcan una explicación. Ocurre que no todos los Fonts soportan todos los estilos, así que si no nos aseguramos de que el Font que vamos a utilizar soporte un determinado estilo terminaremos obteniendo una linda Excepción.

Eso es todo, ya tenemos un ComboBox que muestra como lucen nuestras fuentes, haciendo que nuestras aplicaciones sean un poquito más amigables.

martes, 3 de julio de 2007

Arrastrar y mover un Control

Update 2008-09-16.
Pueden descargar el código de este post aqui


En este post expondré una sencilla forma de mover un control dentro su contenedor; algo que no es muy complicado en realidad, pero que tampoco es lo más intuitivo del mundo.

Para lograrlo haremos uso de los eventos MouseDown, MouseUp y MouseDown, implementados en la clase Control, por lo que el código aquí expuesto nos servirá para mover cualquier objeto derivado de dicha clase.

Para empezar creamos un formulario y añadimos un control cualquiera. Para este ejemplo utilizaré un simple Label.

Ahora necesitamos declarar un campo privado del tipo booleano que nos indique si actualmente estamos arrastrando el control.

private bool isDragging = false;

Entonces nos valemos de los eventos MouseDown y MouseUp de nuestro Label para fijar el valor del campo isDragging, asi:

private void label1_MouseDown(object sender, MouseEventArgs e)

{
isDragging = true;

}

private void label1_MouseUp(object sender, MouseEventArgs e)
{

isDragging = false;
}

Ahora si, la verdadera acción ocurre en el evento MouseMove de nuestro Label:

private void label1_MouseMove(object sender, MouseEventArgs e)
{

Control ctrl = sender as Control;
if (isDragging)

{

Point p1 = ctrl.PointToScreen(e.Location);

Point p2 = ctrl.Parent.PointToClient(p1);

ctrl.Location = p2;

}

}

Lo único novedoso de este código es el uso de los métodos PointToScreen y PointToClient que transforman las coordenadas a coordenadas de Pantalla y a coordenadas de Control respectivamente.

Nada más, con estas pocas líneas ya podemos permitir a nuestros usuarios acomodar los controles a su conveniencia, algo muy útil para diseñar formularios, reportes, interfaces de usuario y otras cosas por el estilo.