我在应用程序中嵌入了基于MSHTML的控件, ContentEditable 模式用于编辑其中的文档。 HTML文档的正文最初包含以下行:
<div></div>
<div id="signature"></div>
插入符号放在文档的开头,即第一个DIV元素内。现在,当用户在最后一行下方的位置使用鼠标单击控件时,插入符将移动到第二个DIV元素中,因为它是与用户单击的点最接近的元素。
我想在鼠标单击时将指针移动到第一个DIV的末尾。现在我有了代码来计算插入符号的预期位置IMarkupPointer
和IDisplayPointer
。我需要知道的是拦截MSHTML事件管道以进行实际的插入符号移动。
我编写了实现IHTMLEditDesigner
的代码,并使用IHTMLCaret.MoveCaretToPointer
将插入符号移动到预期位置。问题是,无论我在哪里拦截事件(PreHandleEvent,PostHandleEvent或PostEditorEventNotify),插入位置最终都会在单击时恢复为默认位置(但如果我按住鼠标左键一段时间或者如果按住鼠标左键,则不会恢复它我点击鼠标右键。
答案 0 :(得分:3)
在加载到IE控件中的HTML中使用jscript。如果您不熟悉HTML和jscript 非常好,您会发现此任务非常痛苦。
当我尝试这样做时,请查看这些问题。
我还有很多其他问题,包括必须在jscript中编写resize逻辑以使HTML编辑器与WinForm表单一起调整大小并且必须将默认的form / coontrol颜色传递到HTML编辑器中以便它看起来像写然后用户在Windows上更改了配色方案。
更好的只是找到一个HTML编辑器并将其加载到IE控件中,您仍然需要自己使用标准窗口颜色等进行编码。
您还可以使用第三方winforms HTML编辑器。如果可能的话,我认为你应该买一个解决方案,因为ContentEditable在现实生活中要难得多。
快速google发现。
答案 1 :(得分:2)
您是否尝试使用超时为0的winforms计时器?
了解Spy ++,了解MSHTML控件中不同窗口之间发送的事件,以获得其他理想。 MSHTML控件就像没有其他winforms控件一样,你必须回到你在C和Win32编程时使用的所有技巧。
答案 2 :(得分:1)
也许mouseDown mouseUp和mouseClick有单独的事件。
拦截mouseClick但默认行为在mouseUp上执行。
答案 3 :(得分:1)
您是否通过为其找到dom项目并调用setFocus(或其他任何名称)dom方法将“焦点”设置为第一个div?插入符应该移动到fosus所在的位置。
(MSHTML有一些接口可以查找dom项目和调用方法。抱歉,我不记得有关如何执行此操作的详细信息)
答案 4 :(得分:0)
我相信您需要更改SelectStart属性并保留SelectionLength = 0.这会将插入符移动到新位置。