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

Ваш аккаунт

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

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

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

Редактирование в TCppWebBrowser

11
24 сентября 2007 года
oxotnik333
2.9K / / 03.08.2007
Суть проблемы такая
TCppWebBrowser в режимме редактирования, выделяем кусок какого то текста, надо сделать с ним следующее:
1. Из простого текста сделать нумерованный/маркированный список и наоборот.
2. Получить доступ к формату текста (межстрочное расстояние, шрифты, и т.п.)

список делал через IHTMLTxtRange->pasteHTML(WideString("кусок HTML кода"));
работает, но не всегда правильно, т.е. вставляет тэги списка то в предыдущий текст, то в последующий, короче криво весьма, отсюда вопрос, нельзя ли каким либо методом делать это однозначно, там где выдедлил пользователь, а не как придется?
246
24 сентября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: oxotnik333

2. Получить доступ к формату текста (межстрочное расстояние, шрифты, и т.п.)


IHTMLTxtRange::queryCommandValue - ?

11
25 сентября 2007 года
oxotnik333
2.9K / / 03.08.2007
неправильно спросил...

попробую с другой стороны

есть объект IHTMLStyle
как перейти от IHTMLSelectionObject или IHTMLTxtRange к IHTMLStyle
пробовал через QueryInterfase ничего не получается...


и к стати, в чем глобальная разница:
IHTMLDocument2 *pDoc;
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2>pDoc(WB->Document);
CComPtr<IHTMLDocument2>pDoc;
как правильно объявлять?
246
25 сентября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: oxotnik333
неправильно спросил...

попробую с другой стороны

есть объект IHTMLStyle
как перейти от IHTMLSelectionObject или IHTMLTxtRange к
пробовал через QueryInterfase ничего не получается...


через IHTMLElement который просишь через IHTMLTxtRange::parentElement например
(IHTMLDocument2=>IHTMLSelectionObject=>IHTMLTxtRange=>IHTMLElement=>IHTMLStyle)

Цитата: oxotnik333

и к стати, в чем глобальная разница:
IHTMLDocument2 *pDoc;
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2>pDoc(WB->Document);
CComPtr<IHTMLDocument2>pDoc;
как правильно объявлять?


1. Указатель на интерфейс, чтобы инициализировать надо вызвать QueryInterfase, чтобы уничтожить надо вызвать Release
2. "Умный указатель" сам вызывает QueryInterfase и Release
3. тоже, что и 2 только надо звать QueryInterfase, Release не нужно.
Вроде так, просто загляни в исходники ATLи сам все увидишь.

11
26 сентября 2007 года
oxotnik333
2.9K / / 03.08.2007
Про parentElement я давно догадался....
только если это просто текст в середине документа, в parentElement попадает все <BODY> и получается я выделяю для редактирования кусок текста, а мне меняется весь текст...
так же пробовал через IHTMLDocument2::get_all(), тут не знаю как из IHTMLElementCollection вытащить конкретный элемент, т.к. ни name ни id на каждый тэг не проставишь
как непосредственно из IHTMLSelectionObject вытянуть IHTMLStyle?

и паралельно вопрос возник:
в хтмл старинице есть видео (ави-шный файл) если открывать просто ИЕ сверху вылазит надписть по поводу безопасности... в TCppWebBrowser-e не вылазит, однако ОС все равно блокирует содержимое, в результате exeption вылазит: "windows NT users: Please note that having the WinIce/SoftIce servce installed that you are running a debuger!"
снял све настройки безопастности в ИЕ, и все равно такая же беда.
Как обойти?
246
27 сентября 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: oxotnik333
Про parentElement я давно догадался....
только если это просто текст в середине документа, в parentElement попадает все <BODY> и получается я выделяю для редактирования кусок текста, а мне меняется весь текст...


вот что выделяешь, то и меняется

Код:
IHTMLDocument2* pDoc = NULL;
    IHTMLSelectionObject* pSel = NULL;
    IHTMLElement* pElem = NULL;

    if( WB->Document )
    {
        WB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc);

        if( pDoc )
        {
            pDoc->get_selection(&pSel);
            pDoc->Release();
            if (pSel)
            {
                IDispatch* pRange;
                pSel->createRange(&pRange);
                pSel->Release();
                IHTMLTxtRange* pTxtRange = NULL;
                pRange->QueryInterface(IID_IHTMLTxtRange, (LPVOID*)&pTxtRange);
                TVariant vcolor(clGreen); VARIANT_BOOL bresult = VARIANT_FALSE;
                pTxtRange->execCommand(L"BackColor",VARIANT_FALSE,vcolor ,&bresult);
                pTxtRange->Release();

            }// end if (pSel)
        }// end if( pDoc )
    }// end if( WB->Document )


Цитата: oxotnik333

и паралельно вопрос возник:
в хтмл старинице есть видео (ави-шный файл) если открывать просто ИЕ сверху вылазит надписть по поводу безопасности... в TCppWebBrowser-e не вылазит, однако ОС все равно блокирует содержимое, в результате exeption вылазит: "windows NT users: Please note that having the WinIce/SoftIce servce installed that you are running a debuger!"
снял све настройки безопастности в ИЕ, и все равно такая же беда.
Как обойти?


хз...

11
27 сентября 2007 года
oxotnik333
2.9K / / 03.08.2007
дык не в этом вопрос...
execCommand не может и половины действий по фрматированию текста
мне в частности нужно: IHTMLStyle::lineHeight, IHTMLStyle::fontSize, IHTMLStyle::fontWeight... и много чего другого ДЛЯ ВЫДЕЛЕННЫХ ОБЪЕКТОВ!
11
28 сентября 2007 года
oxotnik333
2.9K / / 03.08.2007
Код:
TMenuItem *itm = (TMenuItem*) Sender;
  AnsiString pers;
  if (itm->Name == "N101") pers = "100%";
  if (itm->Name == "N151") pers = "150%";
  if (itm->Name == "N201") pers = "200%";
  if (itm->Name == "N251") pers = "250%";

  CComPtr<IHTMLDocument2>spDoc;
  CComPtr<IHTMLSelectionObject>spSelObj;
  CComPtr<IHTMLTxtRange>spTxtRng;
  CComPtr<IHTMLElement>spEl;
  WB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&spDoc);
  BSTR html, txt, p_tag, o_html;
  spDoc->get_selection(&spSelObj);
  CComPtr<IHTMLStyle>spStl;
  spSelObj->createRange((IDispatch**)&spTxtRng);
  CComPtr<IHTMLCurrentStyle>spCurStl;
  spTxtRng->QueryInterface(IID_IHTMLCurrentStyle, (LPVOID*)&spCurStl);
  spTxtRng->parentElement(&spEl);

  spEl->get_tagName(&p_tag);
  AnsiString tg = p_tag;
  if (tg != "SPAN")
     {
       spEl = NULL;
       spDoc->createElement(CComBSTR(OLESTR("SPAN")), &spEl);
     }

  spTxtRng->get_htmlText(&html);
  spEl->put_innerHTML(html);

  CComPtr<IHTMLElementCollection>spElCol;
  spEl->get_children((IDispatch**)&spElCol);

  long ln;
  spElCol->get_length(&ln);
  for (long i=0; i<ln; i++)
      {
        TVariant ind(i);
        CComPtr<IHTMLElement>spEl2;
        CComPtr<IDispatch>spDisp;
        spElCol->item(ind,ind, (IDispatch**)&spDisp);
        spDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&spEl2);
        spStl = NULL;
        spEl2->get_style(&spStl);
        VARIANT v;
        v.vt = VT_BSTR;
        v.bstrVal = WideString(pers);
        spStl->put_lineHeight(v);
        spEl->put_className(WideString("MsoNormal"));
      }

  spEl->get_innerHTML(&o_html);
  spTxtRng->pasteHTML(o_html);


сюда можно запихивать значение по желанию v.bstrVal = WideString("180%");
и с "windows NT users: Please note that having the WinIce/SoftIce servce installed that you are running a debuger!"
разобрался... оказывается 2 дебагера MS VS и BCB меж собой не могут договориться как дебагить...
в дебаг-моде вылазит ошибка, а когда просто exe-шник пускаешь, все ОК!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог