小发猫

【小发猫】基于AI的NLP伪原创工具

改變HTML中的光標問題

改變HTML中的光標問題,我在網上找到這一段代碼,用來改變當前光標位置

HRESULT hr;
CComPtr<IHTMLTxtRange> txtRange;
CComPtr<IHTMLSelectionObject> pSelection;
spDoc->get_selection(&pSelection);
if (pSelection)
{
  CComPtr<IDispatch> pDispRange;
  pSelection->createRange(&pDispRange);
  if (pDispRange)
  {
  hr = pDispRange->QueryInterface(IID_IHTMLTxtRange, (void**)&txtRange);
  if ( SUCCEEDED(hr) && txtRange )
  { 
  txtRange->collapse(VARIANT_TRUE);
  if (pElem)
  {
  if (SUCCEEDED(txtRange->moveToElementText(pElem)))
  { 
  txtRange->select();
  txtRange->scrollIntoView();
  }
  }
  txtRange.Release();
  }
  pDispRange.Release();
  }
  pSelection.Release();  // http://www.wzszf.com/
}

其中,pElem 是指定要跳到的元素(我的情況下,它是一個 <div>&nbsp;</div>,這段代碼可以使光標移到那個元素上,而且那個空位也被選上。但是我衹想要光標移動,不想要文字被選取,我嘗試去掉 txtRange->select() 這一段,但那樣光標又不移動

我是利用 IHTMLDocument2.createElement 來生成新的元素,然後用 IHTMLDOMNode.appendChild插入到指定位置上,插入元素沒有問題。但光標就是移不過去。我後來改用下面的代碼,但還是沒效

HRESULT hr;
CComPtr<IMarkupServices> pMS;
CComPtr<IMarkupContainer> pMarkup;
CComPtr<IMarkupPointer> pPtr;
CComPtr<IDisplayPointer> dpPtr;
CComPtr<IDisplayServices> pDispServices;
CComPtr<IHTMLCaret> spCaret; 

hr = spDoc->QueryInterface(IID_IMarkupContainer, (void **)&pMarkup);
if (hr==S_OK)

  hr = spDoc->QueryInterface(IID_IMarkupServices, (void **)&pMS);
  if (hr==S_OK) 
  { 
  pMS->CreateMarkupPointer(&pPtr);
  hr = spDoc->QueryInterface(IID_IDisplayServices, (void **)&pDispServices);
  if (hr==S_OK)
  { 
  pDispServices->CreateDisplayPointer(&dpPtr);
  pDispServices->GetCaret(&spCaret);
  pMS->CreateMarkupPointer(&pPtr);
  pPtr->MoveAdjacentToElement( pElem, ELEM_ADJ_AfterEnd);
  dpPtr->MoveToMarkupPointer(pPtr, dpPtr);
  spCaret->MoveCaretToPointer(dpPtr, TRUE, CARET_DIRECTION_SAME);
  }
  }
}

上面的代碼中,pElem 是我新插入的元素

實在想不到好辦法,最後衹好用下面這個笨方法

HRESULT hr; 
CComPtr <IHTMLTxtRange> txtRange; 
CComPtr <IHTMLSelectionObject> pSelection; 
spDoc->get_selection(&pSelection); 
if (pSelection) 

  CComPtr <IDispatch> pDispRange; 
  pSelection->createRange(&pDispRange); 
  if (pDispRange) 
  { 
  hr = pDispRange->QueryInterface(IID_IHTMLTxtRange, (void**)&txtRange); 
  if ( SUCCEEDED(hr) && txtRange ) 
  { 
  txtRange->collapse(VARIANT_TRUE); 
  if (pElem) 
  { 
  if (SUCCEEDED(txtRange->moveToElementText(pElem))) 
  { long n;
  txtRange->move(L"character", 1, &n); // 向前進一步
  txtRange->move(L"character", -1, &n); // 然後退回去,這樣就移動了光標 
  txtRange->select(); 
  txtRange->scrollIntoView(); 
  } 
  } 
  txtRange.Release(); 
  } 
  pDispRange.Release(); 
  } 
  pSelection.Release(); 
}

阅读更多
文章标签: html
想对作者说点什么? 我来说一句

HTML 頁面光標控制

2008年12月12日 7KB 下载

ORACLE常用問題1000問

2009年04月16日 83KB 下载

Quick Report 4.05 for BCB6 D7

2006年02月23日 247KB 下载

QBQ問題背後在問題

2008年05月31日 510KB 下载

ORACLE常用傻瓜問題1000問全集

2009年09月21日 168KB 下载

C#打開excel標題名稱亂碼問題

2011年01月27日 43KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭