代码之家  ›  专栏  ›  技术社区  ›  Filip Navara

鼠标单击时如何更改MSHTML中插入符号的位置?

  •  1
  • Filip Navara  · 技术社区  · 15 年前

    我在应用程序中嵌入了一个基于MSHTML的控件, 可满足的 模式用于编辑其中的文档。HTML文档的正文最初包含以下行:

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

    插入符号放在文档的开头,即第一个DIV元素内。现在,当用户在控件内最后一行下面的某个位置单击时,插入符号将移动到第二个DIV元素中,因为它是最接近用户单击点的元素。

    我想在鼠标单击时将指针移动到第一个DIV的末尾。现在我有了代码来计算插入符号的预期位置 IMarkupPointer IDisplayPointer . 我需要知道的是在哪里截获MSHTML事件管道来执行实际的插入符号移动。

    我已经编写了实现 IHTMLEditDesigner 并使用移动插入符号 IHTMLCaret.MoveCaretToPointer 到达预定位置。问题是,无论在何处截获事件(PrehandleEvent、PosthandleEvent或PosteditorEventNotify),插入符号位置最终都会在单击时恢复为默认位置(但如果按住鼠标左键一段时间或使用鼠标右键单击,则不会恢复)。

    5 回复  |  直到 15 年前
        1
  •  3
  •   Community CDub    7 年前

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

    当我尝试这样做的时候,请看这些问题以了解我的经验。

    我还遇到了很多其他问题,包括必须在JScript中编写调整大小的逻辑,以使HTML编辑器与WinForm窗体一起调整大小,并且必须将默认的窗体/COontrol颜色传递到HTML编辑器中,以便它看起来是先编写,然后用户在Windows上更改了颜色方案。

    更好的方法是找到一个HTML编辑器并将其加载到IE控件中,您仍然需要自己使用标准窗口颜色等进行编码。

    还可以使用第三方WinForms HTML编辑器。如果可能的话,我认为你应该购买一个解决方案,因为ContentEditable在现实生活中要困难得多,那么它看起来就很难了。

    找到了一个快速的谷歌。

        2
  •  2
  •   Ian Ringrose    15 年前

    是否尝试使用超时为0的WinForms计时器?

    • 当你按下鼠标时,启动计时器。
    • 然后,MSHTML控件将处理该事件
    • 然后返回到Windows消息循环
    • 然后将在计时器之前处理消息队列中的所有其他消息
    • 希望到目前为止,MSHTML已经在单击时设置了默认的插入符号位置。
    • 然后,您可以在计时器触发时自己移动插入符号位置。

    使用spy++查看MSHTML控件中不同窗口之间发送的事件,以获得其他理想。mshtml控件与其他winforms控件不同,您必须回到C和win32编程时代使用的所有技巧。

        3
  •  1
  •   Kamil Szot    15 年前

    也许有单独的活动,为穆塞敦穆塞普和穆塞利克。

    截获mouseclick,但默认行为将在mouseup上执行。

        4
  •  1
  •   Ian Ringrose    15 年前

    您是否通过查找第一个DIV的DOM项并调用setfocus(或它被称为什么)DOM方法将“focus”设置绑定到了第一个DIV?插入符号应该移动到fosus所在的位置。

    (MSHTML公开了一些接口来查找DOM项并调用它们的方法。很抱歉,我不记得怎么做的细节)

        5
  •  0
  •   Jason Kleban    15 年前

    我认为您需要更改SelectStart属性并保留SelectionLength=0。将插入符号移动到新位置。