天天看点

IContextMenu第九部分:添加自定义菜单

我们先具体来看看

IContextMenu::QueryContextMenu里的几个参数。其中有三个参数(indexMenu, idCmdFirst和idCmdLast)可以用来控制上下文菜单添加的目标位置。为了演示这个概念,我们会尝试在我们的上下文菜单中添加两条自定义的菜单项目,就让我们称它们为”Top”和”Bottom”吧。

首先,我们需要为这两个自定义菜单定义标识符,如下图所示:

IContextMenu第九部分:添加自定义菜单

在上面的代码中,我们修改了SCRATCH_QCM_LAST值以为我们的两个自定义菜单空出位置,然后我们分别定义了IDM_TOP和IDM_BOTTOM作为自定义菜单的标识。

通过和之前的代码进行比较,你就会发现,我们为自定义菜单保留了一段大小为0x1000的空间,同时IContextMenu可以使用剩余的0x0001到0x6FFF之间的空间作为系统菜单标识符。

当然,我们也可以通过增加SCRATCH_QCM_FIRST的值,而不是减小SCRATCH_QCM_LAST的值,这是同样的道理。增加SCRATCH_QCM_FIRST的值是保留低位空间,减小SCRATCH_QCM_LAST的值则是保留高位空间。

下图是经过修改之后的代码:

IContextMenu第九部分:添加自定义菜单
IContextMenu第九部分:添加自定义菜单

代码解析

在我们调用

IContextMenu::QueryContextMenu之前,我们添加了我们的自定义菜单。因为我们在定义标识符时特意规避了可能存在的标识符冲突,所以这里不会有任何意外发生。再次需要注意,这里调用QueryContextMenu时,我们传递了插入位置参数1,而不是0。

当我们传递上下文菜单给

IContextMenu::QueryContextMenu时,创建的菜单如下图所示:

IContextMenu第九部分:添加自定义菜单

由于我们选择1为插入位置,这就是说,我们要求上下文菜单处理器在位置1处添加它自己的菜单,同时会将当前在位置1上的菜单项依次下推,如下图所示:

IContextMenu第九部分:添加自定义菜单

当我们点击菜单时,我们这里做了一次判断,如果用户点击的是我们的自定义菜单,则我们直接进行处理,如果点击的是系统的上下文菜单,则我们将点击事件发送给系统处理器进行后续处理。

总结

今天的内容十分具有实战意义,在需要添加自定义菜单的场景下,特别有用。

最后

最近我写了个东西

继续阅读