如何手动启用自动完成
若要更详细地控制自动完成行为,或添加自动完成字符串的自定义源,必须自行管理自动完成对象。 可以通过以下方式手动启用自动完成。
Instructions
创建简单的自动完成对象
以下步骤演示如何创建和初始化简单的自动完成对象。 简单的自动完成对象完成来自单个源的字符串。 此示例中有意省略了错误检查。
创建自动完成对象。
IAutoComplete *pac; HRESULT hr = CoCreateInstance(CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pac));
创建自动完成源。 可以使用 预定义的自动完成源 ,也可以编写自己的自定义源。
以下代码使用预定义的自动完成源之一。
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();
设置自动完成源上的选项 (可选) 。
如果源公开了 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(); }
初始化自动完成对象。
在此示例中, hwndEdit 是要为其启用自动完成的编辑控件窗口的句柄。 有关最后两个未使用参数的说明,请参阅 IAutoComplete::Init 。
hr = pac->Init(hwndEdit, punkSource, NULL, NULL);
(可选) 设置自动完成对象的选项。
可以通过设置自动完成对象的选项来自定义其行为。 有关选项及其值的完整列表,请参阅 IACList2::SetOptions 的文档。
IAutoComplete2 *pac2; hr = pac->QueryInterface(IID_PPV_ARGS(&pac2)); if (SUCCEEDED(hr)) { hr = pac2->SetOptions(ACO_AUTOSUGGEST); pac2->Release(); }
释放对象。
注意
自动完成对象在释放后仍会附加到编辑控件。 如果预计以后需要访问这些对象(例如,如果要在以后更改自动完成选项),则无需在此时释放它们。
punkSource->Release(); pac->Release();
创建复合自动完成对象
复合自动完成对象与来自多个源的字符串匹配。 例如,Windows Internet Explorer 地址栏使用复合自动完成对象,因为用户可能开始键入文件名或 URL。 创建复合自动完成对象所涉及的大多数步骤都与“创建简单的自动完成对象”中的步骤相同。这些步骤就是这样指示的。
创建自动完成对象。 这与上面的步骤 1 相同。
创建自动完成复合源对象管理器。
自动完成复合源对象允许将多个自动完成源组合成单个自动完成源。
IObjMgr *pom; hr = CoCreateInstance(CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pom));
为每个自动完成源创建和设置选项。 对每个源重复上述步骤 2 和 3。
将每个自动完成源附加到源对象管理器。
hr = pom->Append(punkSource1); hr = pom->Append(punkSource2);
初始化自动完成对象。
这与上面的步骤 4 相同,只是传递复合源对象管理器,而不是将简单的自动完成源传递给 IAutoComplete::Init。
hr = pac->Init(hwndEdit, pom, NULL, NULL);
设置自动完成对象的选项。 这与上面的步骤 5 相同。
释放对象。
与简单情况一样,可以在使用完对象后立即释放对象,但也可以保留它们以在以后更改选项。
pac->Release(); pom->Release(); // Release each individual source. punkSource1->Release(); punkSource2->Release();