16.7 GNOME菜单
在GNOME中创建一个下拉式的菜单栏非常简单。菜单栏中的每个菜单都由一个GNOMEUIInfo结构的数组来表示,数组中的每个元素对应于一个菜单项。例如,如果你有File、Edit、View3个菜单,就用3个数组来分别描述每个菜单的内容。
一旦定义好每个菜单,你就可以通过在另一个GNOMEUIInfo结构的数组中引用这些数组来创建菜单栏本身。
GNOMEUIInfo结构有点复杂,需要解释一下:
该结构中的第一项type定义了菜单元素的类型。它可以是GNOME定义的10个GnomeUIInfoType类型中的一个,如表16-3所示。
表 16-3
该结构中的第二个和第三个成员定义菜单项的文本和弹出提示(提示显示在窗口底部的状态栏中)。
moreinfo的目的取决于type。对ITEM和TOGGLEITEM,它指向菜单项被激活时调用的回调函数。对RADIOITEMS,它指向一个定义单选按钮组的GnomeUIInfo结构数组。
user_data是一个传递给回调函数的任意指针。pixmap_type和pixmap_info用于为菜单项增加一个位图图标,accelerator_key和ac_modes用于定义一个快捷键。
最后,widget用于在内部保存由菜单创建函数指向的菜单项构件。
实 验 GNOME菜单
你可以通过这个小程序来试一试菜单,这个程序名为menu1.c。
(1)为菜单项定义一个回调函数item_clicked:
(2)接下来是菜单定义。你有一个子菜单、一个顶层菜单和一个菜单栏数组:
(3)在main函数中,进行一些初始化,然后创建GnomeApp构件并设置菜单:
试着运行menu1程序,你可以看到菜单栏、子菜单及回调函数的实际运行情况,如图16-12所示。
图 16-12
GnomeUIInfo结构对程序员不是太友好,因为它包含11个成员,大多数成员的值在通常情况下都是NULL或零。你在输入它们的时候很容易出错,而且在一个很长的菜单项数组中,你很难将它们一一区分。为了改善这种情况,GNOME定义了宏来减少手工输入的麻烦。这些宏还可以增加图标和键盘快捷键,而不需要任何开销。事实上,我们没有任何理由不使用这些宏。
有两组宏,第一组定义单独的菜单项。它们需要两个参数:回调函数指针和用户数据。
第二组用于顶层菜单定义,你只需传递数组即可:
实 验 使用GNOME宏来定义菜单
在本例中,我们通过这些菜单来看看宏是怎样工作的。对menu1.c做如下改动,并将它保存为menu2.c(为简单起见,本例中的菜单选择没有定义回调函数。本例只是为了说明GNOME菜单宏的便利)。
通过在menu2.c中使用libgnomeui宏,极大地减少了需要输入的代码量,并使菜单代码更容易理解了。这些宏不仅节省了开发者时间和精力,还有助于创建菜单并使菜单的字体、键盘快捷方式和图标与其他GNOME程序保持一致。在程序开发中,我们应该尽可能多地使用这些宏。
图16-13显示了menu3.c的运行情况,它拥有一个标准化的GNOME菜单项。
图 16-13