闪烁“更改前”通知
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
。这会将自动修改与用户的第一次修改合并,因此这两个操作在撤消时不会以错误的顺序出现。这有效地满足了我的要求。以上是关于闪烁“更改前”通知的主要内容,如果未能解决你的问题,请参考以下文章