2009-09-02 61 views
1

我有一个嵌入在应用程序中的基于MSHTML的控件,并使用ContentEditable模式编辑其中的文档。 HTML文档的主体最初包含以下几行:如何在鼠标点击过程中更改MSHTML中脱字号的位置?

<div></div> 
<div id="signature"></div> 

插入符号位于文档的开头,即第一个DIV元素的内部。现在,当鼠标用鼠标在最后一行下方的控件内部单击鼠标时,插入符号将移动到第二个DIV元素中,因为它是距离用户点击的点最近的一个元素。

我想将鼠标指针移到第一个DIV的末尾。现在我的代码可以计算插入符号的预期位置IMarkupPointerIDisplayPointer。我需要知道的是截取MSHTML事件管道的位置,以便执行实际的脱字符号移动。

我编写的代码实现了IHTMLEditDesigner,并使用IHTMLCaret.MoveCaretToPointer将插入符号移动到预期位置。问题是无论我在哪里拦截事件(PreHandleEvent,PostHandleEvent或PostEditorEventNotify),插入符号位置最终都会在单击时恢复为默认位置(但是,如果按住鼠标左键一段时间,它将不会被还原,或者如果我用鼠标右键单击)。

回答

3

在您加载到IE控件的HTML内部使用jscript。如果你不知道HTML和jscript 非常好你会发现这个任务很难痛苦

看到这些问题为我的经验,当我尝试做这样的事情。

我也有很多其他的问题,包括必须写调整在JScript逻辑来获取HTML编辑器的大小与WinForm的形式一起,不得不通过默认窗体/控制颜色到HTML编辑器,以便它看起来写,然后用户更改Windows上的配色方案。

更好的办法是找到一个HTML编辑器并将其加载到IE控件中,您仍然必须自己编写标准窗口颜色。

还有第三方winforms HTML编辑器,你可以使用。如果可能的话,我认为你应该购买一个解决方案,因为ContentEditable在现实生活中要困难得多。

找到了一个快速的谷歌。

+0

感谢您提供很多有用的提示,但他们都没有真正回答我的具体问题。我不能使用JScript,但我可以钩住C#中的所有DOM事件,所以如果我只知道要挂钩的事件,我也可以做同样的事情。我已经与前面提到的前两个编辑器(Writer和NetRix)合作过了,它们都是越野车,并且没有我正在寻找的特定功能(点击控件时将光标移出签名DIV)。 – 2009-09-11 07:13:27

+0

您可以使用MSHTML控件上的某些API添加jscript回调,方法是在创建控件后编辑DOM。当控件在后台线程上创建DOM时要小心,并且必须等到它启动了“已加载”事件。 – 2009-09-11 10:14:27

+0

我认为这是接受的答案,因为你的回答真的帮助了我。我现在已经隔离了这个问题,稍后我会发布更多关于该解决方案的信息。你应该得到赏金点数。 – 2009-09-12 09:12:59

1

也许对于mouseDown mouseUp和mouseClick有单独的事件。

您拦截mouseClick,但默认行为在mouseUp上执行。

+0

你是对的,有三个事件(向下,向上,点击),但我试图拦截每个/他们所有,它没有帮助。 – 2009-09-11 07:02:24

2

您是否尝试过使用的WinForms定时器0超时?

  • 当你得到鼠标按下事件启动计时器。
  • 然后MSHTML控件会处理该事件
  • 然后,您将返回到窗口消息循环
  • 所有其他消息在消息队列然后将由现在MSHTML有计时器
  • 希望之前的过程设定单次点击默认插入位置
  • 然后,您可以移动自己的插入位置时,定时器触发

有间谍++看一下在MSHTML控件的不同窗口之间发送什么事件以获得其他理想。 MSHTML控件就像没有其他的WinForms控件,你必须回到你在C和Win32编程时使用的所有技巧。

+0

这可能工作,我今晚会尝试。 – 2009-09-11 13:41:50

+0

+1的想法,但它没有奏效。即使使用计时器,插笔位置也会在接下来的几毫秒内恢复(大约在插笔应该闪烁时)。在从我明确设置的位置到错误位置之间出现的唯一窗口消息是WM_NCHITTEST。 – 2009-09-11 14:13:18

1

你是否通过为它找到dom项目并调用setFocus(或任何它所称的)dom方法来将“focus”设置为第一个div?脱字符应该移到fosus的位置。

(有迹象表明,暴露MSHTML上找到他们的DOM项目和调用方法的接口。对不起,我不记得如何做到这一点的细节)

+0

会尝试。我定义了所有的接口,这看起来像一个非常明智的建议。 – 2009-09-11 19:44:40

0

我相信你需要改变选择开始财产和离开SelectionLength = 0。这将把插入符号移动到新的位置。