Partager via


Exemple de zoom manuscrit

Cet exemple de programme montre comment zoomer et faire défiler l’entrée manuscrite. En particulier, il permet à l’utilisateur de zoomer et de sortir de l’entrée manuscrite par incréments. Il montre également comment effectuer un zoom sur une région particulière à l’aide d’un rectangle de zoom. Enfin, cet exemple montre comment collecter de l’encre à différents ratios de zoom et comment configurer le défilement dans la zone de dessin zoomée.

Dans l’exemple, les transformations d’affichage et d’objet de l’objet Renderer sont utilisées pour effectuer un zoom et un défilement. La transformation d’affichage s’applique aux points et à la largeur du stylet. La transformation d’objet s’applique uniquement aux points. L’utilisateur peut contrôler la transformation utilisée en modifiant l’élément Largeur du stylet dans le menu Mode.

Notes

Il est problématique d’effectuer certains appels COM sur certaines méthodes d’interface (InkRenderer.SetViewTransform et InkRenderer.SetObjectTransform, par exemple) lorsqu’un message a été ENVOYÉ. Lorsque les messages sont ENVOYÉS, ils doivent être marshalés dans la file d’attente de messages POST. Pour résoudre ce scénario, testez si vous gérez un message à partir de POST en appelant InSendMesssageEx et POST pour vous-même si le message a été ENVOYÉ.

 

Les fonctionnalités suivantes sont utilisées dans cet exemple :

Initialisation du formulaire

Tout d’abord, l’exemple fait référence aux interfaces Tablet PC Automation, qui sont fournies dans le Kit de développement logiciel (SDK) Windows Vista ou Windows XP Édition Tablet PC.

using Microsoft.Ink;

L’exemple déclare un InkCollector, myInkCollectoret certains membres privés pour faciliter la mise à l’échelle.

// 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;

Ensuite, l’exemple crée et active InkCollector dans le gestionnaire d’événements Load du formulaire. En outre, la propriété Width de la propriété DefaultDrawingAttributes de l’objet InkCollector est définie. Enfin, les plages de barre de défilement sont définies et la méthode de UpdateZoomAndScroll l’application est appelée.

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();
}

Mise à jour des valeurs de zoom et de défilement

La zone de dessin du collecteur d’encre est affectée par de nombreux événements. Dans la UpdateZoomAndScroll méthode, une matrice de transformation est utilisée pour mettre à l’échelle et traduire le collecteur d’encre dans la fenêtre.

Notes

La méthode SetViewTransform de l’objet Renderer applique la transformation aux traits et à la largeur du stylet, tandis que la méthode SetObjectTransform applique uniquement la transformation aux traits.

 

Enfin, la méthode de UpdateScrollBars l’application est appelée et le formulaire est forcé à s’actualiser.

// 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();

Gestion des barres de défilement

La UpdateScrollBars méthode configure les barres de défilement pour qu’elles fonctionnent correctement avec la taille de la fenêtre, le paramètre de zoom et l’emplacement de défilement actuels dans InkCollector. Cette méthode calcule les grandes valeurs de modification et de petite modification pour les barres de défilement verticales et horizontales. Il calcule également la valeur actuelle des barres de défilement et détermine si elles doivent être visibles. La méthode PixelToInkSpace de l’objet Renderer gère la conversion des pixels vers l’espace de coordonnées zoomé et prend en compte la mise à l’échelle et le défilement appliqués via les transformations d’affichage et d’objet.

// 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 sur un rectangle

Les pnlDrawingArea gestionnaires d’événements de panneau gèrent le dessin du rectangle vers la fenêtre. Si la commande Zoom to Rect est cochée dans le menu Mode, le gestionnaire d’événements MouseUp appelle la méthode de ZoomToRectangle l’application. La ZoomToRectangle méthode calcule la largeur et la hauteur du rectangle, vérifie les conditions limites, met à jour les valeurs de la barre de défilement et le facteur d’échelle, puis appelle la méthode de UpdateZoomAndScroll l’application pour appliquer les nouveaux paramètres.

Fermeture du formulaire

La méthode Dispose du formulaire supprime l’objet InkCollector .