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 )
Редактирование в TCppWebBrowser
TCppWebBrowser в режимме редактирования, выделяем кусок какого то текста, надо сделать с ним следующее:
1. Из простого текста сделать нумерованный/маркированный список и наоборот.
2. Получить доступ к формату текста (межстрочное расстояние, шрифты, и т.п.)
список делал через IHTMLTxtRange->pasteHTML(WideString("кусок HTML кода"));
работает, но не всегда правильно, т.е. вставляет тэги списка то в предыдущий текст, то в последующий, короче криво весьма, отсюда вопрос, нельзя ли каким либо методом делать это однозначно, там где выдедлил пользователь, а не как придется?
Цитата: oxotnik333
2. Получить доступ к формату текста (межстрочное расстояние, шрифты, и т.п.)
IHTMLTxtRange::queryCommandValue - ?
попробую с другой стороны
есть объект IHTMLStyle
как перейти от IHTMLSelectionObject или IHTMLTxtRange к IHTMLStyle
пробовал через QueryInterfase ничего не получается...
и к стати, в чем глобальная разница:
IHTMLDocument2 *pDoc;
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2>pDoc(WB->Document);
CComPtr<IHTMLDocument2>pDoc;
как правильно объявлять?
Цитата: oxotnik333
неправильно спросил...
попробую с другой стороны
есть объект IHTMLStyle
как перейти от IHTMLSelectionObject или IHTMLTxtRange к
пробовал через QueryInterfase ничего не получается...
попробую с другой стороны
есть объект 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и сам все увидишь.
только если это просто текст в середине документа, в 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!"
снял све настройки безопастности в ИЕ, и все равно такая же беда.
Как обойти?
Цитата: oxotnik333
Про parentElement я давно догадался....
только если это просто текст в середине документа, в parentElement попадает все <BODY> и получается я выделяю для редактирования кусок текста, а мне меняется весь текст...
только если это просто текст в середине документа, в parentElement попадает все <BODY> и получается я выделяю для редактирования кусок текста, а мне меняется весь текст...
вот что выделяешь, то и меняется
Код:
Цитата: oxotnik333
и паралельно вопрос возник:
в хтмл старинице есть видео (ави-шный файл) если открывать просто ИЕ сверху вылазит надписть по поводу безопасности... в TCppWebBrowser-e не вылазит, однако ОС все равно блокирует содержимое, в результате exeption вылазит: "windows NT users: Please note that having the WinIce/SoftIce servce installed that you are running a debuger!"
снял све настройки безопастности в ИЕ, и все равно такая же беда.
Как обойти?
хз...
execCommand не может и половины действий по фрматированию текста
мне в частности нужно: IHTMLStyle::lineHeight, IHTMLStyle::fontSize, IHTMLStyle::fontWeight... и много чего другого ДЛЯ ВЫДЕЛЕННЫХ ОБЪЕКТОВ!
Код:
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);
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-шник пускаешь, все ОК!!!