Contoh Zoom untuk Tinta

Program sampel ini menunjukkan cara memperbesar dan menggulir tinta. Secara khusus, ini memungkinkan pengguna untuk memperbesar dan memperkecil tinta dalam kenaikan. Ini juga menunjukkan cara memperbesar bagian wilayah tertentu dengan menggunakan bingkai persegi panjang zoom. Terakhir, sampel ini menggambarkan cara mengumpulkan tinta pada rasio zoom yang berbeda dan cara mengatur pengguliran dalam area gambar yang diperbesar.

Dalam sampel, tampilan objek Renderer dan transformasi objek digunakan untuk melakukan pembesaran dan pengguliran. Transformasi tampilan berlaku untuk titik dan lebar pena. Transformasi objek hanya berlaku untuk titik. Pengguna dapat mengontrol transformasi mana yang digunakan dengan mengubah item Lebar Pena Skala pada menu Mode.

Nota

Sangat bermasalah untuk melakukan beberapa panggilan COM pada metode antarmuka tertentu (InkRenderer.SetViewTransform dan InkRenderer.SetObjectTransform, misalnya) ketika pesan telah DIKIRIM. Ketika pesan DIKIRIM, pesan perlu dinaikkan ke antrean pesan POST. Untuk mengatasi skenario ini, uji apakah Anda menangani pesan dari POST dengan memanggil InSendMesssageEx dan mengirimkan pesan kepada diri Anda sendiri jika pesan tersebut telah dikirim.

 

Fitur berikut digunakan dalam sampel ini:

Menginisialisasi Formulir

Pertama, sampel mereferensikan antarmuka Automasi PC Tablet, yang disediakan di Windows Vista atau Windows XP Tablet PC Edition Software Development Kit (SDK).

using Microsoft.Ink;

Sampel mendeklarasikan InkCollector, myInkCollector, dan beberapa anggota privat untuk membantu penskalakan.

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

Kemudian sampel membuat dan mengaktifkan inkCollector dalam penanganan aktivitas Load formulir. Selain itu, properti Lebar dari properti DefaultDrawingAttributes objek InkCollector diatur. Terakhir, rentang bilah gulir ditentukan dan metode UpdateZoomAndScroll dari aplikasi tersebut dipanggil.

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

Memperbarui Nilai Zoom dan Gulir

Area gambar pengumpul tinta dipengaruhi oleh banyak peristiwa. Dalam metode UpdateZoomAndScroll, matriks transformasi digunakan untuk menskalakan dan menerjemahkan pengumpul tinta di dalam jendela.

Nota

Metode Renderer objek SetViewTransform menerapkan transformasi ke goresan-goresan dan lebar pena, sementara metode SetObjectTransform hanya menerapkan transformasi ke goresan-goresan.

 

Akhirnya, metode UpdateScrollBars aplikasi dipanggil dan formulir dipaksa untuk di-refresh.

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

Mengelola Bilah Gulir

Metode UpdateScrollBars menyiapkan bilah gulir agar berfungsi dengan benar dengan ukuran jendela saat ini, pengaturan zoom, dan lokasi gulir dalam InkCollector. Metode ini menghitung perubahan besar dan nilai perubahan kecil untuk bilah gulir vertikal dan horizontal. Ini juga menghitung nilai bilah gulir saat ini dan apakah nilai tersebut harus terlihat. Metode Renderer objek PixelToInkSpace menangani konversi dari piksel ke ruang koordinat yang terperbesar dan mempertimbangkan setiap penskalaan dan pengguliran yang diterapkan melalui tampilan dan transformasi objek.

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

Memperbesar ke Persegi Panjang

Pengelola acara untuk panel pnlDrawingArea mengatur proses menggambar persegi panjang ke jendela. Jika perintah Zoom To Rect dicentang pada menu Mode, maka penanganan aktivitas MouseUp memanggil metode ZoomToRectangle aplikasi. Metode ZoomToRectangle menghitung lebar dan tinggi persegi panjang, memeriksa kondisi batas, memperbarui nilai bilah gulir dan faktor skala, lalu memanggil metode UpdateZoomAndScroll aplikasi untuk menerapkan pengaturan baru.

Menutup Formulir

Metode Dispose dari formulir membuang objek InkCollector.