IAutoComplete пользовательский источник с IEnumString - PullRequest
3 голосов
/ 12 октября 2011

Я пытаюсь реализовать автоматическое предложение для comboxbox (win32, c ++) или элемента управления редактирования.Но я не знаю, как правильно использовать интерфейс IAutoComplete.Мне нужен пользовательский список строк, из которых должны быть взяты совпадения для автоматического предложения.Но как реализовать это с IEnumString?Я нашел эту ссылку, но она не раскрывает все: http://msdn.microsoft.com/en-us/library/windows/desktop/hh127437%28v=vs.85%29.aspx

Кто-нибудь когда-либо реализовывал это?Спасибо заранее Майкл

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Как я уже отмечал в своем комментарии, у ATL есть один предварительно написанный для вас.

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

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

Этот код был в основном украден из документации CComEnum .

1 голос
/ 13 октября 2011

Хорошо, с помощью всех ответов я дошел до этого:

            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 * pes. Предположим, у меня есть такой массив:

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

Теперь я хочу, чтобы эти строки были вставлены в метод pes-> Init (...). Как на самом деле здесь происходит преобразование в LPOLESTR? Метод Init (...) указывает на начало и конец этого массива. Конец должен быть на одну позицию ПОСЛЕ последнего элемента массива, так будет ли здесь myArray [3]? Я просто спрашиваю, потому что я думаю, что это на самом деле за пределами этого массива?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...