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);
Выделенные теги в IHTMLElementCollection
Нужна помощь по интерфейсам и MSHTML.
Вот этот код например выводит названия ВСЕХ тегов HTML документа в WebBrowser'е (который у меня в режиме редактирования).
Код:
Но мне надо только теги выделенной части визуального редактора. Для возврата 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;
}
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'е найти у меня не выходит....
Это необходимо для редактирования свойств тегов.
Вот пример:
Код:
IHTMLElement *pSelEle;
wchar_t *tag_name;
if(SUCCEEDED(Editor->get_activeElement(&pSelEle)))
{
pSelEle->get_tagName(&tag_name);
ShowMessage(String(tag_name));
}
wchar_t *tag_name;
if(SUCCEEDED(Editor->get_activeElement(&pSelEle)))
{
pSelEle->get_tagName(&tag_name);
ShowMessage(String(tag_name));
}
Код:
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;
}
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;
}