Komplettera automatiskt med hjälp av indatapanelen

I Windows Vista integrerar Tablet PC-indatapanelen nya funktioner för automatisk komplettering som gör det möjligt för ett programs lista med automatisk komplettering att uppdateras i realtid när en användares pennanteckning identifieras på indatapanelen. Dessutom är programmets lista över automatisk komplettering placerad på en lämplig plats för användare av indatapanelen. Utan automatisk komplettering av indatapanelen är det svårt att använda funktioner för automatisk komplettering med indatapanelen, vilket kräver att användarna infogar ett tecken i taget och flyttar indatapanelen för att få åtkomst till förslag för automatisk komplettering. Med integrering är Autocomplete ett kraftfullt verktyg för Tablet PC-användare som påskyndar och ökar enkelheten att ange text med inmatningspanelen.

inmatningspanel med IE:s autokompletteringslista

Det finns tre alternativ för hur en applikation kan använda sig av automatisk komplettering i indatapanelen. Program som innehåller funktioner för automatisk komplettering som skapats med Shells automatisk komplettering (via IAutoComplete--gränssnittet) eller .NET Framework Autocomplete (via AutoCompleteMode Enumerationen) får integration med indatapanels automatiska komplettering utan att behöva kodändringar. Program som innehåller anpassade textfält för automatisk komplettering kan använda API:et för automatisk komplettering av indatapanelen för att få samma funktioner.

I samtliga fall kan du göra dessa ändringar i programvarans Autocomplete-lista utan att duplicera eller ändra användargränssnittet eller den förutsägelselogik som används av applikationen för att generera en Autocomplete-lista. Autokompletteringslistan fortsätter att ritas av programmet, och innehållet i autokompletteringslistan är detsamma som om texten skrevs in direkt i redigeringsfältet.

Integrering av autokomplettering i inmatningspanelen stöds på operativsystemet Windows Vista och senare versioner. Integreringen av automatisk komplettering av indatapanelen är inbyggd i Shell Autocomplete från och med Windows Vista och i Windows Forms-utveckling som börjar med .NET Framework version 3.0. Även om IAutoComplete och AutoCompleteMode båda körs på tidigare versioner av Windows, stöds inte integrering av automatisk komplettering av indatapaneler på Microsoft Windows XP Tablet PC Edition eller tidigare operativsystem. Om du kör Automatisk komplettering av indatapanelen på tidigare versioner av Tablet PC återgår program till förintegreringsbeteendet.

Anledningar till att integrera programmets automatisk komplettering med inmatningspanelen

Integrering av ett programs lista över automatisk komplettering möjliggör maximal enkel och snabb inmatning för användare som anger text i ett textfält som innehåller funktioner för automatisk komplettering. Dessutom visas ett program som innehåller integrering av automatisk komplettering av indatapanelen omedelbart som om det utvecklades med Tablet PC i åtanke, vilket gör programmet mer tilltalande för Tablet PC-användare.

Så interagerar indatapanelen och den automatiska kompletteringslistan utan att integreras

Använd inmatningspanelen för att ange text i ett textfält som innehåller en lista med automatisk komplettering, men som inte är integrerad med indatapanelen:

  1. Användaren placerar fokus i textfältet och öppnar indatapanelen.
  2. Användaren skriver ett eller två tecken.
  3. Användaren trycker på Infoga. Inmatningspanelen anger texten i programmets textfält. Applikationens autokompletteringslista visas och döljs troligen delvis eller helt av inmatningspanelen.
  4. Användaren flyttar indatapanelen för att visa programmets autofyllningslista.
  5. Förutsatt att rätt post ingår i listan Komplettera automatiskt kan användaren nu välja den posten. annars måste användaren upprepa steg 2 och 3.

Detta är helt klart en besvärlig process. Användarens förväntningar på hur en lista med automatisk komplettering ska fungera slås i spillror, och deras förmåga att utföra uppgifter blir negativt påverkad.

Så här förbättras interaktionen mellan indatapanel och automatisk kompletteringslista med integrering

Använd inmatningspanelen för att ange text i ett textfält som innehåller en lista med automatisk komplettering som är integrerad med indatapanelen:

  1. Användaren placerar fokus i textfältet och öppnar indatapanelen.
  2. Användaren skriver ett eller två tecken. Applikationens autokompletteringslista visas direkt ovanför eller direkt under inmatningspanelen när användaren skriver text.
  3. Användaren väljer posten från listan Komplettera automatiskt. posten infogas direkt i programmets textfält, eller så upprepar användaren steg 2 tills rätt post visas.

På grund av integreringen visas listan Komplettera automatiskt och uppdateras medan användaren skriver på indatapanelen. Dessutom är listan placerad så att det både är praktiskt för användaren att komma åt när du skriver och inte skyms av indatapanelen. Slutligen, när användaren väljer ett objekt från en lista över komplettera automatiskt infogas objektet direkt i programmets textinmatningsfält, vilket gör det möjligt för användaren att kringgå steget att infoga text från inmatningspanelen.

indatapanel med Outlook Express automatiskt ifyllning-lista

Standardkomponenter för automatisk komplettering som inkluderar integration med indatapanelens automatisk komplettering

Både IAutoComplete och AutoCompleteMode inkluderar inbyggd integrering av indatapanelens autokomplettering. Program som använder någon av dessa standardkomponenter för automatisk komplettering kan dra nytta av funktionen Komplettera automatiskt i indatapanelen med lite eller inget ytterligare arbete. Även om Input Panel Autocomplete endast stöds i Windows Vista eller nyare versioner av Windows-operativsystemet, får program som har skapats med hjälp av IAutoComplete innan Windows Vista släpptes automatiskt integrering av Input Panel när de körs på Windows Vista. Följande avsnitt innehåller mer information om de specifika elementen IAutoComplete och AutoCompleteMode som innehåller integrering av automatisk komplettering av indatapanelen.

Komplettera gränssnitt automatiskt med integrering av automatisk komplettering av indatapanel

Program som använder IAutoComplete få integrering av automatisk komplettering av indatapanelen kostnadsfritt. API:er för automatisk komplettering av shell ingår i Windows 2000 och senare, men integrationen av automatisk komplettering av inmatningspanelen stöds endast i Windows Vista och nyare versioner. Program som skapats före lanseringen av Windows Vista och som använder IAutoComplete får automatiskt integrering med indatapanelens autokomplettering när de körs i Windows Vista.

För att kunna dra nytta av funktionen autokomplettering för surfplattor på det här sättet måste du använda autokompletteringsobjekt (CLSID_Autocomplete). Om du vill tillhandahålla funktioner för automatisk komplettering av URL:er eller filnamn använder du funktionen SHAutoComplete för att skapa objektet för automatisk komplettering.

Förutom IAutoCompletekan du implementera IAutoComplete2 eller IAutoCompleteDropDowns direkt och ändå få integrering av automatisk komplettering av indatapanelen automatiskt.

Automatisk kompletteringsintegrering av indatapanel med .NET Framework-program

Från och med .NET Framework 3.0 innehåller Textrutorna i Windows Forms automatisk komplettering. Autokomplettering av Windows Forms-textrutan bygger på Shell Autocomplete, vilket innebär att integreringen av automatisk komplettering av indatapanelen också är inbyggd. .NET Framework 3.0 stöds nedåt på Windows-utgåvor som släpptes före Windows Vista. Men eftersom integrering av automatisk komplettering av indatapanelen endast stöds i Windows Vista eller senare versioner fungerar integrering av automatisk komplettering av indatapanelen endast i ett .NET Framework 3.0-program när det installeras i Windows Vista eller senare versioner.

Program som vill dra nytta av integrering av automatisk komplettering av indatapaneler i .NET Framework 3.0 måste använda en Windows Forms TextBox- med egenskapen AutoCompleteMode aktiverad. Du behöver inte utföra något ytterligare arbete utöver att få Windows Forms Autocomplete att fungera för att dra nytta av integrering av automatisk komplettering av indatapanelen.

Använda API:er för direkt autokomplettering i inmatningspanelen

Utvecklare av anpassade textrutor för automatisk komplettering måste arbeta med API:erna för automatisk komplettering av indatapanelen direkt för att få den förbättrade textinmatningsupplevelsen som integrering av automatisk komplettering av indatapaneler möjliggör i sina program. API:erna för automatisk komplettering av indatapanelen ingår som en del av operativsystemet Windows Vista och som en del av Tablet Platform SDK version 1.9 eller senare. Gränssnitten för automatisk komplettering av indatapanelen är COM-baserade gränssnitt.

I följande avsnitt beskrivs hur du arbetar med dessa gränssnitt i detalj för ett C++-program. Dessa COM-gränssnitt kan dock implementeras på de flesta språk, inklusive C#, med hjälp av COM Interop.

För att implementera indatapanelens automatisk komplettering i en anpassad textruta för automatisk komplettering krävs det två gränssnitt: ITipAutocompleteProvider Interface och ITipAutocompleteClient Interface. Definitionerna för dessa gränssnitt finns i TipAutoComplete.h och TipAutoComplete_i.c.

Först måste ett program definiera och instansiera en providerklass för automatisk komplettering, som implementerar ITipAutocompleteProvider för varje textinmatningsfält som innehåller en lista över komplettera automatiskt. Den här klassen hanterar programmets del av integreringen av autokomplettering. Alla förfrågningar om automatisk komplettering från indatapanelen görs från klienten Komplettera automatiskt till programmet via programmets leverantör för automatisk komplettering. Programvarans leverantör för automatisk komplettering måste ha åtkomst till både HWND för programmets lista över automatisk komplettering och HWND för det associerade textinmatningsfältet. Dessutom måste följande metoder för ITipAutocompleteProvider implementeras:

  • ITipAutocompleteProvider::UpdatePendingText Method: Den här metoden används av klienten Komplettera automatiskt för att meddela programmet om texten som en användare har skrivit i indatapanelen. När du får det här meddelandet ansvarar providern för att generera en lista med automatisk komplettering som om texten hade skrivits in i programmets textinmatningsfält. Strängen överförs till Autocompletetjänsten med hjälp av ITipAutocompleteProvider::UpdatePendingText-metoden och innehåller endast texten som för närvarande finns i indatapanelen. Om det finns ytterligare text i textinmatningsfältet är det därför leverantörens ansvar att korrekt lägga till den i texten som skickas av klienten. Strängen som skickas av ITipAutocompleteProvider::UpdatePendingText-metoden ska behandlas som en ersättning för den aktuella markeringen i fältet. Om det inte finns någon aktuell markering bör den placeras vid den aktuella insättningspunkten. När listan Komplettera automatiskt har genererats bör providern anropa ITipAutocompleteProvider::Visa metoden genom att skicka in TRUE för att visa Komplettera automatiskt-listan. Programmet ska inte cachelagra anrop till UpdatePendingText utan behandla i stället varje ytterligare anrop till UpdatePendingText som en annullering av det föregående anropet för att undvika att visa ett inaktuellt användargränssnitt för en lista med automatisk komplettering. Följande exempelkod illustrerar dessa metoder.

    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: Den här metoden anropas från UpdatePendingText, men kan även anropas av klienten Komplettera automatiskt när som helst. När det här anropet tas emot måste leverantören för automatisk komplettering dölja eller visa sig enligt parametern. Innan du visar listan över automatisk komplettering förväntas providern rådgöra med autokompleteringsklienten om var listan ska placeras. Mer information om hur du placerar listan Komplettera automatiskt visas senare i den här artikeln.

Därefter bör programmet använda funktionen Active Template Library (ATL) CoCreateInstance för att skapa en instans av ITipAutocompleteClient Interface med klass-ID CLSID_TipAutoCompleteClient som en pågående server och sedan registrera providern med klienten. Den automatiska kompletteringsklienten ITipAutocompleteClient::AdviseProvider-metoden registrerar providern med klienten så att klienten kan anropa programmets providerobjekt för automatisk komplettering. Om tiptsf.dll inte finns i systemet misslyckas funktionen CoCreateInstance och returnerar REGDB_E_CLASSNOTREG. I det här läget kan programmet ta bort sitt ITipAutocompleteProvider- objekt och fortsätta som om indatapanelen inte finns, eftersom den inte finns i ett sådant system.

Programmet kan välja att skapa en instans av ITipAutocompleteClient eller en instans per textfält. Det första alternativet kräver att providern avregistreras och registreras varje gång fokus ändras. Mer information om att avregistrera providern för automatisk komplettering visas senare i det här avsnittet.

Det finns flera steg för att placera listan för automatisk komplettering, som måste samordnas mellan leverantören för automatisk komplettering (programmet) och klienten för automatisk komplettering (indatapanelen). Innan listan Komplettera automatiskt visas, antingen som ett resultat av ett anrop till den automatiska kompletteringsproviderns Show-metoden eller på grund av att användaren anger text med tangentbordet, måste providern kontakta klienten om var listan Komplettera automatiskt ska placeras. Providern bör vidta följande steg:

  • Använd autokompletteringsklientens ITipAutocompleteClient::RequestShowUI-metoden för att avgöra om indatapanelen är redo att visa autokompletteringslistan. RequestShowUI tar parametern HWND som är HWND för Komplettera automatiskt-listfönstret, och metoden returnerar TRUE- eller FALSE- för att ange om det är det tillstånd där Komplettera automatiskt-listan kan visas. Om klienten returnerar FALSEska providern inte försöka visa listan Komplettera automatiskt.

  • Anropa RequestShowUI för att ställa in popup-fönstrets handtag för listan för automatisk komplettering innan du anropar ITipAutocompleteClient::PreferredRects-metoden. Om detta inte utförs orsakar det ett E_INVALIDARG fel vid anrop av PreferredRects.

  • Om RequestShowUI- returnerar TRUE-ska providern beräkna standardkoordinatrektangeln för Autocompletelistan utifrån textinmatningsfältets position och anropa sedan autokompletteringsklientens ITipAutocompleteClient::PreferredRects-metoden. På så sätt kan autokompletteringsklienten justera rektangeln för att undvika att listan Komplettera automatiskt överlappar indatapanelen. Metoden PreferredRects tar fyra parametrar:

    • RECT rcACList: Standardskärmens koordinatrektangel i listan Komplettera automatiskt.
    • RECT rcField: Skärmkoordinatrektangeln för motsvarande textinmatningsfält.
    • RECT *prcModifiedACList: Den justerade skärmkoordinatrektangeln för autokomplettering
    • BOOL *pfShowAbove: Den här parametern anger för providern om prcModifiedACList rektangel placerar listan Komplettera automatiskt ovanför eller under indatapanelen. Programmet kan använda den här informationen för att rita användargränssnittselement korrekt, till exempel ändra storlek på handtag och rullningslister. Leverantören bör först ange den riktning i vilken autokompletteringslistan ska placeras i förhållande till textinmatningsfältet av rcACList. Klienten ändrar inte pfShowAbove om den anger prcModifiedACList lika med rcACList.

    Använd returvärdena för prcModifiedACList och pfShowAbove utargumenten för att placera och visa autokompletteringslistfönstret. Om indatapanelen inte används, returnerar RequestShowUI alltid TRUE, och prcModifiedACList är alltid samma som rcACList. pfShowAbove är också oförändrad, vilket innebär att anropen inte påverkar programmets beteende. Följande exempelkod illustrerar dessa metoder.

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

När användaren väljer ett objekt i listan Komplettera automatiskt måste providern anropa klientens ITipAutocompleteClient::UserSelection-metoden förutom att infoga den markerade objekttexten i textpostfältet. Indatapanelen använder det här meddelandet för att ta bort all återstående text som ännu inte har infogats från inmatningspanelen.

När leverantören inte längre behövs bör leverantören slutligen kopplas bort från klienten för Automatisk komplettering genom att anropa autokompletteringsklientens ITipAutocompleteClient::UnadviseProvider-metoden för att avregistrera leverantören. Providern kan behöva avregistreras av någon av två orsaker: eftersom textinmatningsfältet som providern är associerad med har förstörts eller eftersom programmet väljer att endast skapa en automatisk kompletteringsklient, i stället för en per textinmatningsfält. I det här fallet måste providern avregistreras varje gång fokus växlas bort från textfältet.

Slutsats

Integrering av automatisk komplettering av inmatningspanel är ett kraftfullt verktyg för att förbättra användarupplevelsen i Windows-program som innehåller listor med automatisk komplettering på Tablet PC. Utan integrering måste indatapanelens användare gå igenom en omständlig process för att infoga text ett tecken i taget och flytta indatapanelen för att kunna använda Komplettera automatiskt. Genom integrering visas listor för automatisk komplettering på en praktisk plats medan användarna skriver med penna i inmatningspanelen, vilket ökar både hastigheten och enkelheten i textinmatningen. I program som innehåller funktioner för automatisk komplettering som bygger på Shell Autocomplete eller .NET Framework 3.0 Autocomplete är integrering av automatisk komplettering av indatapanelen en kostnadsfri och övertygande funktion. Dessutom tillhandahålls en enkel uppsättning COM-baserade gränssnitt för att möjliggöra samma integrerade upplevelse för program som väljer att använda anpassade kontroller för automatisk komplettering.

Referens till textinmatningspanel