Interaksi pena dan Windows Ink di aplikasi Windows

Gambar hero Surface Pen.
Surface Pen (tersedia untuk dibeli di Microsoft Store).

Gambaran Umum

Optimalkan aplikasi Windows Anda untuk input pena guna menyediakan fungsionalitas perangkat pointer standar dan pengalaman Windows Ink terbaik bagi pengguna Anda.

Catatan

Topik ini berfokus pada platform Windows Ink. Untuk penanganan input pointer umum (mirip dengan mouse, sentuhan, dan touchpad), lihat Menangani input pointer.

Menggunakan tinta di aplikasi Windows Anda

Menggunakan Windows Pen dan Ink untuk membangun aplikasi perusahaan yang lebih menarik

Platform Windows Ink, bersama dengan perangkat pena, menyediakan cara alami untuk membuat catatan tulisan tangan digital, gambar, dan anotasi. Platform ini mendukung pengambilan input digitizer sebagai data tinta, menghasilkan data tinta, mengelola data tinta, merender data tinta sebagai goresan tinta pada perangkat output, dan mengonversi tinta menjadi teks melalui pengenalan tulisan tangan.

Selain menangkap posisi dasar dan pergerakan pena saat pengguna menulis atau menggambar, aplikasi Anda juga dapat melacak dan mengumpulkan berbagai jumlah tekanan yang digunakan selama stroke. Informasi ini, bersama dengan pengaturan untuk bentuk, ukuran, dan rotasi ujung pena, warna tinta, dan tujuan (tinta biasa, penghapusan, penyorotan, dan pemilihan), memungkinkan Anda untuk memberikan pengalaman pengguna yang sangat menyerupai penulisan atau gambar di atas kertas dengan pena, pensil, atau kuas.

Catatan

Aplikasi Anda juga dapat mendukung input tinta dari perangkat berbasis pointer lainnya, termasuk digitizer sentuh dan perangkat mouse. 

Platform tinta sangat fleksibel. Ini dirancang untuk mendukung berbagai tingkat fungsionalitas, tergantung pada kebutuhan Anda.

Untuk panduan UX Windows Ink, lihat Kontrol penintaan.

Komponen platform Windows Ink

Komponen Deskripsi
InkCanvas Platform UI XAML mengontrol bahwa, secara default, menerima dan menampilkan semua input dari pena sebagai goresan tinta atau stroke penghapusan.
Untuk informasi selengkapnya tentang cara menggunakan InkCanvas, lihat Mengenali goresan Windows Ink sebagai teks dan Menyimpan dan mengambil data goresan Windows Ink.
InkPresenter Objek code-behind, dibuat bersama dengan kontrol InkCanvas (diekspos melalui properti InkCanvas.InkPresenter ). Objek ini menyediakan semua fungsi penintaan default yang diekspos oleh InkCanvas, bersama dengan sekumpulan API komprehensif untuk penyesuaian dan personalisasi tambahan.
Untuk informasi selengkapnya tentang cara menggunakan InkPresenter, lihat Mengenali goresan Windows Ink sebagai teks dan Menyimpan dan mengambil data goresan Windows Ink.
Bilah Tinta Kontrol platform XAML UI yang berisi kumpulan tombol yang dapat disesuaikan dan dapat diperluas yang mengaktifkan fitur terkait tinta di InkCanvas terkait.
Untuk informasi selengkapnya tentang cara menggunakan InkToolbar, lihat Menambahkan InkToolbar ke aplikasi penintaan aplikasi Windows.
IInkD2DRenderer Memungkinkan penyajian goresan tinta ke konteks perangkat Direct2D yang ditunjuk dari aplikasi Universal Windows, alih-alih kontrol InkCanvas default. Ini memungkinkan penyesuaian penuh dari pengalaman penintaan.
Untuk informasi selengkapnya, lihat sampel tinta kompleks.

Penintaan dasar dengan InkCanvas

Untuk menambahkan fungsi penintaan dasar, cukup letakkan kontrol platform UWP InkCanvas di halaman yang sesuai di aplikasi Anda.

Secara default, InkCanvas hanya mendukung input tinta dari pena. Input dirender sebagai goresan tinta menggunakan pengaturan default untuk warna dan ketebalan (pena ballpoint hitam dengan ketebalan 2 piksel), atau diperlakukan sebagai penghapus goresan (ketika input berasal dari ujung penghapus atau ujung pena yang dimodifikasi dengan tombol hapus).

Catatan

Jika tip atau tombol penghapus tidak ada, InkCanvas dapat dikonfigurasi untuk memproses input dari ujung pena sebagai stroke penghapusan.

Dalam contoh ini, InkCanvas melapisi gambar latar belakang.

Catatan

InkCanvas memiliki properti Tinggi dan Lebar default nol, kecuali jika itu adalah turunan dari elemen yang secara otomatis mengukur elemen turunannya, seperti kontrol StackPanel atau Grid .

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel x:Name="HeaderPanel" Orientation="Horizontal" Grid.Row="0">
        <TextBlock x:Name="Header"
                   Text="Basic ink sample"
                   Style="{ThemeResource HeaderTextBlockStyle}"
                   Margin="10,0,0,0" />            
    </StackPanel>
    <Grid Grid.Row="1">
        <Image Source="Assets\StoreLogo.png" />
        <InkCanvas x:Name="inkCanvas" />
    </Grid>
</Grid>

Rangkaian gambar ini menunjukkan bagaimana input pena dirender oleh kontrol InkCanvas ini.

Cuplikan layar InkCanvas kosong dengan gambar latar belakang. Cuplikan layar InkCanvas dengan goresan tinta. Cuplikan layar InkCanvas dengan satu goresan dihapus.
InkCanvas kosong dengan gambar latar belakang. InkCanvas dengan goresan tinta. InkCanvas dengan satu goresan dihapus (perhatikan bagaimana penghapusan beroperasi pada seluruh goresan, bukan sebagian).

Fungsi penintaan yang didukung oleh kontrol InkCanvas disediakan oleh objek code-behind yang disebut InkPresenter.

Untuk penintaan dasar, Anda tidak perlu khawatir dengan InkPresenter. Namun, untuk menyesuaikan dan mengonfigurasi perilaku penintaan pada InkCanvas, Anda harus mengakses objek InkPresenter yang sesuai.

Kustomisasi dasar dengan InkPresenter

Objek InkPresenter dibuat dengan setiap kontrol InkCanvas .

Catatan

InkPresenter tidak dapat diinstansiasi secara langsung. Sebaliknya, ini diakses melalui properti InkPresenter dari InkCanvas

Seiring dengan menyediakan semua perilaku penintaan default dari kontrol InkCanvas yang sesuai, InkPresenter menyediakan serangkaian API yang komprehensif untuk penyesuaian stroke tambahan dan manajemen input pena yang lebih halus (standar dan dimodifikasi). Ini termasuk properti goresan, jenis perangkat input yang didukung, dan apakah input diproses oleh objek atau diteruskan ke aplikasi untuk diproses.

Catatan

Input tinta standar (dari ujung pena atau ujung/tombol penghapus) tidak dimodifikasi dengan keterkaitan perangkat keras sekunder, seperti tombol barel pena, tombol mouse kanan, atau mekanisme serupa.

Secara default, tinta hanya didukung untuk input pena. Di sini, kami mengonfigurasi InkPresenter untuk menginterpretasikan data input dari pena dan mouse sebagai goresan tinta. Kami juga menetapkan beberapa atribut stroke tinta awal yang digunakan untuk merender goresan ke InkCanvas.

Untuk mengaktifkan penintaan mouse dan sentuh, atur properti InputDeviceTypes dari InkPresenter ke kombinasi nilai CoreInputDeviceTypes yang Anda inginkan.

public MainPage()
{
    this.InitializeComponent();

    // Set supported inking device types.
    inkCanvas.InkPresenter.InputDeviceTypes =
        Windows.UI.Core.CoreInputDeviceTypes.Mouse |
        Windows.UI.Core.CoreInputDeviceTypes.Pen;

    // Set initial ink stroke attributes.
    InkDrawingAttributes drawingAttributes = new InkDrawingAttributes();
    drawingAttributes.Color = Windows.UI.Colors.Black;
    drawingAttributes.IgnorePressure = false;
    drawingAttributes.FitToCurve = true;
    inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);
}

Atribut goresan tinta dapat diatur secara dinamis untuk mengakomodasi preferensi pengguna atau persyaratan aplikasi.

Di sini, kami membiarkan pengguna memilih dari daftar warna tinta.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel x:Name="HeaderPanel" Orientation="Horizontal" Grid.Row="0">
        <TextBlock x:Name="Header"
                   Text="Basic ink customization sample"
                   VerticalAlignment="Center"
                   Style="{ThemeResource HeaderTextBlockStyle}"
                   Margin="10,0,0,0" />
        <TextBlock Text="Color:"
                   Style="{StaticResource SubheaderTextBlockStyle}"
                   VerticalAlignment="Center"
                   Margin="50,0,10,0"/>
        <ComboBox x:Name="PenColor"
                  VerticalAlignment="Center"
                  SelectedIndex="0"
                  SelectionChanged="OnPenColorChanged">
            <ComboBoxItem Content="Black"/>
            <ComboBoxItem Content="Red"/>
        </ComboBox>
    </StackPanel>
    <Grid Grid.Row="1">
        <Image Source="Assets\StoreLogo.png" />
        <InkCanvas x:Name="inkCanvas" />
    </Grid>
</Grid>

Kami kemudian menangani perubahan pada warna yang dipilih dan memperbarui atribut goresan tinta yang sesuai.

// Update ink stroke color for new strokes.
private void OnPenColorChanged(object sender, SelectionChangedEventArgs e)
{
    if (inkCanvas != null)
    {
        InkDrawingAttributes drawingAttributes =
            inkCanvas.InkPresenter.CopyDefaultDrawingAttributes();

        string value = ((ComboBoxItem)PenColor.SelectedItem).Content.ToString();

        switch (value)
        {
            case "Black":
                drawingAttributes.Color = Windows.UI.Colors.Black;
                break;
            case "Red":
                drawingAttributes.Color = Windows.UI.Colors.Red;
                break;
            default:
                drawingAttributes.Color = Windows.UI.Colors.Black;
                break;
        };

        inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);
    }
}

Gambar-gambar ini menunjukkan bagaimana input pena diproses dan disesuaikan oleh InkPresenter.

Cuplikan layar yang memperlihatkan InkCanvas dengan goresan tinta hitam default.

InkCanvas dengan goresan tinta hitam default.

Cuplikan layar InkCanvas dengan goresan tinta merah yang dipilih pengguna.

InkCanvas dengan goresan tinta merah yang dipilih pengguna.

Untuk menyediakan fungsionalitas di luar penintaan dan penghapusan, seperti pemilihan goresan, aplikasi Anda harus mengidentifikasi input tertentu agar InkPresenter melewati proses yang tidak diolah untuk ditangani oleh aplikasi Anda.

Input pass-through untuk pemrosesan tingkat lanjut

Secara default, InkPresenter memproses semua input sebagai goresan tinta atau stroke penghapusan, termasuk input yang dimodifikasi oleh keterkaitan perangkat keras sekunder seperti tombol barel pena, tombol mouse kanan, atau sejenisnya. Namun, pengguna biasanya mengharapkan beberapa fungsionalitas tambahan atau perilaku yang dimodifikasi dengan ketergantungan sekunder ini.

Dalam beberapa kasus, Anda mungkin juga perlu mengekspos fungsionalitas tambahan untuk pena tanpa keterkaitan sekunder (fungsionalitas yang biasanya tidak terkait dengan ujung pena), jenis perangkat input lainnya, atau beberapa jenis perilaku yang dimodifikasi berdasarkan pilihan pengguna di UI aplikasi Anda.

Untuk mendukung hal ini, InkPresenter dapat dikonfigurasi untuk membiarkan input tertentu tidak diolah. Input yang tidak diproses ini kemudian diteruskan ke aplikasi Anda untuk diproses.

Contoh - Gunakan input yang tidak diolah untuk mengimplementasikan pemilihan stroke

Platform Windows Ink tidak menyediakan dukungan bawaan untuk tindakan yang memerlukan input yang dimodifikasi, seperti pemilihan goresan. Untuk mendukung fitur seperti ini, Anda harus menyediakan solusi kustom di aplikasi Anda.

Contoh kode berikut (semua kode ada di file MainPage.xaml dan MainPage.xaml.cs) melalui cara mengaktifkan pemilihan stroke saat input dimodifikasi dengan tombol barel pena (atau tombol kanan mouse).

  1. Pertama, kami menyiapkan UI di MainPage.xaml.

    Di sini, kami menambahkan kanvas (di bawah InkCanvas) untuk menggambar stroke pilihan. Menggunakan lapisan terpisah untuk menggambar goresan pemilihan membuat InkCanvas dan kontennya tidak tersentuh.

    Cuplikan layar InkCanvas kosong dengan kanvas pilihan yang mendasar.

      <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="HeaderPanel" Orientation="Horizontal" Grid.Row="0">
          <TextBlock x:Name="Header"
            Text="Advanced ink customization sample"
            VerticalAlignment="Center"
            Style="{ThemeResource HeaderTextBlockStyle}"
            Margin="10,0,0,0" />
        </StackPanel>
        <Grid Grid.Row="1">
          <!-- Canvas for displaying selection UI. -->
          <Canvas x:Name="selectionCanvas"/>
          <!-- Inking area -->
          <InkCanvas x:Name="inkCanvas"/>
        </Grid>
      </Grid>
    
  2. Dalam MainPage.xaml.cs, kami mendeklarasikan beberapa variabel global untuk menyimpan referensi ke aspek UI pemilihan. Secara khusus, pilihan goresan lasso dan persegi panjang pembatas yang menyoroti goresan yang dipilih.

      // Stroke selection tool.
      private Polyline lasso;
      // Stroke selection area.
      private Rect boundingRect;
    
  3. Selanjutnya, kami mengonfigurasi InkPresenter untuk menginterpretasikan data input dari pena dan mouse sebagai goresan tinta, dan mengatur beberapa atribut goresan tinta awal yang digunakan untuk merender goresan ke InkCanvas.

    Yang paling penting, kami menggunakan properti InputProcessingConfiguration dari InkPresenter untuk menunjukkan bahwa input yang dimodifikasi harus diproses oleh aplikasi. Input yang dimodifikasi ditentukan dengan menetapkan InputProcessingConfiguration.RightDragAction nilai InkInputRightDragAction.LeaveUnprocessed. Ketika nilai ini diatur, InkPresenter meneruskan ke kelas InkUnprocessedInput , serangkaian peristiwa penunjuk untuk Anda tangani.

    Kami menetapkan pendengar untuk peristiwa PointerPressed, PointerMoved, dan PointerReleased yang tidak diproses oleh InkPresenter. Semua fungsionalitas pemilihan diimplementasikan dalam handler untuk peristiwa ini.

    Akhirnya, kami menetapkan pendengar untuk peristiwa StrokeStarted dan StrokesErased dari InkPresenter. Kami menggunakan handler untuk peristiwa ini untuk membersihkan UI pemilihan jika stroke baru dimulai atau stroke yang ada dihapus.

    Cuplikan layar aplikasi sampel kustomisasi tinta Advances memperlihatkan inkcanvas dengan goresan tinta hitam default.

      public MainPage()
      {
        this.InitializeComponent();
    
        // Set supported inking device types.
        inkCanvas.InkPresenter.InputDeviceTypes =
          Windows.UI.Core.CoreInputDeviceTypes.Mouse |
          Windows.UI.Core.CoreInputDeviceTypes.Pen;
    
        // Set initial ink stroke attributes.
        InkDrawingAttributes drawingAttributes = new InkDrawingAttributes();
        drawingAttributes.Color = Windows.UI.Colors.Black;
        drawingAttributes.IgnorePressure = false;
        drawingAttributes.FitToCurve = true;
        inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);
    
        // By default, the InkPresenter processes input modified by
        // a secondary affordance (pen barrel button, right mouse
        // button, or similar) as ink.
        // To pass through modified input to the app for custom processing
        // on the app UI thread instead of the background ink thread, set
        // InputProcessingConfiguration.RightDragAction to LeaveUnprocessed.
        inkCanvas.InkPresenter.InputProcessingConfiguration.RightDragAction =
            InkInputRightDragAction.LeaveUnprocessed;
    
        // Listen for unprocessed pointer events from modified input.
        // The input is used to provide selection functionality.
        inkCanvas.InkPresenter.UnprocessedInput.PointerPressed +=
            UnprocessedInput_PointerPressed;
        inkCanvas.InkPresenter.UnprocessedInput.PointerMoved +=
            UnprocessedInput_PointerMoved;
        inkCanvas.InkPresenter.UnprocessedInput.PointerReleased +=
            UnprocessedInput_PointerReleased;
    
        // Listen for new ink or erase strokes to clean up selection UI.
        inkCanvas.InkPresenter.StrokeInput.StrokeStarted +=
            StrokeInput_StrokeStarted;
        inkCanvas.InkPresenter.StrokesErased +=
            InkPresenter_StrokesErased;
      }
    
  4. Kami kemudian mendefinisikan handler untuk peristiwa PointerPressed, PointerMoved, dan PointerReleased yang tidak diolah yang diteruskan oleh InkPresenter.

    Semua fungsionalitas pemilihan diimplementasikan dalam handler ini, termasuk goresan lasso dan persegi panjang pembatas.

    Cuplikan layar lasso pilihan.

      // Handle unprocessed pointer events from modified input.
      // The input is used to provide selection functionality.
      // Selection UI is drawn on a canvas under the InkCanvas.
      private void UnprocessedInput_PointerPressed(
        InkUnprocessedInput sender, PointerEventArgs args)
      {
        // Initialize a selection lasso.
        lasso = new Polyline()
        {
            Stroke = new SolidColorBrush(Windows.UI.Colors.Blue),
            StrokeThickness = 1,
            StrokeDashArray = new DoubleCollection() { 5, 2 },
            };
    
            lasso.Points.Add(args.CurrentPoint.RawPosition);
    
            selectionCanvas.Children.Add(lasso);
        }
    
        private void UnprocessedInput_PointerMoved(
          InkUnprocessedInput sender, PointerEventArgs args)
        {
          // Add a point to the lasso Polyline object.
          lasso.Points.Add(args.CurrentPoint.RawPosition);
        }
    
        private void UnprocessedInput_PointerReleased(
          InkUnprocessedInput sender, PointerEventArgs args)
        {
          // Add the final point to the Polyline object and
          // select strokes within the lasso area.
          // Draw a bounding box on the selection canvas
          // around the selected ink strokes.
          lasso.Points.Add(args.CurrentPoint.RawPosition);
    
          boundingRect =
            inkCanvas.InkPresenter.StrokeContainer.SelectWithPolyLine(
              lasso.Points);
    
          DrawBoundingRect();
        }
    
  5. Untuk menyimpulkan penanganan aktivitas PointerReleased, kami menghapus lapisan pemilihan semua konten (goresan lasso) dan kemudian menggambar persegi panjang pembatas tunggal di sekitar goresan tinta yang dicakup oleh area lasso.

    Cuplikan layar rect pembatas pilihan.

      // Draw a bounding rectangle, on the selection canvas, encompassing
      // all ink strokes within the lasso area.
      private void DrawBoundingRect()
      {
        // Clear all existing content from the selection canvas.
        selectionCanvas.Children.Clear();
    
        // Draw a bounding rectangle only if there are ink strokes
        // within the lasso area.
        if (!((boundingRect.Width == 0) ||
          (boundingRect.Height == 0) ||
          boundingRect.IsEmpty))
          {
            var rectangle = new Rectangle()
            {
              Stroke = new SolidColorBrush(Windows.UI.Colors.Blue),
                StrokeThickness = 1,
                StrokeDashArray = new DoubleCollection() { 5, 2 },
                Width = boundingRect.Width,
                Height = boundingRect.Height
            };
    
            Canvas.SetLeft(rectangle, boundingRect.X);
            Canvas.SetTop(rectangle, boundingRect.Y);
    
            selectionCanvas.Children.Add(rectangle);
          }
        }
    
  6. Akhirnya, kami mendefinisikan handler untuk peristiwa StrokeStarted dan StrokesErased InkPresenter.

    Keduanya hanya memanggil fungsi pembersihan yang sama untuk menghapus pilihan saat ini setiap kali stroke baru terdeteksi.

      // Handle new ink or erase strokes to clean up selection UI.
      private void StrokeInput_StrokeStarted(
        InkStrokeInput sender, Windows.UI.Core.PointerEventArgs args)
      {
        ClearSelection();
      }
    
      private void InkPresenter_StrokesErased(
        InkPresenter sender, InkStrokesErasedEventArgs args)
      {
        ClearSelection();
      }
    
  7. Berikut adalah fungsi untuk menghapus semua UI pilihan dari kanvas pilihan ketika stroke baru dimulai atau stroke yang ada dihapus.

      // Clean up selection UI.
      private void ClearSelection()
      {
        var strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
        foreach (var stroke in strokes)
        {
          stroke.Selected = false;
        }
        ClearDrawnBoundingRect();
       }
    
      private void ClearDrawnBoundingRect()
      {
        if (selectionCanvas.Children.Any())
        {
          selectionCanvas.Children.Clear();
          boundingRect = Rect.Empty;
        }
      }
    

Penyajian tinta kustom

Secara default, input tinta diproses pada utas latar belakang latensi rendah dan dirender sedang berlangsung, atau "basah", karena digambar. Ketika stroke selesai (pena atau jari diangkat, atau tombol mouse dilepaskan), goresan diproses pada utas UI dan dirender "kering" ke lapisan InkCanvas (di atas konten aplikasi dan mengganti tinta basah).

Anda dapat mengambil alih perilaku default ini dan sepenuhnya mengontrol pengalaman penintaan dengan "pengeringan kustom" goresan tinta basah. Meskipun perilaku default biasanya cukup untuk sebagian besar aplikasi, ada beberapa kasus di mana pengeringan kustom mungkin diperlukan, ini termasuk:

  • Manajemen goresan tinta yang lebih efisien, besar, atau kompleks
  • Dukungan panning dan zooming yang lebih efisien pada kanvas tinta besar
  • Tinta interleaving dan objek lainnya, seperti bentuk atau teks, sambil mempertahankan urutan z
  • Mengeringkan dan mengonversi tinta secara sinkron menjadi bentuk DirectX (misalnya, garis lurus atau bentuk yang dirasterisasi dan diintegrasikan ke dalam konten aplikasi alih-alih sebagai lapisan InkCanvas terpisah).

Pengeringan kustom memerlukan objek IInkD2DRenderer untuk mengelola input tinta dan merendernya ke konteks perangkat Direct2D dari aplikasi Universal Windows Anda, bukan kontrol InkCanvas default.

Dengan memanggil ActivateCustomDrying (sebelum InkCanvas dimuat ), aplikasi membuat objek InkSynchronizer untuk menyesuaikan bagaimana goresan tinta dirender kering ke SurfaceImageSource atau VirtualSurfaceImageSource.

SurfaceImageSource dan VirtualSurfaceImageSource menyediakan permukaan bersama DirectX untuk aplikasi Anda untuk digambar dan disusun ke dalam konten aplikasi Anda, meskipun VSIS menyediakan permukaan virtual yang lebih besar dari layar untuk panning dan zooming performant. Karena pembaruan visual untuk permukaan ini disinkronkan dengan utas UI XAML, ketika tinta dirender ke keduanya, tinta basah dapat dihapus dari InkCanvas secara bersamaan.

Anda juga dapat menyesuaikan tinta kering ke SwapChainPanel, tetapi sinkronisasi dengan utas UI tidak dijamin dan mungkin ada penundaan antara ketika tinta dirender ke SwapChainPanel Anda dan ketika tinta dihapus dari InkCanvas.

Untuk contoh lengkap fungsionalitas ini, lihat sampel tinta Kompleks.

Catatan

Pengeringan kustom dan InkToolbar
Jika aplikasi Anda mengambil alih perilaku penyajian tinta default InkPresenter dengan implementasi pengeringan kustom, goresan tinta yang dirender tidak lagi tersedia untuk InkToolbar dan perintah penghapusan bawaan InkToolbar tidak berfungsi seperti yang diharapkan. Untuk menyediakan fungsionalitas penghapusan, Anda harus menangani semua peristiwa penunjuk, melakukan pengujian hit pada setiap goresan, dan mengganti perintah "Hapus semua tinta" bawaan.

Topik Deskripsi
Mengenali goresan tinta Mengonversi goresan tinta menjadi teks menggunakan pengenalan tulisan tangan, atau ke bentuk menggunakan pengenalan kustom.
Menyimpan dan mengambil goresan tinta Simpan data goresan tinta dalam file Graphics Interchange Format (GIF) menggunakan metadata Embedded Ink Serialized Format (ISF).
Menambahkan InkToolbar ke aplikasi penintaan Windows Tambahkan InkToolbar default ke aplikasi penintaan aplikasi Windows, tambahkan tombol pena kustom ke InkToolbar, dan ikat tombol pena kustom ke definisi pena kustom.

API

Sampel

Sampel Arsip