最近在用Webbrowser开发一个富文本编辑器,一路磕磕碰碰,仅记录一下心得。
WebBrowser控件在编辑状态下,按下回车键后执行的是分段操作,相隔较大,Shift+回车是换行,两种行间距不一样。为了解决这个问题,倒是折腾了好几天。
在网上各种查找之后,几乎都是说用DIV标签来解决该问题,也就是编辑器初始时就直接把DIV嵌进去
<body>
<div> </div>
</body>
这样的话确实可以解决了该问题,回车之后就是新的DIV而不是换段落了,不过该方式有个问题,Ctrl+A全选后,再删除就会连带内部的DIV标签给删掉了,再回车又是一个P了。
接着继续研究,看到大牛提出来的,实现IDocHostUIHandler接口,按DOCHOSTUIFLAG_DIV_BLOCKDEFAULT 的路子实现 GetHostInfo方法。实现 IDocHostUIHandler接口吧,查了半天,确实麻烦,先要生成MsHtmHstInterop.dll,用到的 IDocHostUIHandler接口和ICustomDoc接口都是这个dll里边的,然后 把IDocHostUIHandler接口的个人实现挂接到 MSHTML 上。
最郁闷的是,以上大牛都是用axWebbrowser来实现的,几经折腾,终于通过以下方式实现了IDocHostUIHandler 接口:
// 把IDocHostUIHandler接口的个人实现挂接到 MSHTML 上
ICustomDoc cDoc = (ICustomDoc)this.webBrowser.Document.DomDocument;
cDoc.SetUIHandler((IDocHostUIHandler)this.webBrowser);
// IDocHostUIHandler 接口的实现,实现GetHostInfo
public void GetHostInfo(ref _DOCHOSTUIINFO pInfo)
{
// DOCHOSTUIFLAG_DIV_BLOCKDEFAULT
pInfo.dwFlags |= 0x00000100;
}
然而更杯具的事情发生了,编辑功能废了,也就是编辑模式下,任何按键都没反应,任何字符都敲不进去了.......
无奈之下,上坛子发帖去了,但一直没有得到回应,至今不知道我哪个地方错了,可能是我的接口实现有问题。
又回到之前思路,集中火力解决Ctrl+A 全选后删除的问题。又碰到问题了,Webbrowser没有KeyDown,KeyPress相关的事件。
顿时觉得叫天不应叫地不灵...虽然偶是无神论者....
又接着憋屈,终于在内伤喷血之前.. 峰回路转,我找到了KeyDown事件!
Webbrowser本身是没有相关事件,但是HtmlElement有,而且webBrowser.Document.Body就是 HtmlElement!
webBrowser.Document .Body.KeyDown += new HtmlElementEventHandler(Body_KeyDown);
虽然该问题还没有解决,但是算是多少有点进展了