Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделенные теги в IHTMLElementCollection 
:(
    Опции темы
iDESTRUCTOR
  Дата 16.10.2011, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.9.2011

Репутация: нет
Всего: нет



Доброго времени суток.
Нужна помощь по интерфейсам и MSHTML.
Вот этот код например выводит названия ВСЕХ тегов HTML документа в WebBrowser'е (который у меня в режиме редактирования).

Код

IHTMLElementCollection *pCollection;
IHTMLElement *pElement;
IDispatch *pDisp;
wchar_t *tag_name;
String all_tags;
Editor->get_all(&pCollection); //Editor - IHTMLDocument2 *editor; объявлен выше в коде.
long n;
pCollection->get_length(&n);
for(int i = 0; i < n; i++)
{
    TVariant id = i;
    pCollection->item(id,id,&pDisp);
    pDisp->QueryInterface(IID_IHTMLElement,(VOID**)&pElement);
    pDisp->Release();
    pElement->get_tagName(&tag_name);
    all_tags +=String(tag_name);
    all_tags +='\n';
}
ShowMessage(all_tags);

 
Но мне надо только теги выделенной части визуального редактора. Для возврата HTML кода из выделенного текста в визуальном редакторе я использую такой код:

Код

HRESULT TMainForm::GetRangeFromSelection(IHTMLTxtRange **ppRange) {
    IHTMLSelectionObject *pSel = 0;
    IDispatch *pID = 0;
    HRESULT hr = E_FAIL;
    if (ppRange == NULL)
        return E_INVALIDARG;
    *ppRange = NULL;
    if (Editor) {
        Editor->get_selection(&pSel);
        if (pSel) {
            pSel->createRange(&pID);
            if (pID) {
                hr = pID->QueryInterface(IID_IHTMLTxtRange, (LPVOID*)ppRange);
                pID->Release();
            }
            pSel->Release();
        }
    }
    return hr;
}


 Увы при вызове интерфейса (hr = pID->QueryInterface(IID_IHTMLTxtRange, (LPVOID*)ppRange);) но уже с использованием гайда  IID_IHTMLElementCollection в ppRange (он тоже к слову уже IHTMLElementCollection **ppRange)  в интерфейс ppRange возвращается NULL.
Соответственно массив из выделенных элементов в WebBrowser'е найти у меня не выходит....
Это необходимо для редактирования свойств тегов.
PM MAIL   Вверх
iDESTRUCTOR
Дата 18.10.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.9.2011

Репутация: нет
Всего: нет



Проблема решилась несколько другим методом:
Вот пример может кому будет полезен:

Код

IHTMLElement *pSelEle;
wchar_t *tag_name;
if(SUCCEEDED(Editor->get_activeElement(&pSelEle)))
    {
        pSelEle->get_tagName(&tag_name);
        ShowMessage(String(tag_name));
    }

PM MAIL   Вверх
iDESTRUCTOR
Дата 29.10.2011, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.9.2011

Репутация: нет
Всего: нет



Улучшенный вариант функции. Так как элемент в режиме редактирования становится активным не по выделению оного, а по двойному щелчку - переходу в режим редактирования (активность по совместительству), то я наваял более сложный но код который выдает ссылку на первый выделенный IHTMLElement. Может кому пригодится...
Код

HRESULT TMainForm::FirstSelectedControl(IHTMLElement **ppElement) {
    wchar_t *sel_type;
    long len;
    IHTMLSelectionObject *objSelection = NULL;
    IDispatch *pDisp = NULL;
    IHTMLControlRange *objRange = NULL;
    HRESULT hr = E_FAIL;
    if (Editor) {
        if (SUCCEEDED(Editor->get_selection(&objSelection))) {
            objSelection->get_type(&sel_type);
            if (!strcmp(AnsiString(sel_type).c_str(), "Control")) {
                if (SUCCEEDED(objSelection->createRange(&pDisp)))
                    if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLControlRange,
                                (VOID * *) & objRange))) {
                        objRange->get_length(&len);
                        if (len > 0) {
                            hr = objRange->item(0, ppElement);
                            pDisp->Release();
                        }
                        else
                            return E_FAIL;
                    }
                    else
                        return E_FAIL;
                else
                    return E_FAIL;
            }
            if ((!strcmp(AnsiString(sel_type).c_str(), "None")) || !strcmp
                (AnsiString(sel_type).c_str(), "Text")) {
                ObjectPanel->Collapse();
                ObjectPanel->Enabled = false;
            }
            else {
                ObjectPanel->Expand();
                ObjectPanel->Enabled = true;
            }
        }
        else
            return E_FAIL;
        return hr;
    }
    else
        return E_FAIL;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0409 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.