2011-10-12 39 views
2

我想實現一個comboxbox(win32,C++)或編輯控件的自動建議。但我不知道如何正確使用IAutoComplete接口。我需要一個字符串自定義列表,其中自動建議的匹配應該從中提取。但如何實現這與IEnumString?我發現這個鏈接,但它不透露一切:http://msdn.microsoft.com/en-us/library/windows/desktop/hh127437%28v=vs.85%29.aspxIAutoComplete自定義源與IEnumString

有沒有人執行過這個? Thx提前 邁克爾

+0

這也許是延續http://stackoverflow.com/questions/7728103/custom-combobox-win32 –

+0

是的。我不明白它是如何實現的,所以我需要示例代碼。 – Michbeckable

+0

IAutoComplete和WTL對話框的自定義IEnumString實現http://www.codeproject.com/KB/wtl/customautocomplete_wtl.aspx –

回答

4

正如我在我的評論中指出的,ATL有一個預先爲您寫的。

typedef CComEnum<IEnumString, 
       &IID_IEnumString, 
       LPOLESTR, 
       _Copy<LPOLESTR> > CComEnumString; 

CComObject<CComEnumString> *pes; 
HRESULT hr = CComObject<CComEnumString>::CreateInstance(&pes); 

該代碼基本上從the CComEnum documentation被盜。

+0

它非常有幫助,thx!但我怎麼能初始化數組與字符串通過pes->初始化(...? – Michbeckable

+1

我會讓你弄清楚。 –

1

好了,所有的答案的幫助下,我得到了它迄今:

  IAutoComplete *pac; 

     HRESULT hr = CoCreateInstance(CLSID_AutoComplete, 
             NULL, 
             CLSCTX_INPROC_SERVER, 
             IID_PPV_ARGS(&pac)); 

     typedef CComEnum<IEnumString, 
      &IID_IEnumString, 
      LPOLESTR, 
      _Copy<LPOLESTR> > CComEnumString; 

     CComObject<CComEnumString> *pes; 
     HRESULT hRes = CComObject<CComEnumString>::CreateInstance(&pes); 

     // hRes = pes->Init(

     IUnknown* pUnk; 
     hRes = pes->QueryInterface(IID_IEnumString, (void**) &pUnk); 

     pac->Init(hEdit, pUnk, NULL, NULL); 

     // maybe we release ? 
     pUnk->Release(); 

     IAutoComplete2 *pac2; 

     if (SUCCEEDED(pac->QueryInterface(IID_IAutoComplete2, (LPVOID*)&pac2))) 
     { 
      pac2->SetOptions(ACO_AUTOSUGGEST); 
      pac2->Release(); 
     } 

只有一個剩下的事情:

的CComObject * PE的初始化。讓我們假設我有這樣一個數組:

std::string myArray[] = { string("abc"), string("foo"), string("muh") }; 

現在我希望這些字符串被塞入到pes-> Init(...)方法中。如何在這裏實際轉換爲LPOLESTR? Init(...)方法指向這個數組的開始和結束的指針。最後應該是BEYOND最後一個數組元素的位置,那麼這是myArray [3]在這裏?我只是問,因爲我認爲這實際上超出了這個陣列的範圍?

非常感謝!