Ejemplo de zoom de entrada de lápiz
En este programa de ejemplo se muestra cómo hacer zoom y desplazar la entrada de lápiz. En concreto, permite al usuario acercar y alejar la entrada de lápiz en incrementos. También muestra cómo acercar una región determinada mediante un rectángulo de zoom. Por último, en este ejemplo se muestra cómo recopilar tinta en diferentes relaciones de zoom y cómo configurar el desplazamiento dentro del área de dibujo ampliada.
En el ejemplo, las transformaciones de objetos y vistas del objeto Renderer se usan para realizar el zoom y el desplazamiento. La transformación de vista se aplica a los puntos y al ancho del lápiz. La transformación de objeto solo se aplica a los puntos. El usuario puede controlar qué transformación se usa cambiando el elemento Ancho del lápiz de escala en el menú Modo.
Nota
Es problemático realizar algunas llamadas COM en determinados métodos de interfaz (InkRenderer.SetViewTransform y InkRenderer.SetObjectTransform, por ejemplo) cuando se ha enviado un mensaje. Cuando los mensajes se envían, deben serializarse en la cola de mensajes POST. Para solucionar este escenario, pruebe si está controlando un mensaje desde POST llamando a InSendMessageEx y POST el mensaje a sí mismo si el mensaje se envió.
En este ejemplo se usan las siguientes características:
- El objeto InkCollector
- Método SetViewTransform del objeto Renderer
- Método SetObjectTransform del objeto Renderer
Inicializar el formulario
En primer lugar, el ejemplo hace referencia a las interfaces de automatización de PC tableta, que se proporcionan en el Kit de desarrollo de software (SDK) de Windows Vista o Windows XP Tablet PC Edition.
using Microsoft.Ink;
El ejemplo declara un elemento InkCollector, myInkCollector
y algunos miembros privados para ayudar con el escalado.
// Declare the Ink Collector object
private InkCollector myInkCollector = null;
...
// The starting and ending points of the zoom rectangle
private Rectangle zoomRectangle = Rectangle.Empty;
// The current zoom factor (1 = 100% zoom level)
private float zoomFactor = 1;
// Declare constants for the width and height of the
// drawing area (in ink space coordinates).
private const int InkSpaceWidth = 50000;
private const int InkSpaceHeight = 50000;
...
// Declare constant for the pen width used by this application
private const float MediumInkWidth = 100;
A continuación, el ejemplo crea y habilita InkCollector en el controlador de eventos Load del formulario. Además, se establece la propiedad Width de la propiedad DefaultDrawingAttributes del objeto InkCollector. Por último, se definen los intervalos de barras de desplazamiento y se llama al método de UpdateZoomAndScroll
la aplicación.
private void InkZoom_Load(object sender, System.EventArgs e)
{
// Create the pen used to draw the zoom rectangle
blackPen = new Pen(Color.Black, 1);
// Create the ink collector and associate it with the form
myInkCollector = new InkCollector(pnlDrawingArea.Handle);
// Set the pen width
myInkCollector.DefaultDrawingAttributes.Width = MediumInkWidth;
// Enable ink collection
myInkCollector.Enabled = true;
// Define ink space size - note that the scroll bars
// map directly to ink space
hScrollBar.Minimum = 0;
hScrollBar.Maximum = InkSpaceWidth;
vScrollBar.Minimum = 0;
vScrollBar.Maximum = InkSpaceHeight;
// Set the scroll bars to map to the current zoom level
UpdateZoomAndScroll();
}
Actualización de los valores de zoom y desplazamiento
El área de dibujo del recopilador de tintas se ve afectada por muchos eventos. En el UpdateZoomAndScroll
método , se usa una matriz de transformación para escalar y traducir el recopilador de tinta dentro de la ventana.
Nota
El método SetViewTransform del objeto Renderer aplica la transformación tanto a los trazos como al ancho del lápiz, mientras que el método SetObjectTransform solo aplica la transformación a los trazos.
Por último, se llama al método de UpdateScrollBars
la aplicación y el formulario se fuerza a actualizar.
// Create a transformation matrix
Matrix m = new Matrix();
// Apply the current scale factor
m.Scale(zoomFactor,zoomFactor);
// Apply the current translation factor - note that since
// the scroll bars map directly to ink space, their values
// can be used directly.
m.Translate(-hScrollBar.Value, -vScrollBar.Value);
// ...
if (miScalePenWidth.Checked)
{
myInkCollector.Renderer.SetViewTransform(m);
}
else
{
myInkCollector.Renderer.SetObjectTransform(m);
}
// Set the scroll bars to map to the current zoom level
UpdateScrollBars();
Refresh();
Administrar las barras de desplazamiento
El UpdateScrollBars
método configura las barras de desplazamiento para que funcionen correctamente con el tamaño actual de la ventana, la configuración de zoom y la ubicación de desplazamiento dentro de InkCollector. Este método calcula los valores de cambio grandes y pequeños para las barras de desplazamiento vertical y horizontal. También calcula el valor actual de las barras de desplazamiento y si deben estar visibles. El método PixelToInkSpace del objeto Renderer controla la conversión de píxeles al espacio de coordenadas ampliada y tiene en cuenta cualquier escalado y desplazamiento que se aplique a través de las transformaciones de vista y objeto.
// Create a point representing the top left of the drawing area (in pixels)
Point ptUpperLeft = new Point(0, 0);
// Create a point representing the size of a small change
Point ptSmallChange = new Point(SmallChangeSize, SmallChangeSize);
// Create a point representing the lower right of the drawing area (in pixels)
Point ptLowerRight = new Point(hScrollBar.Width, vScrollBar.Height);
using (Graphics g = CreateGraphics())
{
// Convert each of the points to ink space
myInkCollector.Renderer.PixelToInkSpace(g, ref ptUpperLeft);
myInkCollector.Renderer.PixelToInkSpace(g, ref ptLowerRight);
myInkCollector.Renderer.PixelToInkSpace(g, ref ptSmallChange);
}
// Set the SmallChange values (in ink space)
// Note that it is necessary to subract the upper-left point
// value to account for scrolling.
hScrollBar.SmallChange = ptSmallChange.X - ptUpperLeft.X;
vScrollBar.SmallChange = ptSmallChange.Y - ptUpperLeft.Y;
// Set the LargeChange values to the drawing area width (in ink space)
// Note that it is necessary to subract the upper-left point
// value to account for scrolling.
hScrollBar.LargeChange = ptLowerRight.X - ptUpperLeft.X;
vScrollBar.LargeChange = ptLowerRight.Y - ptUpperLeft.Y;
// If the scroll bars are not needed, hide them
hScrollBar.Visible = hScrollBar.LargeChange < hScrollBar.Maximum;
vScrollBar.Visible = vScrollBar.LargeChange < vScrollBar.Maximum;
// If the horizontal scroll bar value would run off of the drawing area,
// adjust it
if(hScrollBar.Visible && (hScrollBar.Value + hScrollBar.LargeChange > hScrollBar.Maximum))
{
hScrollBar.Value = hScrollBar.Maximum - hScrollBar.LargeChange;
}
// If the vertical scroll bar value would run off of the drawing area,
// adjust it
if(vScrollBar.Visible && (vScrollBar.Value + vScrollBar.LargeChange > vScrollBar.Maximum))
{
vScrollBar.Value = vScrollBar.Maximum - vScrollBar.LargeChange;
}
Zoom a un rectángulo
Los pnlDrawingArea
controladores de eventos del panel administran el dibujo del rectángulo en la ventana. Si el comando Zoom To Rect está activado en el menú Modo, el controlador de eventos MouseUp llama al método de ZoomToRectangle
la aplicación. El ZoomToRectangle
método calcula el ancho y el alto del rectángulo, comprueba si hay condiciones de límite, actualiza los valores de la barra de desplazamiento y el factor de escala y, a continuación, llama al método de UpdateZoomAndScroll
la aplicación para aplicar la nueva configuración.
Cerrar el formulario
El método Dispose del formulario elimina el objeto InkCollector .