我通過 IHTMLDocument2 接口生成和插入新的元素,可是,由於我使用的是 insertAdjacentHTML ,插入的元素素要不被置於當前元素的結尾,要不就在當前元素的開頭,但我想要的效果是將新元素(我衹要 image )插入到當前位置上(如果當前元素是文字,則把文字截斷插入我的元素)我google了很多資料,大家都說用 IMarkupServices, 網上也有一些例子,我沒有全看懂,似乎都是用它來 highlight 一些文字的。請問有沒有利用 IMarkupServices 在當前位置插入新元素的例子?

解决方案 »

  1.   

    CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDoc=(IHTMLDocument2 *)m_ie.GetDocument();
    if(!pDoc)return;
    VARIANT_BOOL vbb;
    pDoc->execCommand(CComBSTR("InsertImage"),0,CComVariant("file:///D:/0010.gif"),&vbb);
      

  2.   

    謝謝回复,但其實我要插入的不止是image,image 衹是其中一個例子。我後來找了很久,終於找到了下面的代碼// initialization 
    // spDoc is IHTMLDocument2
    CComPtr<IMarkupServices> pMS;
    CComPtr<IMarkupContainer> pMarkup;
    CComPtr<IMarkupPointer> pPtr;
    CComPtr<IDisplayServices> pDispServices;
    CComPtr<IHTMLCaret> spCaret; spDoc->QueryInterface(IID_IMarkupContainer, (void **)&pMarkup);
    spDoc->QueryInterface(IID_IMarkupServices, (void **)&pMS);
    pMS->CreateMarkupPointer(&pPtr);
    spDoc->QueryInterface(IID_IDisplayServices, (void **)&pDispServices);CComPtr<IHTMLElement> newElem; 
    pDispServices->GetCaret(&spCaret);
    spCaret->MoveMarkupPointerToCaret(pPtr);// _HTML_for_img 是 img 的 HTML 代碼。對其它 element, 修改第一個參數,填入相應的 ID,
    // 當然 HTML 也要修改了
    pMS->CreateElement(TAGID_IMG, CComBSTR(_HTML_for_img), &newElem);
    pMS->InsertElement(newElem, pPtr, pPtr);這段代碼可以將圖片或其它單個element 插入到當前位置上,但如果 newElemt 是复合型的,例如<div><img src="..."></img></div>則無法直接插入。以 (div><img src="..."></img></div>) 為例,我試過幾種方法,但還是不行1) 用 node
      CComPtr<IHTMLElement> imgElem;
      pMS->CreateElement(TAGID_DIV, CComBSTR(HTML_for_div), &newElem); // 生成一個 div element
      pMS->CreateElement(TAGID_IMG, CComBSTR(HTML_for_img), &imgElem); // 生成一個 img element  CComPtr<IHTMLDOMNode> thisNode, childNode, retNode;
      newElem->QueryInterface( IID_IHTMLDOMNode, (void **)&thisNode );   // 取得 div 的 node
      imgElem->QueryInterface( IID_IHTMLDOMNode, (void **)&childNode );  // 取得 img 的 node
      thisNode->appendChild( childNode, &retNode ); // 將 img 加到 div 裡面,返回 retNode
      retNode->QueryInterface( IID_IHTMLElement, (void **)&newElem ); // 返回 retNode 對應的 element
      
      pMS->InsertElement(newElem, pPtr, pPtr); // 此時插入為空,如果把 appendChild 注解掉,測可以插入一個空的div2) 先生成 div element,把它的 innerHTML 換成 HTML_for_img,然後用 pMS->InsertElement 插入,但這還是失敗3) 先用 pMS->InsertElement 將 div 插入,再利用 IMarkupServices 生成另一個 img element 然後用 pMS->InsertElement 插入,但這樣得的結果是<div></div><img src="..."></img>而不是我想畏的<div><img src="..."></img></div>請各位給點意見,看哪裡出錯了?特別是利用 Node 的方法,我檢查過所有返回值,沒有發現錯誤,實在不知道怎樣處理才對 :(
      

  3.   

    InsertElement(divElemdivElem->divnodedivnode->appendChild(imgnode
      

  4.   

    或者也可//-------------------------------------
    1.先用 pMS->InsertElement 將 div elem插入
    //--------------------------------------
    2.再
    CComPtr<IHTMLElement2> uuu;
    if(div elem.QueryInterface(&uuu)==S_OK)
    {
    uuu->applyElement(imgelem,L"inside",0);
    }
      

  5.   

    謝謝。我試過了,檢查所有返回值都是 S_OK 的,而且 pMS->InsertElement  能正確插入 div,就是uuu->applyElement插入不了
      

  6.   

    CComPtr<IHTMLElement> uuu1;
    CComPtr<IHTMLElement> uuu2;
    pdoc2->createElement(CComBSTR("div"),&uuu1);
    uuu1->put_innerHTML(L"&nbsp;");
    pdoc2->createElement(CComBSTR("img"),&uuu2);
    uuu2->setAttribute(L"src",CComVariant("file:///c:/img.img"),0);
    uuu2->put_innerHTML(CComBSTR(S));
    CComPtr<IHTMLElement2> p2;//
    if(pElem2->QueryInterface(&p2)!=S_OK||p2==NULL){return;}//pElem2可以是任何元素,所以可形成定位插入
    p2->insertAdjacentElement(CComBSTR("afterEnd"),uuu1,&uuu1);
    p2->insertAdjacentElement(CComBSTR("afterEnd"),uuu2,&uuu2);//----------------------------applyElement你要是不能用,可以
    CComPtr<IHTMLDOMNode> n1;
    CComPtr<IHTMLDOMNode> n2;
     
            uuul->QueryInterface(IID_IHTMLDOMNode,(void**)&n1);           
            uuu2->QueryInterface(IID_IHTMLDOMNode,(void**)&n2);  
    接着
    或者n1->appendChild(n2,NULL);
    或者 n2->appendChild(n1,NULL);
      

  7.   

    以一个IHTMLElement *pElem2为参照物,所谓的定位
      

  8.   

    如果对调整后的元素还想近一步设置,可以再返回n1或n2
    n1->appendChild(n2,&n2/*NULL*/); 
    n2->appendChild(n1,&n1/*NULL*/);