如何手动启用自动完成

若要更详细地控制自动完成行为,或添加自动完成字符串的自定义源,必须自行管理自动完成对象。 可以通过以下方式手动启用自动完成。

Instructions

创建简单的自动完成对象

以下步骤演示如何创建和初始化简单的自动完成对象。 简单的自动完成对象完成来自单个源的字符串。 此示例中有意省略了错误检查。

  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 接口的对象来编写自己的自动完成源。 对象还可以选择实现 IACListIACList2 接口。

    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 Explorer 地址栏使用复合自动完成对象,因为用户可能开始键入文件名或 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();