首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

編輯方塊自動完成功能:IAutoComplete 介面 vs 自製 CAutoComplete 類別

     編輯:關於VC++

IE 位址列、檔案開啟對話框的自動完成功能(輸入字元即顯示匹配下拉清單)極具實用價值。微軟提供 IAutoComplete COM 介面(位於 shell32.dll 5.0+,僅 Windows 2000 以上支援),需搭配 IEnumString 實作字串列舉器。但跨版本相容性差、COM 程式碼繁瑣。本文提出純 C++ 實作的 CAutoComplete 類別,無需 COM、支援所有 Windows 版本(含 Win 3.1),易於整合擴展。

CAutoComplete 使用範例

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 實作:比對使用者輸入與內部字串表,匹配則更新控制項文字或下拉清單。

三大關鍵技巧

  1. 避免遞迴觸發:呼叫 SetWindowText 前必須暫時停用自身攔截,否則會觸發新的 CHANGE 通知導致失控。
  2. 忽略刪除操作時的自動完成:使用者按 Backspace 刪除高亮部分時,不應再次觸發補全。虛擬函式 IgnoreCompletion 偵測輸入長度變短並回傳 TRUE 以跳過補全。
  3. 模組化虛擬函式設計:OnComplete → GetMatches → OnFirstString/OnNextString/OnMatchString → DoCompletion。每層可獨立覆寫,支援自訂資料來源(資料庫、檔案、網路)、自訂匹配邏輯、自訂顯示方式。

IAutoComplete vs CAutoComplete 比較

特性IAutoComplete (Shell)CAutoComplete (自製)
OS 相容性Win 2000+所有 Windows 版本
相依性shell32.dll 5.0+, COM無(純 C++,單一檔案)
快速完成格式字串支援 (Ctrl+Enter)未內建,可擴展
註冊表儲存格式支援未內建,可擴展
擴展彈性受限於介面定義虛擬函式全方位可覆寫
部署複雜度需註冊 DLL、處理版本直接加入專案編譯

結論:若需 IE 風格特定功能且目標環境固定,IAutoComplete 較適合;追求跨版本相容、輕量部署、高度客製化,CAutoComplete 為優選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved