[IE编程]如何高亮WebBrowser中的一段文本

大狗狗 2010-01-08 09:22:42
环境:VS2005 C# XP

WebBrowser控件,我要高亮其中一段文本,现已知该段文本开始位置,长度,相对于document.body.innerText(相对于document.body.innerHtml的位置我也能算出来)

注:不能用findText方法,如果要查找的文字比较短,该方法就可能出现错误。

我原先用的方法是:

Point pt;//X是文本起始位置,Y是文本长度。
IHTMLTxtRange textRange;
...
mshtml.IHTMLDocument2 document = (mshtml.IHTMLDocument2)Webbrowser.Document.DomDocument;
IHTMLBodyElement body = (IHTMLBodyElement)document.body;
textRange = (IHTMLTxtRange)body.createTextRange();

textRange.moveStart("character", -document.body.innerText.Length);
textRange.moveEnd("character", document.body.innerText.Length);
textRange.moveStart("character", pt.X);
textRange.moveEnd("character", -(document.body.innerText.Length - (pt.X + pt.Y)));

MessageBox.Show(document.body.innerText.Substring(pt.X, pt.Y));
textRange.select();


我试了好多遍,消息框里准确地显示出我要高亮的文字,但接下来高亮的结果却总是有偏差。

请高手指教!
...全文
281 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bearmeng 2010-01-09
  • 打赏
  • 举报
回复
帮顶
大狗狗 2010-01-09
  • 打赏
  • 举报
回复
问题已解决,原因是moveStart及moveEnd方法没有将换行符计算在内。因此代码改成:


if (textRange != null)
{
if (pt.Y > 0)
{
textRange = (IHTMLTxtRange)document.selection.createRange();
document = (mshtml.IHTMLDocument2)Obj.Document.DomDocument;
//textRange.moveStart("character", -document.body.innerText.Length);
//textRange.moveEnd("character", document.body.innerText.Length);
string prev = document.body.innerText.Substring(0, pt.X);
string back = document.body.innerText.Substring(pt.X + pt.Y);
//经测试发现,moveStart及moveEnd方法没有将换行符计算在内。
Regex reg = new Regex("\\r\\n");
MatchCollection mc = reg.Matches(prev);
MatchCollection mc2 = reg.Matches(back);
int n1 = mc.Count;
int n2 = mc2.Count;

textRange.moveStart("character", pt.X - n1);
textRange.moveEnd("character", -(document.body.innerText.Length - (pt.X + pt.Y)-n2));

}
textRange.select();
}


感谢各位回贴朋友,以及关注此贴的朋友!
hululuzhu 2010-01-09
  • 打赏
  • 举报
回复
做过一个Javascript的力反馈项目,发现特别在老版本IE(5,6)中,算出来或者期待的的位置和显示(IE)与真实的渲染位置存在一定的偏差,这个偏差没有一个明显的规律。所以我们对于每个位置,都是人工的观察偏差,然后作为offset error分别调整X和Y的位置,大小固定。试试看加上一些调整的偏差,比如Y都加上20个Pixel,看看有没有变化。
大狗狗 2010-01-09
  • 打赏
  • 举报
回复
我觉得我所贴代码已经能够说明问题,再up下
mngzilin 2010-01-08
  • 打赏
  • 举报
回复
把完整代码贴出来
pywepe 2010-01-08
  • 打赏
  • 举报
回复
c#不熟
大狗狗 2010-01-08
  • 打赏
  • 举报
回复
再up
cnfcnf 2010-01-08
  • 打赏
  • 举报
回复
sito_hongta 2010-01-08
  • 打赏
  • 举报
回复
等待牛人~~

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧