Delen via


Het invoerpaneel gebruiken voor automatisch aanvullen

In Windows Vista integreert het invoerpaneel voor tablet-pc's nieuwe mogelijkheden voor automatisch aanvullen waarmee de lijst automatisch aanvullen van een toepassing in realtime kan worden bijgewerkt omdat de inkt van een gebruiker wordt herkend in het invoervenster. Daarnaast wordt de lijst voor automatisch aanvullen van de toepassing op een handige locatie geplaatst voor gebruikers van het invoervenster. Zonder invoerpaneel automatisch aanvullen, is het lastig om functies voor automatisch aanvullen te gebruiken met het invoervenster, waardoor gebruikers één teken tegelijk moeten invoegen en het invoervenster moeten verplaatsen om toegang te krijgen tot suggesties voor automatisch aanvullen. Met integratie is Automatisch aanvullen een krachtig hulpmiddel voor tablet-pc-gebruikers dat het sneller en eenvoudiger maakt om tekst in te voeren met het invoervenster.

invoervenster met de IE-lijst voor automatisch aanvullen

Er zijn drie opties voor hoe een toepassing kan profiteren van de integratie van het invoerpaneel voor automatisch aanvullen. Toepassingen met automatisch-aanvullen-functionaliteit, gebouwd met Shell automatisch aanvullen (via de IAutoComplete interface) of .NET Framework automatisch aanvullen (via de AutoCompleteMode Opsomming), ontvangen integratie van invoerpaneel automatisch aanvullen zonder dat codewijzigingen nodig zijn. Toepassingen met aangepaste tekstvelden voor automatisch aanvullen kunnen de API voor automatisch aanvullen van invoervensters gebruiken om dezelfde functionaliteit te verkrijgen.

In alle gevallen kunt u deze wijzigingen aanbrengen in de lijst met automatisch aanvullen van de toepassing zonder de gebruikersinterface of voorspellingslogica die door een toepassing wordt gebruikt, te dupliceren of te wijzigen om een lijst met automatisch aanvullen te genereren. De lijst met automatisch aanvullen blijft door de toepassing getekend en de inhoud van de lijst met automatisch aanvullen is hetzelfde als wanneer de tekst rechtstreeks in het invoerveld zou worden getypt.

Integratie van invoerpaneel voor automatisch aanvullen wordt ondersteund op het Windows Vista-besturingssysteem of latere versies. Integratie van invoerpaneel voor automatisch aanvullen is ingebouwd in Shell Automatisch aanvullen vanaf Windows Vista en in Windows Forms-ontwikkeling vanaf .NET Framework versie 3.0. Hoewel IAutoComplete en AutoCompleteMode beide worden uitgevoerd in eerdere versies van Windows, wordt automatisch aanvullen van invoervensters niet ondersteund op Microsoft Windows XP Tablet PC Edition of eerdere besturingssystemen. Als u Automatisch aanvullen van het invoerpaneel uitvoert op eerdere versies van Tablet PC, keren toepassingen terug naar het gedrag van vóór de integratie.

Redenen voor het integreren van lijsten voor automatisch aanvullen van toepassingen met invoerpaneel

Integratie van de lijst met automatisch aanvullen van een toepassing maakt het maximale gemak en de snelheid van invoer mogelijk voor gebruikers die tekst invoeren in een tekstveld met functionaliteit voor automatisch aanvullen. Bovendien lijkt een toepassing met de integratie van invoerpaneel automatisch aanvullen onmiddellijk alsof deze is ontwikkeld met de tablet-pc in gedachten, waardoor de toepassing aantrekkelijker wordt voor tablet-pc-gebruikers.

Hoe invoerpaneel en lijst met automatisch aanvullen communiceren zonder integratie

Invoerpaneel gebruiken om tekst in te voeren in een tekstveld dat een lijst met automatisch aanvullen bevat, maar die niet is geïntegreerd met het invoervenster:

  1. De gebruiker plaatst de focus in het tekstveld en opent het invoervenster.
  2. De gebruiker schrijft één of twee tekens.
  3. De gebruiker tikt op Invoegen. Het invoervenster voert de tekst in het tekstveld van de toepassing in. De lijst voor automatisch aanvullen van de app verschijnt en wordt waarschijnlijk gedeeltelijk of volledig door het invoerpaneel verborgen.
  4. De gebruiker sleept het inputpaneel om de lijst met automatisch aanvullen van de toepassing zichtbaar te maken.
  5. Als de juiste vermelding in de lijst voor automatisch aanvullen staat, kan de gebruiker die vermelding nu selecteren; anders moet de gebruiker stap 2 en 3 herhalen.

Dit is duidelijk een lastig proces. De verwachtingen van de gebruikers over hoe een lijst met automatisch aanvullen moet werken, worden niet waargemaakt, en hun vermogen om taken uit te voeren lijdt hieronder.

Hoe de interactie tussen het invoerpaneel en de autocompletelijst verbeterd door integratie.

Invoerpaneel gebruiken om tekst in te voeren in een tekstveld dat een lijst met automatisch aanvullen bevat die is geïntegreerd met het invoervenster:

  1. De gebruiker plaatst de focus in het tekstveld en opent het invoervenster.
  2. De gebruiker schrijft één of twee tekens. De lijst met automatisch aanvullen van de toepassing wordt direct boven of direct onder het invoervenster weergegeven terwijl de gebruiker tekst schrijft.
  3. De gebruiker selecteert de vermelding in de lijst automatisch aanvullen; de vermelding wordt rechtstreeks ingevoegd in het tekstveld van de toepassing of de gebruiker herhaalt stap 2 totdat de juiste vermelding wordt weergegeven.

Vanwege de integratie wordt de lijst met automatisch aanvullen weergegeven en wordt deze bijgewerkt terwijl de gebruiker in het invoervenster schrijft. Daarnaast wordt de lijst zodanig geplaatst dat de gebruiker deze zowel kan openen tijdens het schrijven als niet verborgen in het invoervenster. Als de gebruiker ten slotte een item in een lijst met automatisch aanvullen selecteert, wordt het item rechtstreeks ingevoegd in het tekstinvoerveld van de toepassing, zodat de gebruiker de stap voor het invoegen van tekst uit het invoervenster kan omzeilen.

invoervenster met de autovoltooiingslijst van Outlook Express

Standaardcomponenten voor automatisch aanvullen met Autocomplete-integratie voor invoerpaneel

Zowel IAutoComplete als AutoCompleteMode bevatten geïntegreerde functionaliteit van de Input Panel-autocompleter. Toepassingen die gebruikmaken van een van deze standaardonderdelen voor automatisch aanvullen, kunnen gebruikmaken van de functionaliteit voor automatisch aanvullen van het invoerpaneel met weinig tot geen extra werk. Bovendien, hoewel Invoerpaneel Autovoltooiing alleen wordt ondersteund op Windows Vista of nieuwere versies van het Windows-besturingssysteem, krijgen toepassingen die gebouwd zijn met IAutoComplete vóór de release van Windows Vista automatisch integratie met Invoerpaneel Autovoltooiing wanneer ze op Windows Vista worden uitgevoerd. De volgende secties bevatten meer informatie over de specifieke elementen IAutoComplete- en AutoCompleteMode met integratie van automatisch aanvullen vanuit het invoerpaneel.

Automatisch aanvullen van Shell met integratie van invoerpaneel voor automatische aanvulling

Toepassingen die gebruikmaken van IAutoComplete krijgen gratis integratie met invoerpaneel voor automatisch aanvullen. Hoewel de Shell-API's voor automatisch aanvullen zijn opgenomen in Windows 2000, wordt de integratie van het invoerpaneel automatisch aanvullen alleen ondersteund in Windows Vista en nieuwere versies. Toepassingen die zijn gebouwd vóór de release van Windows Vista en gebruikmaken van IAutoComplete krijgen automatisch de integratie van Invoerpaneel Autocomplete wanneer ze worden uitgevoerd op Windows Vista.

Als u op deze manier gebruik wilt maken van Tablet Autocomplete, moet u het object voor automatisch aanvullen (CLSID_Autocomplete) gebruiken. Als u functionaliteit voor automatisch aanvullen wilt opgeven voor URL's of bestandsnamen, gebruikt u de functie SHAutoComplete om het object voor automatisch aanvullen te maken.

Naast IAutoCompletekunt u direct IAutoComplete2 of IAutoCompleteDropDownimplementeren en automatisch de integratie van het invoerpaneel voor automatische aanvulling verkrijgen.

Integratie van automatisch aanvullen in het invoerpaneel met .NET Framework-toepassingen

Vanaf .NET Framework 3.0 bevatten de tekstvakken in Windows Forms de functie automatisch aanvullen. Windows Forms-tekstvak Automatisch aanvullen is gebouwd boven op Shell Automatisch aanvullen, wat betekent dat de integratie van invoerpaneel automatisch aanvullen ook is ingebouwd. .NET Framework 3.0 wordt ondersteund op lager niveau in Windows-edities die vóór Windows Vista zijn uitgebracht. Omdat de integratie van het invoerpaneel automatisch aanvullen echter alleen wordt ondersteund in Windows Vista of latere versies, werkt de integratie van invoerpaneel automatisch aanvullen alleen in een .NET Framework 3.0-toepassing wanneer deze is geïnstalleerd op Windows Vista of latere versies.

Toepassingen die willen profiteren van de integratie van het invoerpaneel voor automatisch aanvullen in .NET Framework 3.0, moeten gebruikmaken van een Windows Forms-tekstvak waarvoor de eigenschap AutoAanvullen- is ingeschakeld. U hoeft verder niets te doen dan Windows Forms Automatisch aanvullen te laten werken om te kunnen profiteren van de integratie van automatisch aanvullen van invoerpaneel.

Api's voor automatisch aanvullen van invoerpaneel rechtstreeks gebruiken

Ontwikkelaars van aangepaste tekstvakken voor automatisch aanvullen moeten rechtstreeks met de API's voor het invoervenster automatisch aanvullen werken om de verbeterde tekstinvoerervaring te krijgen die de integratie van het invoerpaneel automatisch aanvullen mogelijk maakt in hun toepassingen. De API's voor het invoerpaneel voor automatisch aanvullen zijn opgenomen als onderdeel van het Windows Vista-besturingssysteem en als onderdeel van de Tablet Platform SDK-versie 1.9 of hoger. De invoerpaneelinterfaces voor automatisch aanvullen zijn COM-interfaces.

In de volgende sectie wordt beschreven hoe u deze interfaces in detail kunt gebruiken voor een C++-toepassing. Deze COM-interfaces kunnen echter worden geïmplementeerd in de meeste talen, waaronder C#, via het gebruik van COM Interop.

De twee vereiste interfaces zijn de ITipAutocompleteProvider Interface en de ITipAutocompleteClient Interface. De definities voor deze interfaces vindt u in TipAutoComplete.h en TipAutoComplete_i.c.

Eerst moet een toepassing een providerklasse voor automatisch aanvullen definiëren en instantiëren, waarmee ITipAutocompleteProvider- wordt geïmplementeerd voor elk tekstinvoerveld dat een lijst met automatisch aanvullen bevat. Deze klasse beheert de applicatiezijde van de integratie met Autocomplete. Alle aanvragen voor automatisch aanvullen vanuit het invoervenster worden gemaakt van de client voor automatisch aanvullen naar de toepassing via de provider voor automatisch aanvullen van de toepassing. De provider voor automatisch aanvullen van de toepassing moet toegang hebben tot zowel de HWND voor de lijst met automatisch aanvullen van de toepassing als de HWIND voor het bijbehorende tekstinvoerveld. Daarnaast moeten de volgende methoden van ITipAutocompleteProvider worden geïmplementeerd:

  • ITipAutocompleteProvider::UpdatePendingText Method: Deze methode wordt gebruikt door de client voor automatisch aanvullen om de toepassing op de hoogte te stellen van de tekst die een gebruiker heeft geschreven in het invoervenster. Na ontvangst van deze melding is de provider verantwoordelijk voor het genereren van een autocompletelijst alsof de tekst in het tekstinvoerveld van de toepassing was getypt. De tekenreeks wordt doorgegeven aan de provider voor automatisch aanvullen via ITipAutocompleteProvider::UpdatePendingText Method en omvat alleen de tekst die momenteel in het invoervenster staat. Als er dus extra tekst in het tekstinvoerveld staat, is het de verantwoordelijkheid van de provider om deze correct toe te voegen aan de tekst die door de client wordt verzonden. De tekenreeks die doorgegeven wordt ITipAutocompleteProvider::UpdatePendingText Method moet behandeld worden als vervanging voor de huidige selectie in het veld. Als er geen huidige selectie is, moet deze op de positie van het huidige invoegpunt worden geplaatst. Zodra de automatisch aanvullen lijst is gegenereerd, moet de provider de ITipAutocompleteProvider::Show-Methode aanroepen met TRUE om de automatisch aanvullen lijst weer te geven. De toepassing mag geen aanroepen in de cache opslaan voor UpdatePendingText, maar behandelt elke extra aanroep naar UpdatePendingText als annulering van de vorige aanroep om te voorkomen dat er een verouderde gebruikersinterface voor automatisch aanvullen wordt weergegeven. De volgende voorbeeldcode illustreert deze procedures.

    HRESULT SampleProvider::UpdatePendingText(BSTR bstrPendingText)
    {
       //Discard previously cached pending text from Input Panel
       m_bstrPending.Empty();
        //Store the new pending text from Input Panel as m_bstrPending
    m_bstrPending = bstrPendingText;
    
        //Get the text from the field in two chunks. The characters to
    //the left of the selection and the characters to the right.
    CComBSTR bstrLeftContext = //Text to the left of the selection
            CComBSTR bstrRightContext = //Text to the right of the selection
    
    //Discard previously cached complete text
        m_bstrCompleteText.Empty();
        //Append to the field text from the left of the selection
        //the text from Input Panel and then append to that
        //the field text to the right of the selection
        m_bstrCompleteText.Append(bstrLeftContext);
        m_bstrCompleteText.Append(m_bstrPending);
        m_bstrCompleteText.Append(bstrRigtContext);
    
        //Update the app's AC list based on m_bstrCompleteText
        //...
    
        //Show the updated AC list by calling the provider's Show method
       Show(true);
       return S_OK;
    }
    
  • ITipAutocompleteProvider::Show Method: Deze methode wordt aangeroepen vanuit UpdatePendingText, maar kan ook op elk gewenst moment worden aangeroepen door de client voor automatisch aanvullen. Na ontvangst van deze aanroep moet de provider voor automatisch aanvullen de provider voor automatisch aanvullen verbergen of weergeven zoals aangegeven door de parameter. Voordat de lijst met automatisch aanvullen wordt weergegeven, wordt verwacht dat de provider voor automatisch aanvullen de client voor automatisch aanvullen raadpleegt waar de lijst met automatisch aanvullen moet worden geplaatst. Verderop in dit artikel wordt meer informatie over het positioneren van de lijst met automatisch aanvullen weergegeven.

Vervolgens moet de toepassing de functie Active Template Library (ATL) CoCreateInstance gebruiken om een exemplaar van de ITipAutocompleteClient Interface te produceren met klasse-id CLSID_TipAutoCompleteClient als een in-process-server en de provider vervolgens registreren bij de client. De client voor automatisch aanvullen ITipAutocompleteClient::AdviseProvider Method registreert de provider met de client, zodat de client het Autocomplete-providerobject van de toepassing kan aanroepen. Als tiptsf.dll niet aanwezig is in het systeem, mislukt de functie CoCreateInstance en wordt REGDB_E_CLASSNOTREGgeretourneerd. Op dit moment kan de toepassing de ITipAutocompleteProvider object negeren en doorgaan alsof het invoerpaneel niet bestaat, omdat het niet op een dergelijk systeem staat.

De toepassing kan ervoor kiezen om één exemplaar van ITipAutocompleteClient te maken of één exemplaar per tekstveld. Voor de eerste optie moet de provider worden afgemeld en aangemeld elke keer dat de focus wordt gewijzigd. Verderop in dit onderwerp vindt u meer informatie over het ongedaan maken van de registratie van de provider voor automatisch aanvullen.

Er zijn verschillende stappen betrokken bij het positioneren van de lijst voor automatisch aanvullen die moeten worden gecoördineerd tussen de provider voor automatisch aanvullen (toepassing) en de client voor automatisch aanvullen (invoerpaneel). Voordat de lijst voor automatisch aanvullen wordt weergegeven, moet de provider, of dit nu komt door een aanroep van de Autocomplete-provider's Show methode of doordat de gebruiker tekst invoert met het toetsenbord, eerst de client raadplegen over waar de lijst moet worden geplaatst. De provider moet de volgende stappen uitvoeren:

  • Gebruik de ITipAutocompleteClient::RequestShowUI-methode om te bepalen of de invoegtoepassing gereed is om de lijst met automatisch aanvullen weer te geven. RequestShowUI gebruikt de parameter HWND die de HWND is voor het lijstvenster automatisch aanvullen. De methode retourneert TRUE of FALSE om aan te geven of dit de status is waarin de lijst met automatisch aanvullen kan worden weergegeven. Als de client FALSEretourneert, mag de provider niet proberen de automatische aanvul-lijst weer te geven.

  • Roep RequestShowUI aan om de handgreep van het venster voor de pop-up lijst voor automatisch aanvullen in te stellen, voordat u de ITipAutocompleteClient::PreferredRects Methodaanroept. Als u dit niet doet, treedt er een E_INVALIDARG fout op bij het aanroepen van PreferredRects-.

  • Als RequestShowUI retourneert TRUE, moet de provider de standaardrechthoek voor schermcoördinaat van de lijst voor automatisch aanvullen berekenen op basis van de locatie van het tekstinvoerveld en vervolgens de ITipAutocompleteClient::PreferredRects Methodaanroepen. Hierdoor kan de client voor automatisch aanvullen de rechthoek aanpassen om te voorkomen dat de lijst voor automatisch aanvullen overlapt met het invoervenster. De methode PreferredRects heeft vier parameters:

    • RECT rcACList: de standaard schermcoördinaatrechthoek van de lijst met automatisch aanvullen.
    • RECT rcField: de rechthoek met schermcoördinaten van het bijbehorende tekstinvoerveld.
    • RECT *prcModifiedACList: De aangepaste rechthoek van schermcoördinaten voor de Autocomplete
    • BOOL *pfShowAbove: Deze parameter geeft aan de provider aan of de prcModifiedACList rechthoek de autocomplete-lijst boven of onder het Invoerpaneel positioneert. De toepassing kan deze informatie gebruiken om ui-elementen correct te tekenen, zoals formaatgrepen en schuifbalken. De provider moet in eerste instantie de richting doorgeven waarin de Autocompletelijst zal worden geplaatst ten opzichte van het tekstinvoerveld door rcACList. De klant wijzigt pfShowAbove niet als prcModifiedACList gelijk is aan rcACList.

    Gebruik de retourwaarden van de prcModifiedACList en pfShowAbove argumenten om het lijstvenster voor automatisch aanvullen te positioneren en weer te geven. Als het invoervenster niet wordt gebruikt, retourneert RequestShowUI altijd TRUE en prcModifiedACList altijd hetzelfde is als rcACList. pfShowAbove- is ook ongewijzigd, het resultaat is dat de aanroepen geen invloed hebben op het gedrag van de toepassing. De volgende voorbeeldcode illustreert deze procedures.

HRESULT SampleProvider::Show(BOOL fShow)
{
    //Ask the AC client if it is OK to show the Autocomplete list.
    BOOL fAllowShowing = FALSE;
    m_spACClient->RequestShowUI(m_hWndList, &fAllowShowing);

    if (fShow && fAllowingShowing)
        {
            // Create the parameters required to call PreferredRects
            RECT rcField = //Rectangle for app's text field
            RECT rcACList = //Default rectangle for app's AC list
            RECT rcModifiedACList = {0, 0, 0, 0};
            BOOL fShowAbove = TRUE;

//Ask the AC client to modify the position of the AC list
m_spACClient->PreferredRects(&rcACList, &rcField,
&rcModifiedACList, &fShowAbove);

            //Show the Autocomplete UI at the modified preferred rectangle
            //from rcModifiedACList and the directional info provide by
//fShowAbove
            //...
        }
    else
        {
        //Hide the Autocomplete list and clean up
        //...
        }
    return S_OK;
}

Wanneer de gebruiker een item in de autocompletelijst selecteert, moet de provider de ITipAutocompleteClient::UserSelection-methode aanroepen, naast het invoegen van de gekozen itemtekst in het tekstinvoerveld. Het invoerpaneel gebruikt deze melding om alle resterende tekst die nog niet is ingevoegd vanuit het invoerpaneel weg te gooien.

Als de provider niet meer nodig is, moet de provider ten slotte worden ontkoppeld van de Autocomplete-client door de ITipAutocompleteClient::UnadviseProvider Method aan te roepen om de provider uit te schrijven. Mogelijk moet de registratie van de provider om een van de twee redenen ongedaan worden gemaakt: omdat het tekstinvoerveld waaraan de provider is gekoppeld, is vernietigd of omdat de toepassing ervoor kiest om slechts één client voor automatisch aanvullen te maken, in plaats van één per tekstinvoerveld. In dit geval moet de provider de registratie ongedaan maken telkens wanneer de focus wordt overgeschakeld van het tekstveld.

Conclusie

De integratie van het "Input Panel" voor automatisch aanvullen is een krachtig hulpmiddel voor het verbeteren van de gebruikerservaring in Windows-toepassingen die lijsten met automatisch aanvullen bevatten op tablet-pc's. Zonder integratie moeten gebruikers van het invoervenster een tijdrovend proces doorlopen om tekst één teken tegelijk in te voegen en invoerpaneel te verplaatsen om automatisch aanvullen te kunnen gebruiken. Met integratie verschijnen autocomplete-lijsten op een handige locatie wanneer gebruikers met een stylus schrijven in het Invoerpaneel, waardoor zowel de snelheid als het gemak van tekstinvoer worden verhoogd. In toepassingen met functionaliteit voor automatisch aanvullen die is gebouwd op basis van Shell Automatisch aanvullen of .NET Framework 3.0 Automatisch aanvullen, is de integratie van Automatisch aanvullen met het invoerpaneel een gratis en aantrekkelijke functie. Bovendien wordt een eenvoudige set van op COM gebaseerde interfaces geboden om dezelfde geïntegreerde ervaring te bieden voor toepassingen die ervoor kiezen aangepaste besturingselementen voor automatisch aanvullen te gebruiken.

Tekstinvoerpaneelreferentie