Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выделенные теги в IHTMLElementCollection

20K
16 октября 2011 года
_Taurus_
24 / / 30.08.2007
Доброго времени суток.
Нужна помощь по интерфейсам и 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'е найти у меня не выходит....
Это необходимо для редактирования свойств тегов.
20K
18 октября 2011 года
_Taurus_
24 / / 30.08.2007
Проблема решилась несколько по другому.
Вот пример:
 
Код:
IHTMLElement *pSelEle;
wchar_t *tag_name;
if(SUCCEEDED(Editor->get_activeElement(&pSelEle)))
    {
        pSelEle->get_tagName(&tag_name);
        ShowMessage(String(tag_name));
    }
20K
30 октября 2011 года
_Taurus_
24 / / 30.08.2007
Улучшенный вариант функции. Так как элемент в режиме редактирования становится активным не по выделению оного, а по двойному щелчку - переходу в режим редактирования (активность по совместительству), то я наваял более сложный но код который выдает ссылку на первый выделенный 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;
}

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог