Включение автозаполнения вручную

Чтобы получить более подробный контроль над поведением автозаполнения или добавить пользовательский источник строк автозаполнения, необходимо управлять объектом автозаполнения самостоятельно. Автозавершение можно включить вручную следующими способами.

Инструкции

Создание простого объекта автозаполнения

Ниже показано, как создать и инициализировать простой объект автозаполнения. Простой объект автозаполнения завершает строки из одного источника. В этом примере намеренно опущена проверка ошибок.

  1. Создайте объект автозаполнения.

    IAutoComplete *pac;
    
    HRESULT hr = CoCreateInstance(CLSID_AutoComplete, 
                                    NULL, 
                                  CLSCTX_INPROC_SERVER,
                                  IID_PPV_ARGS(&pac));
    
  2. Создайте источник автозаполнения. Можно использовать предопределенный источник автозаполнения или написать собственный пользовательский источник.

    В следующем коде используется один из предопределенных источников автозаполнения.

    IUnknown *punkSource;
    
    hr = CoCreateInstance(CLSID_ACListISF, 
                          NULL, 
                          CLSCTX_INPROC_SERVER,
                          IID_PPV_ARGS(&punkSource));
    

    В следующем коде используется пользовательский источник автозаполнения. Вы можете написать собственный источник автозаполнения, реализовав объект, предоставляющий интерфейс IEnumString . Объект также может при необходимости реализовать интерфейсы IACList и IACList2 .

    CCustomAutoCompleteSource *pcacs = new CCustomAutoCompleteSource();
    
    hr = pcacs->QueryInterface(IID_PPV_ARGS(&punkSource));
    if(SUCCEEDED(hr))
    {
        // ...
    }
    
    pcacs->Release();
    
  3. Задайте параметры в источнике автозаполнения (необязательно).

    Вы можете настроить поведение источника автозаполнения, задав его параметры, если источник предоставляет интерфейс IACList2 . При использовании предопределенных источников автозаполнения только CLSID_ACListISF экспортирует IACList2. Полный список параметров и их значений см. в разделе IACList2::SetOptions.

    IACList2 *pal2;
    
    hr = punkSource->QueryInterface(IID_PPV_ARGS(&pal2));
    if (SUCCEEDED(hr))
    {
        hr = pal2->SetOptions(ACLO_FILESYSONLY);
        pal2->Release();
    }
    
  4. Инициализируйте объект автозаполнения.

    В этом примере hwndEdit — это дескриптор окна управления редактированием, для которого необходимо включить автозавершение. Описание последних двух неиспользуемых параметров см. в разделе IAutoComplete::Init .

    hr = pac->Init(hwndEdit, punkSource, NULL, NULL);
    
  5. Задайте параметры объекта автозаполнения (необязательно).

    Поведение объекта автозаполнения можно настроить, задав его параметры. Полный список параметров и их значений см. в документации по IACList2::SetOptions.

    IAutoComplete2 *pac2;
    
    hr = pac->QueryInterface(IID_PPV_ARGS(&pac2));
    
    if (SUCCEEDED(hr))
    {
        hr = pac2->SetOptions(ACO_AUTOSUGGEST);
        pac2->Release();
    }
    
  6. Отпустите объекты .

    Примечание

    Объект автозаполнения остается прикрепленным к элементу управления редактированием даже после его освобождения. Если вы предвидите необходимость доступа к этим объектам позже ( например, если вы захотите изменить параметры автозаполнения позже), вы не будете освобождать их на этом этапе.

     

    punkSource->Release();
    pac->Release();
    

Создание составного объекта автозаполнения

Составной объект автозаполнения соответствует строкам из нескольких источников. Например, адресная строка Windows Internet Обозреватель использует составной объект автозаполнения, так как пользователь может начать вводить имя файла или URL-адрес. Большинство шагов, связанных с созданием составного объекта автозаполнения, идентичны шагам, описанным в разделе Создание простого объекта автозаполнения. Эти шаги обозначены как таковые.

  1. Создайте объект автозаполнения. Это то же самое, что и шаг 1 выше.

  2. Создайте диспетчер составных исходных объектов автозаполнения.

    Составной исходный объект автозаполнения позволяет объединить несколько источников автозаполнения в один источник автозаполнения.

    IObjMgr *pom;
    
    hr = CoCreateInstance(CLSID_ACLMulti, 
                          NULL, 
                          CLSCTX_INPROC_SERVER,
                          IID_PPV_ARGS(&pom));
    
  3. Создание и настройка параметров для каждого источника автозаполнения. Повторите шаги 2 и 3 выше для каждого источника.

  4. Присоединяйте каждый источник автозаполнения к диспетчеру исходных объектов.

    hr = pom->Append(punkSource1);
    hr = pom->Append(punkSource2);
    
  5. Инициализируйте объект автозаполнения.

    Это то же самое, что и в шаге 4 выше, за исключением того, что вместо передачи простого источника автозаполнения в IAutoComplete::Init передается составной диспетчер исходных объектов.

    hr = pac->Init(hwndEdit, pom, NULL, NULL);
    
  6. Задайте параметры объекта автозаполнения. Это то же самое, что и шаг 5 выше.

  7. Отпустите объекты .

    Как и в простом случае, вы можете освободить объекты сразу после их использования, но вы также можете сохранить их для изменения параметров позже.

    pac->Release();
    pom->Release();
    
    // Release each individual source.
    punkSource1->Release(); 
    punkSource2->Release();