Chromium界面分析小结(六)工具菜单结构 ゝ一纸荒年。 2021-11-26 09:16 631阅读 0赞 ![1366195453_1317.png][] Chromium的菜单实现考虑到跨平台的要求,使用了一层抽象模型(SimpleMenuModel),所有菜单模型都继承自这个类,各平台实现时需要根据提供的模型构造对应的菜单。这个工具菜单模型是WrenchMenuModel类,也继承自SimpleMenuModel。Chromium在Linux平台使用了GTK+来创建界面,也就由MenuGtk类负责菜单模型的解释和构造。所有的菜单都要经过\*\*MenuModel到GtkMenuItem的过程,如果要添加或删除菜单项可以直接修改对应的MenuModel,再由MenuGtk类自动生成相应菜单。 Chromium在菜单上添加了按钮,而GTK没有提供相应的控件,所以Chromium自己编写了一个自定义菜单项类,继承自GTK+的菜单项类。缩放菜单项的结构如下: ![1366195508_3193.png][] 其中的全屏按钮是最复杂的一个按钮,因为其他所有按钮上只有一个label,而这个全屏按钮上添加了一个图标,而且这个图标还会根据不同的状态改变样式,难怪它这么复杂。这个按钮在构建模型时很正常,和其他按钮一样,只是多了个icon\_idr,这是用来表示图标资源ID的,其他按钮都是默认的\-1,而它是IDR\_FULLSChromiumEEN\_MENU\_BUTTON。在MenuGtk类根据模型构建菜单时,才真正开始: 在MenuGtk::BuildSubmenuFromModel中构建菜单时,处理TYPE\_BUTTON\_ITEM类型的菜单项时调用了BuildButtonMenuItem函数,在BuildButtonMenuItem中如果从菜单项模型中获取到了有效的图片ID(现在就是IDR\_FULLSChromiumEEN\_MENU\_BUTTON)就会调用SetupImageIcon函数为菜单项设置图标,而SetupImageIcon函数中只是给该菜单项连接了”show”信号由OnSubmenuShowButtonImage函数处理,也就是说当该菜单项需要显示时便会调用这个函数,在这个函数中才真正地调用GetIconSetForId获取图标资源,然后设置给了该菜单项。没完呢,在GetIconSetForId中有这么一条语句:”if (id == IDR\_FULLSChromiumEEN\_MENU\_BUTTON) return fullsChromiumeen\_icon\_set\_; returnNULL;”这是巧合么!这个被返回的fullsChromiumeen\_icon\_set在函数GtkThemeService::RebuildMenuIconSets中被初始化,当然这个函数也只处理了这个一图标,Chromium这么麻烦的目的只有一个:让全屏按钮的行为看起来更像系统控件。因为带有标签的按钮在激活时背景高亮且文字反色,但是系统不会处理带有图像的按钮,Chromium就自己搞了。如果想在菜单中添加更多的图标按钮,可以跳过Chromium这么麻烦的处理过程直接添加图像到按钮上,这样就不会有那么“像系统”的行为了,也可以在GtkThemeService类中添加更多的GtkIconSet来达到Chromium这样的效果。 [1366195453_1317.png]: https://img-my.csdn.net/uploads/201304/17/1366195453_1317.png [1366195508_3193.png]: https://img-my.csdn.net/uploads/201304/17/1366195508_3193.png
还没有评论,来说两句吧...