Hoy continuamos con la temática abordada en la entrada anterior de la serie Inertia Tablets MultiTouch con MS Windows 7: Inertia (VII). En ella se abordaba la funcionalidad de añadir imágenes a las aplicaciones para ser lanzadas por la pantalla de los dispositivos Tablet. En el artículo de hoy continuamos analizando este aspecto.
En primera instancia se realizará la carga de las imágenes a través del método “LoadPictures”, asociando cada imagen a un objeto “Picture”. Las imágenes se obtendrán directamente del directorio “MisImagenes” como indica la variable “Environment.SpecialFolder.MyPictures”. De este directorio se obtendrán todas las imágenes con extensión “JPG” y se añadirán a la aplicación como se puede apreciar en las siguientes líneas de código:
private bool LoadPictures()
{
int nPicturesLoaded = 0;
float dpiX, dpiY;
using (Graphics g = Graphics.FromHwnd(Handle))
{
dpiX = g.DpiX;
dpiY = g.DpiY;
}
try
{
foreach (string filePath in Directory.GetFiles(
Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "*.jpg"))
{
try
{
Picture p = new Picture(filePath, dpiX, dpiY);
_canvas.Add(p);
p.Translate = new SizeF((Width - p.Width) / 2, (Height - p.Height) / 2);
++nPicturesLoaded;
if (nPicturesLoaded == NumOfPictures)
return true;
}
catch
{
}
}
return _canvas.Count > 0;
}
catch
{
}
return false;
}
Como es posible apreciar todas las imágenes se asocian al objeto “Picture”. Analicemos brevemente la clase encargada de gestionar las imágenes en la aplicación.

Picture
Lo especial de esta clase además de almacenar la imagen es comprobar si el objeto ha sido presionado o no por medio del evento “HitTest” . Este método averigua si la pulsación se produce dentro de la foto o no para actuar en consecuencia. Realiza varias trasformaciones para adaptarse tanto a la pantalla como al tamaño de la imagen tal y como se muestra a continuación:
public bool HitTest(PointF point)
{
Matrix matrix = GetTrasformationMatrix();
PointF[] points = GetBitmapBoundary(matrix);
float minX = FindMinX(points);
float minY = FindMinY(points);
Matrix translateMatrix = new Matrix();
translateMatrix.Translate(-minX + Translate.Width - Width * ScalingFactor.Width / 2, -minY + Translate.Height - ScalingFactor.Height * Height / 2);
translateMatrix.TransformPoints(points);
PointF[] ptRect = new PointF[5];
Array.Copy(points, ptRect, 4);
ptRect[4] = ptRect[0];
bool isIn = false;
for (int j = 0, i = 1; i < 5; ++i, ++j)
{
if ((((ptRect[i].Y < point.Y) && (point.Y < ptRect[j].Y)) || ((ptRect[j].Y < point.Y)
&& (point.Y < ptRect[i].Y))) &&
(point.X < (ptRect[j].X - ptRect[i].X) * (point.Y - ptRect[i].Y) / (ptRect[j].Y -ptRect[i].Y) +ptRect[i].X))
{
isIn = !isIn;
}
}
return isIn;
}
Este método nos devuelve un valor verdadero o falso a través de la variable “isIn” y con ello informa al evento que lo tiene asignado qué hacer con la pulsación del objeto.
Además esta clase no sólo se encarga de gestionar si la fotografía es pulsada , además añade la gestión del tamaño de la foto por medio del método “private Bitmap TransformImage()”
Con todos estos elementos tenemos ya nuestra aplicación de Inertia lista para desplazarse sobre nuestro Tablet.
En breve anunciaremos el desarrollo de un webcast donde será posible obtener en directo información respecto de este tipo de programación para dispositivos tablet multitouch con Windows 7. Suscribíos canal RSS de Windows técnico y obtendréis esta información con agilidad.

Enviado
jun 17 2011, 06:07
por
Ignacio Briones