底部导航栏icon对齐规则(添加自定义菜单)
底部导航栏icon对齐规则(添加自定义菜单)当我们点击菜单时,我们这里做了一次判断,如果用户点击的是我们的自定义菜单,则我们直接进行处理,如果点击的是系统的上下文菜单,则我们将点击事件发送给系统处理器进行后续处理。由于我们选择1为插入位置,这就是说,我们要求上下文菜单处理器在位置1处添加它自己的菜单,同时会将当前在位置1上的菜单项依次下推,如下图所示:下图是经过修改之后的代码:在我们调用IContextMenu::QueryContextMenu之前,我们添加了我们的自定义菜单。因为我们在定义标识符时特意规避了可能存在的标识符冲突,所以这里不会有任何意外发生。再次需要注意,这里调用QueryContextMenu时,我们传递了插入位置参数1,而不是0。当我们传递上下文菜单给IContextMenu::QueryContextMenu时,创建的菜单如下图所示:
我们先具体来看看IContextMenu::QueryContextMenu里的几个参数。其中有三个参数(indexMenu idCmdFirst和idCmdLast)可以用来控制上下文菜单添加的目标位置。为了演示这个概念,我们会尝试在我们的上下文菜单中添加两条自定义的菜单项目,就让我们称它们为”Top”和”Bottom”吧。
首先,我们需要为这两个自定义菜单定义标识符,如下图所示:
在上面的代码中,我们修改了SCRATCH_QCM_LAST值以为我们的两个自定义菜单空出位置,然后我们分别定义了IDM_TOP和IDM_BOTTOM作为自定义菜单的标识。
通过和之前的代码进行比较,你就会发现,我们为自定义菜单保留了一段大小为0x1000的空间,同时IContextMenu可以使用剩余的0x0001到0x6FFF之间的空间作为系统菜单标识符。
当然,我们也可以通过增加SCRATCH_QCM_FIRST的值,而不是减小SCRATCH_QCM_LAST的值,这是同样的道理。增加SCRATCH_QCM_FIRST的值是保留低位空间,减小SCRATCH_QCM_LAST的值则是保留高位空间。
下图是经过修改之后的代码:
代码解析在我们调用IContextMenu::QueryContextMenu之前,我们添加了我们的自定义菜单。因为我们在定义标识符时特意规避了可能存在的标识符冲突,所以这里不会有任何意外发生。再次需要注意,这里调用QueryContextMenu时,我们传递了插入位置参数1,而不是0。
当我们传递上下文菜单给IContextMenu::QueryContextMenu时,创建的菜单如下图所示:
由于我们选择1为插入位置,这就是说,我们要求上下文菜单处理器在位置1处添加它自己的菜单,同时会将当前在位置1上的菜单项依次下推,如下图所示:
当我们点击菜单时,我们这里做了一次判断,如果用户点击的是我们的自定义菜单,则我们直接进行处理,如果点击的是系统的上下文菜单,则我们将点击事件发送给系统处理器进行后续处理。
总结今天的内容十分具有实战意义,在需要添加自定义菜单的场景下,特别有用。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《How to host an IContextMenu part 9 – Adding custom commands》
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。