Beispiel für Freihandzoom
In diesem Beispielprogramm wird veranschaulicht, wie Sie Freihand vergrößern und scrollen. Insbesondere ermöglicht es dem Benutzer, Freihandeingaben in Schritten zu vergrößern und zu verkleinern. Außerdem wird veranschaulicht, wie Sie mithilfe eines Zoomrechtecks in eine bestimmte Region zoomen. Schließlich veranschaulicht dieses Beispiel, wie Freihand bei unterschiedlichen Zoomverhältnissen gesammelt und das Scrollen innerhalb des gezoomten Zeichenbereichs eingerichtet wird.
Im Beispiel werden die Ansichts- und Objekttransformationen des Renderers verwendet, um zoomen und scrollen zu können. Die Ansichtstransformation gilt für die Punkte und die Stiftbreite. Die Objekttransformation gilt nur für die Punkte. Der Benutzer kann steuern, welche Transformation verwendet wird, indem er das Element Stiftbreite skalieren im Menü Modus ändert.
Hinweis
Es ist problematisch, einige COM-Aufrufe für bestimmte Schnittstellenmethoden (z. B. InkRenderer.SetViewTransform und InkRenderer.SetObjectTransform) auszuführen, wenn eine Nachricht gesendet wurde. Wenn Nachrichten gesendet werden, müssen sie in die POST-Nachrichtenwarteschlange ge marshallt werden. Um dieses Szenario zu beheben, testen Sie, ob Sie eine Nachricht von POST verarbeiten, indem Sie InSendMesssageEx und POST die Nachricht an sich selbst aufrufen, wenn die Nachricht gesendet wurde.
In diesem Beispiel werden die folgenden Features verwendet:
- Das InkCollector-Objekt
- SetViewTransform-Methode des Renderers
- Die SetObjectTransform-Methode des Renderer-Objekts
Initialisieren des Formulars
Zunächst verweist das Beispiel auf die Tablet PC Automation-Schnittstellen, die im Software Development Kit (SDK) für Windows Vista oder Windows XP Tablet PC Edition bereitgestellt werden.
using Microsoft.Ink;
Das Beispiel deklariert einen InkCollector, myInkCollector
, und einige private Member, um die Skalierung zu unterstützen.
// 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;
Anschließend wird im Beispiel der InkCollector im Load-Ereignishandler des Formulars erstellt und aktiviert. Außerdem wird die Width-Eigenschaft der DefaultDrawingAttributes-Eigenschaft des InkCollector-Objekts festgelegt. Schließlich werden die Bildlaufleistenbereiche definiert, und die Methode der UpdateZoomAndScroll
Anwendung wird aufgerufen.
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();
}
Aktualisieren der Zoom- und Bildlaufwerte
Der Zeichenbereich des Freihandsammlers wird von vielen Ereignissen beeinflusst. In der UpdateZoomAndScroll
-Methode wird eine Transformationsmatrix verwendet, um den Freihandsammler im Fenster zu skalieren und zu übersetzen.
Hinweis
Die SetViewTransform-Methode des Renderer-Objekts wendet die Transformation sowohl auf die Striche als auch auf die Stiftbreite an, während die SetObjectTransform-Methode die Transformation nur auf die Striche anwendet.
Schließlich wird die Methode der UpdateScrollBars
Anwendung aufgerufen, und das Formular wird zum Aktualisieren gezwungen.
// 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();
Verwalten der Bildlaufleisten
Die UpdateScrollBars
-Methode richtet die Bildlaufleisten so ein, dass sie ordnungsgemäß mit der aktuellen Fenstergröße, Zoomeinstellung und Bildlaufposition innerhalb des InkCollector funktionieren. Diese Methode berechnet die Werte für große Änderungen und kleine Änderungen für die vertikalen und horizontalen Bildlaufleisten. Außerdem wird der aktuelle Wert der Bildlaufleisten berechnet und ob sie sichtbar sein sollen. Die PixelToInkSpace-Methode des Renderer-Objekts verarbeitet die Konvertierung von Pixeln in den gezoomten Koordinatenraum und übernimmt alle Skalierungs- und Bildlaufvorgänge, die über die Ansichts- und Objekttransformationen angewendet werden.
// 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;
}
Zoomen auf ein Rechteck
Die pnlDrawingArea
Panelereignishandler verwalten das Zeichnen des Rechtecks in das Fenster. Wenn der Befehl Zoom To Rect im Menü Mode aktiviert ist, ruft der MouseUp-Ereignishandler die Methode der Anwendung ZoomToRectangle
auf. Die ZoomToRectangle
Methode berechnet die Breite und Höhe des Rechtecks, überprüft die Randbedingungen, aktualisiert die Bildlaufleistenwerte und den Skalierungsfaktor UpdateZoomAndScroll
und ruft dann die Methode der Anwendung auf, um die neuen Einstellungen anzuwenden.
Schließen des Formulars
Die Dispose-Methode des Formulars veräußert das InkCollector-Objekt .