Interakce pera a rukopis Windows v aplikacích Windows

Hlavní obrázek Surface Pen.
Surface Pen (k dispozici k nákupu v Microsoft Store).

Přehled

Optimalizujte aplikaci pro Windows pro zadávání perem tak, aby poskytovala standardní funkce ukazovacího zařízení i nejlepší Windows Ink zkušenost pro vaše uživatele.

Poznámka:

Toto téma se zaměřuje na platformu Windows Ink. Pro obecné zpracování vstupu ukazatele (podobně jako u myši, dotykového ovládání a touchpadu) viz Zpracování vstupu ukazatele.

Platforma Windows Ink spolu se zařízením pera představuje přirozený způsob, jak vytvářet digitální ručně psané poznámky, kresby a anotace. Platforma podporuje zachytávání vstupu digitizátoru jako rukopisných dat, generování rukopisných dat, správu rukopisných dat, vykreslování rukopisných dat jako tahů rukopisu na výstupním zařízení a převod rukopisu na text prostřednictvím rozpoznávání rukopisu.

Kromě zachycení základní pozice a pohybu pera při psaní nebo nakreslování uživateli může aplikace také sledovat a shromažďovat různé množství tlaku použitého během tahu. Tyto informace spolu s nastavením pro tvar pera, velikostí a otočením, barvou rukopisu a účelem (prostý rukopis, mazání, zvýraznění a výběr) umožňují poskytovat uživatelské prostředí, která se podobají psaní nebo kreslení na papír pomocí pera, tužky nebo štětce.

Poznámka:

Vaše aplikace může také podporovat rukopisné vstupy z jiných zařízení založených na ukazatelích, včetně dotykových digitizátorů a zařízení myši. 

Inkoustová platforma je velmi flexibilní. Je navržená tak, aby podporovala různé úrovně funkcí v závislosti na vašich požadavcích.

Pokyny pro Windows Ink UX najdete v tématu ovládací prvky pro rukopis.

Komponenty platformy Windows Ink

Součást Description
InkCanvas Ovládací prvek platformy uživatelského rozhraní XAML, který ve výchozím nastavení přijímá a zobrazuje veškerý vstup z pera jako inkoustová stopa nebo vygumování.
Další informace o tom, jak používat InkCanvas, najdete v tématech Rozpoznejte tahy rukopisu Windows Ink jako text a Uložte a načtěte data tahů rukopisu Windows Ink.
InkPresenter Instance objektu na pozadí je vytvořena spolu s ovládacím prvkem InkCanvas (vystaveno prostřednictvím vlastnosti InkCanvas.InkPresenter). Tento objekt poskytuje všechny výchozí funkce rukopisu poskytované InkCanvas spolu s komplexní sadou rozhraní API pro další přizpůsobení a personalizaci.
Další informace o tom, jak používat InkPresenter, najdete v tématu Rozpoznávání tahů rukopisu Windows jako text a Uložení a načtení dat tahů rukopisu Windows.
InkToolbar Ovládací prvek platformy uživatelského rozhraní XAML obsahující přizpůsobitelnou a rozšiřitelnou kolekci tlačítek, která aktivují funkce související s rukopisem v přidruženém inkCanvas.
Další informace o tom, jak používat InkToolbar, najdete v tématu Přidání InkToolbar do aplikace Windows pro kreslení.
IInkD2DRenderer Umožňuje vykreslování tahů rukopisu do určeného kontextu zařízení Direct2D univerzální aplikace Windows místo výchozího ovládacího prvku InkCanvas. To umožňuje úplné přizpůsobení prostředí rukopisu.
Další informace najdete v ukázce rukopisu Komplex.

Základní inkování s InkCanvas

Pokud chcete přidat základní funkce rukopisu, stačí umístit ovládací prvek platformy InkCanvas na příslušnou stránku v aplikaci.

Ve výchozím nastavení podporuje InkCanvas rukopisný vstup pouze z pera. Vstup se buď vykreslí jako tah inkoustem pomocí výchozího nastavení pro barvu a tloušťku (černé kuličkové pero s tloušťkou 2 pixelů), nebo se považuje za tah gumičkou (když je vstup z hrotu gumičky nebo hrot pera upravený tlačítkem pro gumičku).

Poznámka:

Pokud není k dispozici hrot gumy nebo tlačítko, lze InkCanvas nakonfigurovat tak, aby zpracovával vstup z hrotu pera jako mazací tah.

V tomto příkladu InkCanvas překryjí obrázek pozadí.

Poznámka:

InkCanvas má výchozí vlastnosti Height a Width s hodnotou nula, pokud není podřízeným prvkem, který automaticky určuje velikost svých podřízených prvků, například ovládací prvky StackPanel nebo 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>

Tato řada obrázků ukazuje, jak se zadávání pera vykresluje tímto ovládacím InkCanvas.

Snímek obrazovky prázdného InkCanvas s obrázkem pozadí. Snímek obrazovky s rukopisnými tahy InkCanvas Snímek obrazovky InkCanvas s jedním vymazaným tahem.
Prázdné plátno InkCanvas s obrázkem na pozadí. InkCanvas s inkoustovými tahy. InkCanvas s jedním tahem smazaným (všimněte si, jak mazání působí na celém tahu, nikoli na jeho části).

Funkce rukopisu podporovaná ovládacím prvkům InkCanvas je poskytována objektem kódu za názvem InkPresenter.

Pro základní inkoustování se nemusíte zabývat InkPresenter. Chcete-li však přizpůsobit a nakonfigurovat chování rukopisu na InkCanvas, musíte přistupovat k příslušnému objektu InkPresenter.

Základní přizpůsobení pomocí nástroje InkPresenter

S každým ovládacím prvkem InkCanvas je instanciován objekt InkPresenter.

Poznámka:

Instanci InkPresenter nelze vytvořit přímo. Místo toho se přistupuje prostřednictvím vlastnosti InkPresenter objektu InkCanvas

Spolu s poskytováním všech výchozích chování rukopisu odpovídajícího ovládacího prvku InkCanvas, InkPresenter poskytuje komplexní sadu rozhraní API pro další přizpůsobení tahů a detailnější správu vstupu pera (standardního a upraveného). To zahrnuje vlastnosti tahů, podporované typy vstupních zařízení a to, jestli je vstup zpracován objektem nebo předán aplikaci ke zpracování.

Poznámka:

Standardní vstup rukopisu (z hrotu pera nebo tlačítka gumy) se neupravuje sekundárním hardwarem, jako je tlačítko na těle pera, tlačítko pravé myši nebo nějakým podobným mechanismem.

Ve výchozím nastavení se rukopis podporuje jenom pro zadávání perem. V této části nakonfigurujeme InkPresenter tak, aby interpretovali vstupní data z pera i myši jako tahy rukopisu. Také jsme nastavili některé atributy počátečního tahu rukopisu používané k vykreslení tahů na InkCanvas.

Chcete-li povolit rukopis myši a dotykového ovládání, nastavte InputDeviceTypes vlastnost InkPresenter na kombinaci hodnot CoreInputDeviceTypes , které chcete.

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

Atributy tahů rukopisu lze dynamicky nastavit tak, aby vyhovovaly uživatelským předvolbám nebo požadavkům aplikace.

Tady necháme, aby si uživatel vybral ze seznamu barev rukopisu.

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

Pak zpracujeme změny vybrané barvy a odpovídajícím způsobem aktualizujeme atributy tahů rukopisu.

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

Tyto obrázky ukazují, jak se vstup pera zpracovává a upravuje pomocí InkPresenteru.

Snímek obrazovky znázorňující InkCanvas s výchozími černými tahy inkoustu.

InkCanvas s výchozími černými inkoustovými tahy.

Snímek obrazovky InkCanvas s uživatelsky vybranými červenými tahy rukopisu

InkCanvas s vybranými červenými tahy rukopisu.

Pokud chcete poskytovat funkce nad rámec kreslení pomocí pera a mazání, jako je například výběr tahů, musí vaše aplikace identifikovat konkrétní vstup, který InkPresenter musí předává nezpracovaný pro zpracování vaší aplikace.

Průchozí vstup pro pokročilé zpracování

InkPresenter ve výchozím nastavení zpracovává veškeré vstupy jako tah inkoustem nebo mazací tah, včetně vstupů upravených sekundárním hardwarem, jako je tlačítko na těle pera, pravé tlačítko myši nebo podobné. Uživatelé ale obvykle očekávají některé další funkce nebo změněné chování s těmito sekundárními cenovými možnostmi.

V některých případech můžete také potřebovat zpřístupnit další funkce pro pera bez sekundárních funkcí (funkce, které obvykle nejsou spojeny se špičkou pera), jiné typy vstupních zařízení, nebo nějaký typ upraveného chování na základě uživatelského výběru v uživatelském rozhraní vaší aplikace.

Pro podporu tohoto problému lze inkPresenter nakonfigurovat tak, aby ponechal konkrétní vstup nezpracovaný. Tento nezpracovaný vstup se pak předá do aplikace ke zpracování.

Příklad – Použití nezpracovaného vstupu k implementaci výběru tahů

Platforma Windows Ink neposkytuje integrovanou podporu pro akce, které vyžadují upravený vstup, jako například výběr tahů. Pokud chcete podporovat podobné funkce, musíte ve svých aplikacích poskytnout vlastní řešení.

Následující příklad kódu (všechen kód je v souborech MainPage.xaml a MainPage.xaml.cs) ukazuje, jak povolit výběr tahů při změně vstupu pomocí tlačítka na těle pera (nebo pravého tlačítka myši).

  1. Nejprve nastavíme uživatelské rozhraní v Souboru MainPage.xaml.

    Tady přidáme plátno (pod InkCanvas) a nakreslíme tah výběru. Použití samostatné vrstvy pro vykreslení tahu výběru ponechává InkCanvas a jeho obsah nedotčené.

    Snímek obrazovky s prázdným objektem InkCanvas s podkladovým plátnem pro výběr

      <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. V MainPage.xaml.cs deklarujeme několik globálních proměnných pro zachování odkazů na aspekty uživatelského rozhraní výběru. Konkrétně výběr lasem a ohraničující rámeček, který zvýrazňuje vybrané tahy.

      // Stroke selection tool.
      private Polyline lasso;
      // Stroke selection area.
      private Rect boundingRect;
    
  3. Dále nakonfigurujeme InkPresenter tak, aby zpracovával vstupní data z pera i myši jako tahy rukopisu a nastavíme některé počáteční atributy tahů určené k vykreslení na InkCanvas.

    Nejdůležitější je, že vlastnost InputProcessingConfigurationinkPresenter indikuje, že by aplikace měla zpracovat všechny upravené vstupy. Upravený vstup je určen přiřazením InputProcessingConfiguration.RightDragAction hodnotu InkInputRightDragAction.LeaveUnprocessed. Pokud je tato hodnota nastavena, InkPresenter předává do třídy InkUnprocessedInput sadu událostí ukazatele, které lze zpracovat.

    Přiřadíme naslouchací objekty pro nezpracované události PointerPressed, PointerMoved a PointerReleased, které jsou předávány prostřednictvím InkPresenterem. Všechny funkce výběru se implementují v obslužných rutinách pro tyto události.

    Nakonec přiřadíme naslouchací procesy pro události StrokeStarted a StrokesErasedInkPresenter. Obslužné rutiny pro tyto události používáme k vyčištění uživatelského rozhraní výběru, pokud se spustí nový tah nebo se vymaže existující tah.

    Snímek obrazovky ukázkové aplikace pro přizpůsobení inkoustu zobrazující inkoustové plátno s výchozími černými inkoustovými tahy.

      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. Potom definujeme obslužné rutiny pro nezpracované události PointerPressed, PointerMoved a PointerReleased předávané InkPresenterem.

    Všechny funkce výběru jsou implementovány v těchto obslužných rutinách, včetně úsečky laso a ohraničujícího obdélníku.

    Snímek obrazovky s lasem výběru

      // 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. Chcete-li ukončit obslužnou rutinu události PointerReleased, vymažeme vrstvu výběru veškerého obsahu (laso) a pak nakreslíme jeden ohraničující obdélník kolem tahů rukopisu, které zahrnuje oblast lasa.

    Snímek obrazovky s ohraničujícím obdélníkem výběru.

      // 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. Nakonec definujeme obslužné rutiny pro události StrokeStarted a StrokesErased InkPresenter.

    Oba volají stejnou funkci čištění, která vymaže aktuální výběr vždy, když se zjistí nový tah.

      // 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. Zde je funkce, která odstraní veškeré výběrové rozhraní z plátna výběru při spuštění nového tahu nebo vymazání existujícího tahu.

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

Vlastní vykreslování rukopisu

Ve výchozím nastavení je rukopisný vstup zpracováván na pozadí s nízkou latencí a vykreslován v reálném čase, tzv. "mokrá" stopa, během kreslení. Po dokončení tahu (když zvednete pero nebo prst nebo uvolníte tlačítko myši) se tah zpracuje ve vlákně uživatelského rozhraní a je vykreslen „suchý“ na vrstvu InkCanvas (nad obsah aplikace, kde nahradí mokrý inkoust).

Toto výchozí chování můžete přepsat a zcela řídit prostředí rukopisu "vlastním sušením" tahů mokrého inkoustu. I když výchozí chování obvykle stačí pro většinu aplikací, existuje několik případů, kdy se může vyžadovat vlastní sušení, mezi které patří:

  • Efektivnější správa velkých nebo složitých kolekcí tahů inkoustem
  • Efektivnější podpora posouvání a přiblížení na velkých rukopisných plátnech
  • Prokládání inkoustu a dalších objektů, jako jsou obrazce nebo text, při zachování pořadí vrstvení
  • Synchronní sušení a převod rukopisu na obrazec DirectX (například přímka nebo tvar rastrovaný a integrovaný do obsahu aplikace místo jako samostatná vrstva InkCanvas ).

Vlastní sušení vyžaduje, aby objekt IInkD2DRenderer spravoval vstup rukopisu a vykresloval ho do kontextu zařízení Direct2D vaší aplikace Universal Windows, místo výchozího ovládacího prvku InkCanvas.

Voláním ActivateCustomDrying (před načtením InkCanvas) aplikace vytvoří InkSynchronizer objekt pro přizpůsobení vykreslení tahů inkoustem na SurfaceImageSource nebo VirtualSurfaceImageSource.

Oba SurfaceImageSource a VirtualSurfaceImageSource poskytují aplikaci sdílenou plochu DirectX pro kreslení a vytváření obsahu vaší aplikace, i když VSIS poskytuje virtuální plochu, která je větší než obrazovka pro efektivní posouvání a přiblížení. Vzhledem k tomu, že se aktualizace vizuálů na těchto plochách synchronizují s vláknem uživatelského rozhraní XAML, lze při vykreslování mokré úpravy inkoustu z InkCanvas odebrat současně.

Můžete také přizpůsobit proces zasychání rukopisu na SwapChainPanel, ale synchronizace s vláknem uživatelského rozhraní není zaručena a může dojít ke zpoždění mezi tím, kdy se rukopis vykreslí do objektu SwapChainPanel a když je rukopis odebrán z InkCanvas.

Úplný příklad této funkce najdete v ukázce Komplexní rukopis.

Poznámka:

Vlastní sušení a InkToolbar
Pokud vaše aplikace přepíše výchozí chování vykreslování rukopisu InkPresenter vlastní implementací sušení, vykreslené tahy rukopisu už nebudou dostupné pro InkToolbar a jeho integrované příkazy pro mazání nefungují podle očekávání. Chcete-li zajistit funkci vymazání, musíte zpracovat všechny události ukazatele, provést kolizní testování na každém tahu a přepsat vestavěný příkaz "Vymazat vše rukopis."

Téma Description
Rozpoznávání rukopisných tahů Převeďte rukopisné tahy na text pomocí rozpoznávání rukopisu, nebo na obrazce pomocí vlastního rozpoznávání.
Ukládání a načítání tahů rukopisu Ukládejte data tahů inkoustem do souboru GIF (Graphics Interchange Format) pomocí vložených metadat formátu ISF (Ink Serialized Format).
Přidání inkToolbaru do aplikace pro rukopis Windows Přidejte výchozí InkToolbar do aplikace Windows určené pro psaní, přidejte vlastní tlačítko pera na InkToolbar a připojte vlastní tlačítko pera k definici vlastního pera.

Programovací rozhraní (API)

Ukázky

Archivní ukázky