Chromium界面分析小结(六)工具菜单结构


Chromium的菜单实现考虑到跨平台的要求,使用了一层抽象模型(SimpleMenuModel),所有菜单模型都继承自这个类,各平台实现时需要根据提供的模型构造对应的菜单。这个工具菜单模型是WrenchMenuModel类,也继承自SimpleMenuModelChromiumLinux平台使用了GTK+来创建界面,也就由MenuGtk类负责菜单模型的解释和构造。所有的菜单都要经过**MenuModelGtkMenuItem的过程,如果要添加或删除菜单项可以直接修改对应的MenuModel,再由MenuGtk类自动生成相应菜单。

       Chromium在菜单上添加了按钮,而GTK没有提供相应的控件,所以Chromium自己编写了一个自定义菜单项类,继承自GTK+的菜单项类。缩放菜单项的结构如下:



其中的全屏按钮是最复杂的一个按钮,因为其他所有按钮上只有一个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这样的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值