闪烁“更改前”通知

Posted

技术标签:

【中文标题】闪烁“更改前”通知【英文标题】:Scintilla 'Before change' notification 【发布时间】:2014-03-14 16:28:29 【问题描述】:

当 Scintilla 编辑器第一次变得“脏”时,我需要进行某些处理文档实际更改之前。

SCN_SAVEPOINTLEFT 通知似乎是显而易见的候选者,但不幸的是,它在导致文档变脏的更改发生后被触发。

查看其他可用通知,SCN_MODIFIED 也会在更改发生后被触发(当然SCEN_CHANGE 也是如此)。

我能想到的最好的方法是响应SCN_SAVEPOINTREACHED(即在保存文档或撤消所有更改时)开始宏录制。然后当我用SCN_MODIFIED 检测到第一个更改时,我停止录制,撤消所有更改,直到我回到保存点,执行我的自定义处理(恰好是修改文档中的日期字段),然后重播录制的宏来恢复撤消的更改。

这看起来非常令人费解。有没有更简单的方法? (也许使用 SCN_BEFORECHANGE 通知创建我自己的自定义版本的 Scintilla 会更简单,但我更愿意避免创建分叉。粗略地浏览一下源代码表明有很多点来自该通知会必须发送,很容易错过一些。)


更新:真正的要求是当用户在第一次修改文档后执行“撤消”时,“自动”编辑和用户的第一次编辑在撤消缓冲区中的顺序没有错误。最简单的解决方案是,不是强制自动更新为第一个,而是使用SCI_BEGINUNDOACTION/SCI_ENDUNDOACTION 将这两个操作合并为一个撤消操作。请参阅下面关于我是如何做到这一点的评论。

【问题讨论】:

【参考方案1】:

SCN_MODIFIED 通知确实似乎符合您的规范。 modificationType 字段提供有关已完成操作的信息,包括:

SC_MOD_BEFOREINSERT 0x400 Text is about to be inserted into the document.
SC_MOD_BEFOREDELETE 0x800 Text is about to be deleted from the document.

【讨论】:

我不知道我是怎么错过的。谢谢。 事实上,由于不允许在 SCN_MODIFIED 处理程序内更改编辑器中的文本,我最终得到了以下解决方案: 1. 响应 SCN_SAVEPOINTREACHED 设置标记并发送SCI_BEGINUNDOACTION。 2. 回复SCN_MODIFIED 并设置标志为自己发布一条自定义消息。 3. 在自定义消息处理程序中修改编辑器,然后发送SCI_ENDUNDOACTION。这会将自动修改与用户的第一次修改合并,因此这两个操作在撤消时不会以错误的顺序出现。这有效地满足了我的要求。

以上是关于闪烁“更改前”通知的主要内容,如果未能解决你的问题,请参考以下文章

标签更改前的聚合物纸张标签(beforeunload)

无法为奥利奥通知启用闪烁灯并禁用通知声音

通知不振动且 LED 不闪烁

Silverlight 按钮 - 悬停时更改前景色

突然闪烁通知功能停止工作

Rails 通过 ajax 闪烁通知