题
我有一个嵌入在应用程序中的基于 MSHTML 的控件 内容可编辑 模式用于编辑其中的文档。HTML 文档的正文最初包含以下几行:
<div></div>
<div id="signature"></div>
插入符号放置在文档的开头,即第一个 DIV 元素内。现在,当用户用鼠标单击控件内最后一行下方的位置时,插入符号将移动到第二个 DIV 元素中,因为它是距离用户单击点最近的元素。
我想在单击鼠标时将指针移动到第一个 DIV 的末尾。现在我有了计算插入符的预期位置的代码: IMarkupPointer
和 IDisplayPointer
. 。我需要知道的是在哪里拦截 MSHTML 事件管道以执行实际的插入符移动。
我已经编写了实现的代码 IHTMLEditDesigner
并使用移动插入符 IHTMLCaret.MoveCaretToPointer
到预定位置。问题是,无论我在哪里拦截事件(PreHandleEvent、PostHandleEvent 或 PostEditorEventNotify),插入符号位置最终都会在单击时恢复为默认位置(但如果我按住鼠标左键一段时间,或者如果我用鼠标右键单击)。
解决方案
在加载到 IE 控件中的 HTML 中使用 jscript。如果您不了解 HTML 和 jscript 很好 你会发现这个任务非常 痛苦.
当我尝试这样做时,请参阅这些问题以了解我的经验。
我还遇到了很多其他问题,包括必须在 jscript 中编写调整大小逻辑,以使 HTML 编辑器与 WinForm 表单一起调整大小,并且必须将默认的表单/控制颜色传递到 HTML 编辑器中,以便它看起来是写入的,然后用户更改了Windows 上的配色方案。
更好的是找到一个 HTML 编辑器并将其加载到 IE 控件中,您仍然需要自己使用标准窗口颜色等进行编码。
您还可以使用第 3 方 winforms HTML 编辑器。如果可能的话,我认为您应该购买解决方案,因为 ContentEditable 在现实生活中比看起来要困难得多。
谷歌很快就找到了。
- 作家 作者:Lutz Roeder(因《Reflector》而闻名)
- 网络瑞克斯 通过 网络组件
- 网页编辑器 卡尔·诺兰
- WinForms 应用程序的 HTML 查看和编辑组件
其他提示
您是否尝试过使用超时为 0 的 winforms 计时器?
- 当您收到鼠标按下事件时启动计时器。
- 然后MSHTML控件将处理该事件
- 然后你将返回到 Windows 消息循环
- 消息队列中的所有其他消息将在计时器之前处理
- 希望现在 MSHTML 已经设置了单击时的默认插入符位置
- 然后,您可以在计时器触发时自行移动插入符号位置
使用 Spy++ 查看 MSHTML 控件中不同窗口之间发送的事件,以获得其他理想结果。MSHTML 控件与其他 winforms 控件不同,您必须回到 C 和 Win32 编程时代使用的所有技巧。
也许有用于鼠标按下mouseup和点击鼠标独立的事件。
您点击鼠标拦截,但默认行为大干快上mouseUp事件执行。
让你绑通过查找DOM项目它,并调用的setFocus(或任何它被称为)DOM方法设置“焦点访谈”的第一个div?插入符应该移动到其中fosus是
(有迹象表明,暴露MSHTML上找到他们的DOM项目和调用方法的接口。对不起,我不记得如何做到这一点的细节)
我相信你需要改变选择开始财产并离开SelectionLength = 0这将插入符移动到新的位置。