/* 下面程序编译运行后,有一个View菜单,一个“TOOl Bar”复选菜单项,一个“Float Tool Bar”复选菜单项,菜单项为选中状态时显示相应的工具栏 。注释写的不好,这的确是个大问题,我会不断改进的,希望各位网友多提一些改进程序时空效率的方法,谢谢了。*/
#include
/*是否显示标准工具栏 */
gboolean isshowstdtoolbar = FALSE ;
/* 是否显示浮动工具条 */
gboolean isshowfloattoolbar = FALSE ;
static GtkWidget *std_toolbar;
static GtkWidget *float_toolbar;
static GtkWidget *main_vbox;
/* View 菜单中的Toolbar 菜单项被激活时的回调函数 */
static void on_view_toolbar_active ( GtkMenuItem *menuitem, gpointer data );
/* view 菜单中的Float ToolBar菜单项激活时的回调函数 */
static void on_view_floattoolbar_active
( GtkMenuItem *menuitem, gpointer data);
/* 创建浮动工具条的函数 */
static GtkWidget* create_float_toolbar ( void );
/* 创建标准工具栏的函数 */
static GtkWidget* create_std_toolbar ( void );
/* 创建菜单栏的函数 */
static GtkWidget* create_menubar ( GtkAccelGroup *accel_group, GtkWidget *window );
/* 创建应用程序主窗口的程序 */
static GtkWidget* create_main_window ( void );
void on_view_stdtoolbar_active ( GtkMenuItem *menuitem, gpointer data )
{
isshowstdtoolbar = !isshowstdtoolbar;
if (isshowstdtoolbar) {
stdtoolbar = create_std_toolbar();
gtk_box_pack_start( GTK_BOX(main_vbox), stdtoolbar, FALSE, FALSE, 0 );
gtk_widget_show(stdtoolbar);
}
else {
gtk_widget_destroy(stdtoolbar);
}
}
void on_view_floattoolbar_active ( GtkMenuItem *menuitem, gpointer data)
{
/* 菜单项激活后改变浮动工具栏显示状态 */
isshowfloattoolbar = !isshowfloattoolbar;
/* 显示浮动工具栏条件为真,则创建浮动工具栏并显示 */
if (isshowfloattoolbar) {
floattoolbar = create_float_toolbar();
gtk_box_pack_start( GTK_BOX(main_vbox), floattoolbar, FALSE, FALSE, 0 );
gtk_widget_show(floattoolbar);
}
/* 为假,则销毁浮动工具栏 */
else {
gtk_widget_destroy(floattoolbar);
}
}
GtkWidget* create_float_toolbar ( void )
{
GtkWidget *handle;
GtkWidget *hbox;
GtkWidget *button;
GtkTooltips *handle_button_tips;
/* 创建一个浮动的工具条 */
handle = gtk_handle_box_new();
hbox = gtk_hbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(handle), hbox);
handle_button_tips = gtk_tooltips_new();
button = gtk_button_new_from_stock(GTK_STOCK_NEW);
gtk_tooltips_set_tip(GTK_TOOLTIPS(handle_button_tips), button, "新建一个文件", "New");
gtk_widget_show_all(handle);
return handle;
}
GtkWidget* create_menubar (GtkAccelGroup *accel_group, GtkWidget *window )
{
GtkWidget *menubar;
GtkWidget *rootmenu;
GtkWidget *viewmenu;
GtkWidget *toolbar_menuitem;
GtkWidget *floattoolbar_menuitem;
menubar = gtk_menu_bar_new();
rootmenu = gtk_menu_item_new_with_mnemonic ("_View");
/* 视图菜单 */
viewmenu = gtk_menu_new();
toolbar_menuitem = gtk_check_menu_item_new_with_label("Tool Bar");
gtk_menu_shell_append(GTK_MENU_SHELL(viewmenu), toolbar_menuitem);
g_signal_connect(G_OBJECT(toolbar_menuitem), "activate", G_CALLBACK(on_view_stdtoolbar_active), NULL);
floattoolbar_menuitem = gtk_check_menu_item_new_with_label("Float Tool Bar");
gtk_menu_shell_append(GTK_MENU_SHELL(viewmenu), floattoolbar_menuitem);
g_signal_connect(G_OBJECT(floattoolbar_menuitem), "activate", G_CALLBACK(on_view_floattoolbar_active), NULL);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), viewmenu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), rootmenu);
gtk_widget_show_all(menubar);
return menubar;
}
GtkWidget* create_std_toolbar ( void )
{
GtkWidget *toolbar;
gtk_toolbar_insert_stock(GTK_TOOLBAR(toolbar), GTK_STOCK_NEW, "退出", "退出", GTK_SIGNAL_FUNC(gtk_main_quit), NULL, -1);
gtk_widget_show_all(toolbar);
return toolbar;
}
GtkWidget* create_main_window ( void )
{
GtkWidget *window;
GtkAccelGroup *accel_group;
GtkWidget *menubar;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
accel_group = gtk_accel_group_new();
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
main_vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), main_box);
menubar = create_menubar(accel_group, window);
gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, FALSE, 0);
gtk_widget_show_all(window);
return window;
}
int main (int argc, char* argv[])
{
GtkWidget *main_window;
gtk_init(&argc, &argv);
main_window = create_main_window();
gtk_widget_show_all(main_window);
gtk_main();
return FALSE;
}
__________________________________________________________
编写Makefile文件如下:
CC = gcc
all:
[tab 键] $(CC) -o checkmenuitem checkmenuitem.c `pkg-config --cflags --libs gtk+-2.0`