IE 位址列、檔案開啟對話框的自動完成功能(輸入字元即顯示匹配下拉清單)極具實用價值。微軟提供 IAutoComplete COM 介面(位於 shell32.dll 5.0+,僅 Windows 2000 以上支援),需搭配 IEnumString 實作字串列舉器。但跨版本相容性差、COM 程式碼繁瑣。本文提出純 C++ 實作的 CAutoComplete 類別,無需 COM、支援所有 Windows 版本(含 Win 3.1),易於整合擴展。
class CMyDialog : public CDialog {
protected:
CAutoComplete m_acEdit; // 編輯方塊實例
CAutoComplete m_acCombo; // 組合方塊實例
};
BOOL CMyDialog::OnInitDialog() {
m_acCombo.Init(GetDlgItem(IDC_COMBO1));
m_acEdit.Init(GetDlgItem(IDC_EDIT1));
static LPCTSTR STRINGS[] = { "alpha", "alphabet", ..., NULL };
for (int i = 0; STRINGS[i]; i++) {
m_acCombo.GetStringList().Add(STRINGS[i]);
m_acEdit.GetStringList().Add(STRINGS[i]);
}
return TRUE;
}
使用者輸入 "b" 時,編輯方塊自動補全顯示 "bata"(高亮 "ata"),組合方塊下拉顯示所有匹配項。
CSubclassWnd:通用視窗子類化基類,攔截目標視窗訊息,路由至虛擬函式 WindowProc。EN_CHANGE(編輯方塊)、CBN_EDITCHANGE(組合方塊)。OnComplete 實作:比對使用者輸入與內部字串表,匹配則更新控制項文字或下拉清單。SetWindowText 前必須暫時停用自身攔截,否則會觸發新的 CHANGE 通知導致失控。IgnoreCompletion 偵測輸入長度變短並回傳 TRUE 以跳過補全。OnComplete → GetMatches → OnFirstString/OnNextString/OnMatchString → DoCompletion。每層可獨立覆寫,支援自訂資料來源(資料庫、檔案、網路)、自訂匹配邏輯、自訂顯示方式。| 特性 | IAutoComplete (Shell) | CAutoComplete (自製) |
|---|---|---|
| OS 相容性 | Win 2000+ | 所有 Windows 版本 |
| 相依性 | shell32.dll 5.0+, COM | 無(純 C++,單一檔案) |
| 快速完成格式字串 | 支援 (Ctrl+Enter) | 未內建,可擴展 |
| 註冊表儲存格式 | 支援 | 未內建,可擴展 |
| 擴展彈性 | 受限於介面定義 | 虛擬函式全方位可覆寫 |
| 部署複雜度 | 需註冊 DLL、處理版本 | 直接加入專案編譯 |
結論:若需 IE 風格特定功能且目標環境固定,IAutoComplete 較適合;追求跨版本相容、輕量部署、高度客製化,CAutoComplete 為優選。