Leer en inglés

Compartir a través de


Uso de Autocompletar

Autocompletar expande las cadenas que se han escrito parcialmente en un control de edición en cadenas completas. Por ejemplo, cuando un usuario empieza a escribir una dirección URL en el control De edición de direcciones incrustado en la barra de herramientas de Windows Internet Explorer, la función autocompletar expande la cadena en una o varias opciones de dirección URL completas que sean coherentes con la cadena parcial existente. Una cadena de dirección URL parcial como "mic" podría expandirse a "https://www.microsoft.com" o "https://www.microsoft.com/windows". La autocompletar se usa normalmente con controles de edición o con controles que tienen un control de edición incrustado, como el control ComboBoxEx .

Adición de la funcionalidad de autocompletar a la aplicación

Una aplicación puede agregar funcionalidad de autocompletar a un control de edición de dos maneras:

  • SHAutoComplete es una función simple que puede autocompletar una ruta de acceso o dirección URL de archivo.
  • La interfaz IAutoComplete se expone mediante el objeto autocompletar (CLSID_AutoComplete). Permite que las aplicaciones inicialicen, habiliten y deshabiliten el objeto . IAutoComplete permite un mayor control sobre los orígenes de autocompletar, incluida la capacidad de agregar un origen personalizado. En el resto de este tema se describe el uso de IAutoComplete. Consulte How To Enable Autocomplete Manually (Cómo habilitar autocompletar manualmente ) para obtener ejemplos de uso específicos.

Modos de autocompletar

Al usar IAutoComplete, la función autocompletar puede mostrar la cadena completada en dos modos: autoappend y autosuggest. Los modos son independientes; puede habilitar o ambos. Para especificar el modo, llame a IAutoComplete2::SetOptions.

Autoaplicación

En el modo de autoaplicación, la autocompletar anexa el resto de la cadena candidata más probable a los caracteres existentes, resaltando los caracteres anexados. Si el usuario sigue especificando caracteres, se agregan a la cadena parcial existente. Si el usuario agrega un carácter idéntico al siguiente carácter resaltado, el resaltado de ese carácter está desactivado. Los caracteres restantes se seguirán resaltando. Si el usuario agrega un carácter que no coincide con el siguiente carácter resaltado, la función autocompletar intenta generar una nueva cadena candidata basada en la cadena parcial más grande y anexa el resto de la nueva cadena candidata a la cadena parcial actual. Si no se encuentra ninguna cadena candidata, solo aparecen los caracteres con tipo y el cuadro de edición se comporta como lo haría sin autocompletar. Este proceso continúa hasta que el usuario acepta una cadena.

Autouggest

En el modo autosuggest, la autocompletar muestra una lista desplegable, con una o varias cadenas completas sugeridas, debajo del control de edición. El usuario puede seleccionar una de las cadenas sugeridas o continuar escribiendo. A medida que avanza la escritura, la lista desplegable puede modificarse en función de la cadena parcial actual. Si establece la marca ACO_SEARCH en IAutoComplete2::SetOptions, autocompletar proporciona una opción, en la parte inferior de la lista desplegable, para buscar la cadena parcial actual. Esta opción se muestra incluso si no hay ninguna cadena sugerida. Si el usuario selecciona la opción de búsqueda, la aplicación debe iniciar un motor de búsqueda para ayudar al usuario.

Uso de orígenes de autocompletar predefinidos

La autocompletar depende de tener un origen que le proporcione cadenas para que coincidan con la cadena parcial del usuario. Tiene la opción de proporcionar un origen de autocompletar personalizado, pero el sistema proporciona varios de los orígenes más comunes.

CLSID_ACLHistory

Origen de autocompletar que coincide con la lista de direcciones URL de la lista Historial del usuario.

CLSID_ACLMRU

Origen de autocompletar que coincide con la lista de direcciones URL de la lista Usado recientemente del usuario.

CLSID_ACListISF

Origen de autocompletar que coincide con los elementos del espacio de nombres de Shell: archivos en el equipo del usuario, así como elementos de carpetas virtuales, como Panel de control.

Hay ocasiones en las que, en lugar de liberar inmediatamente los recursos, es posible que desee conservar los punteros de interfaz a los distintos objetos implicados en la función de autocompletar. En concreto, esto se hace cuando se desea ajustar el comportamiento de autocompletar dinámicamente. La instancia más común de esto se produce cuando se usa el objeto CLSID_ACListISF, que autocompleta del espacio de nombres shell y tiene la opción (ACLO_CURRENTDIR) de enumerar también desde el directorio actual. Por ejemplo, al navegar a una nueva carpeta, Internet Explorer cambia el directorio actual de la barra de direcciones y, por tanto, la configuración debe cambiarse dinámicamente. Hay dos maneras de especificar el directorio que el objeto CLSID_ACListISF debe tratar como directorio actual:

En lo siguiente, suponga que pal es un puntero a la interfaz IACList de un objeto CLSID_ACListISF:

  • Uso de IPersistFolder:

    Para indicar al objeto CLSID_ACListISF que un ITEMIDLIST determinado debe tratarse como directorio actual, puede usar la interfaz IPersistFolder del objeto. Dado que ITEMIDLIST puede hacer referencia a una carpeta virtual, este método es más flexible que usar ICurrentWorkingDirectory.

    Tenga en cuenta que en los ejemplos siguientes se usa queryInterface templatized, que permite una lista de parámetros simplificada.

    IPersistFolder *ppf;
    
    hr = pal2->QueryInterface(IID_PPV_ARGS(&ppf));   
    if (SUCCEEDED(hr))
    {
        hr = ppf->Initialize(pidlCurrentDirectory);
        ppf->Release();
    }
    
  • Uso de ICurrentWorkingDirectory:

    Para proporcionar al objeto CLSID_ACListISF una ruta de acceso como directorio actual, puede usar la interfaz ICurrentWorkingDirectory del objeto.

    WCHAR pwszDirectory[MAX_PATH] = L"C:\\Program Files";
    ICurrentWorkingDirectory *pcwd;
    
    hr = pal2->QueryInterface(IID_PPV_ARGS(&pcwd));    
    if (SUCCEEDED(hr))
    {
        hr = pcwd->SetDirectory(pwszDirectory);
        pcwd->Release();
    }