Condividi tramite


Esempio di zoom per inchiostro digitale

Questo programma di esempio illustra come eseguire lo zoom e lo scorrimento dell'inchiostro digitale. In particolare, consente all'utente di ingrandire e ridurre l'inchiostro a incrementi. Viene inoltre illustrato come eseguire lo zoom in una determinata area usando un rettangolo di zoom. Infine, questo esempio illustra come raccogliere l'inchiostro con diversi livelli di zoom e come impostare lo scorrimento all'interno dell'area di disegno ingrandita.

Nell'esempio, la vista dell'oggetto renderer e le trasformazioni degli oggetti sono usate per eseguire lo zoom e lo scorrimento. La trasformazione di visualizzazione si applica ai punti e alla larghezza della penna. La trasformazione dell'oggetto si applica solo ai punti. L'utente può controllare la trasformazione utilizzata modificando la voce Scala larghezza penna nel menu Modalità.

Nota

È problematico eseguire alcune chiamate COM su determinati metodi di interfaccia (InkRenderer.SetViewTransform e InkRenderer.SetObjectTransform, ad esempio) quando un messaggio è stato INVIATO. Quando i messaggi vengono INVIATI, è necessario effettuare il marshalling nella coda di messaggi POST. Per risolvere questo scenario, verificare se si sta gestendo un messaggio da POST chiamando InSendMesssageEx e POST il messaggio a se stessi se il messaggio è stato INVIATO.

 

In questo esempio vengono usate le funzionalità seguenti:

Inizializzazione del modulo

In primo luogo, l'esempio fa riferimento alle interfacce di automazione tablet PC, disponibili in Windows Vista o Windows XP Tablet PC Edition Software Development Kit (SDK).

using Microsoft.Ink;

L'esempio dichiara un InkCollector, myInkCollectore alcuni membri privati per facilitare il ridimensionamento.

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

L'esempio crea e abilita quindi il InkCollector nel gestore eventi Load del modulo. Viene inoltre impostata la proprietà Width dell'oggetto InkCollector DefaultDrawingAttributes proprietà. Infine, vengono definiti gli intervalli di barre di scorrimento e viene chiamato il metodo UpdateZoomAndScroll dell'applicazione.

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

Aggiornamento dei valori di zoom e scorrimento

L'area di disegno del collettore d'inchiostro è influenzata da molti eventi. Nel metodo UpdateZoomAndScroll viene usata una matrice di trasformazione per ridimensionare e traslare il raccoglitore di inchiostro all'interno della finestra.

Nota

Il metodo SetViewTransform dell'oggetto Renderer applica la trasformazione sia ai tratti che alla larghezza della penna, mentre il metodo SetObjectTransform applica la trasformazione solo ai tratti.

 

Infine, viene chiamato il metodo UpdateScrollBars dell'applicazione e viene forzato l'aggiornamento del modulo.

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

Gestione delle barre di scorrimento

Il metodo UpdateScrollBars imposta le barre di scorrimento per funzionare correttamente con le dimensioni correnti della finestra, l'impostazione dello zoom e la posizione di scorrimento all'interno del InkCollector. Questo metodo calcola le grandi variazioni e le piccole variazioni per la barra di scorrimento verticale e orizzontale. Calcola inoltre il valore corrente delle barre di scorrimento e indica se devono essere visibili. Il metodo PixelToInkSpace dell'oggetto Renderer gestisce la conversione dai pixel allo spazio delle coordinate con zoom e considera qualsiasi ridimensionamento e scorrimento applicato attraverso le trasformazioni di visualizzazione e dell'oggetto.

// 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 su un rettangolo

I gestori eventi del pannello pnlDrawingArea gestiscono il disegno del rettangolo nella finestra. Se il comando "Zoom To Rect" è selezionato nel menu Modalità, il gestore eventi MouseUp chiama il metodo ZoomToRectangle dell'applicazione. Il metodo ZoomToRectangle calcola la larghezza e l'altezza del rettangolo, verifica la presenza di condizioni limite, aggiorna i valori della barra di scorrimento e il fattore di scala e quindi chiama il metodo UpdateZoomAndScroll dell'applicazione per applicare le nuove impostazioni.

Chiusura del modulo

Il metodo Dispose del modulo elimina l'oggetto InkCollector.