gtk编程笔记 2

来源:互联网 发布:淘宝头条一篇多少钱 编辑:程序博客网 时间:2024/06/07 17:42

GTK+中的菜单和工具栏

简单的菜单

#include <gtk/gtk.h>

 

int main( int argc, char **argv)

{

    GtkWidget *window;

    GtkWidget *vbox;

   

    GtkWidget *menubar;

    GtkWidget *filemenu;

    GtkWidget *file;

    GtkWidget *quit;

 

    gtk_init( &argc, &argv);

 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);

    gtk_window_set_default_size(GET_WINDOW(window), 250, 200);

    gtk_window_set_title(GTK_WINDOW(window),"menu");

 

    vbox = gtk_vbox_new(FALSE, 0);

    gtk_container_add(GTK_CONTAINER(window), vbox);

 

    menubar = gtk_menu_bar_new();//菜单栏

    filemenu = gtk_menu_new();//文件菜单栏

 

    file = gtk_menu_item_new_with_label("File");//文件条目

    quit = gtk_menu_item_new_with_label("Quit");//退出条目

 

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);//将filemenu子菜单设置成file的条目

    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);//将quit加入到filemenu菜单

    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);//将file条目加入到menubar菜单

    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, file);

 

    g_signal_connect_swapped(G_OBJECT(window),"destroy", G_CALLBACK(gtk_main_quit), NULL);//将事件与动作链接到

//一起

    g_signal_connect_swapped(G_OBJECT(quit),"activate",G_CALLBACK(gtk_main_quit), NULL):

 

    gtk_widget_show_all(window);

 

    gtk_main();

 

    return 0;

}

 

添加快捷键

#include <gtk/gtk.h>

#include <gdk/gdkkeysyms.h>

int main( int argc, char *argv[])

    GtkWidget *window; 

    GtkWidget *vbox; 

    GtkWidget *menubar; 

    GtkWidget *filemenu; 

    GtkWidget *file; 

    GtkWidget *new; 

    GtkWidget *open; 

    GtkWidget *quit; 

    GtkWidget *sep; 

    GtkAccelGroup *accel_group = NULL; 

 

    gtk_init(&argc, &argv); 

 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 

    gtk_window_set_default_size(GTK_WINDOW(window), 250, 200); 

    gtk_window_set_title(GTK_WINDOW(window), "menu"); 

 

    vbox = gtk_vbox_new(FALSE, 0);  gtk_container_add(GTK_CONTAINER(window), vbox); 

   

    menubar = gtk_menu_bar_new(); 

    filemenu = gtk_menu_new(); 

 

    accel_group = gtk_accel_group_new();  //新建一个accelerator组

    gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);  //加入窗口

 

    file = gtk_menu_item_new_with_mnemonic("_File");  //添加Alt+f快捷键

    new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL); 

    open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL); 

    sep = gtk_separator_menu_item_new(); 

    quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel_group); 

    gtk_widget_add_accelerator(quit, "activate", accel_group, \

        GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);  

//新建一Ctrl+q的快捷键

   

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu); 

    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), new); 

    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), open); 

    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), sep);  //加入分割线

    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit); 

    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file); 

 

    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3); 

 

    g_signal_connect_swapped(G_OBJECT(window), "destroy",      G_CALLBACK(gtk_main_quit), NULL); 

    g_signal_connect(G_OBJECT(quit), "activate",      G_CALLBACK(gtk_main_quit), NULL); 

   

    gtk_widget_show_all(window); 

   

     gtk_main(); 

     

      return 0;

}

选择菜单

 

#include <gtk/gtk.h>

void toggle_statusbar(GtkWidget *widget, gpointer statusbar)
{
    if( gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
    {
        gtk_widget_show(statusbar);
    }
    else
    {
        gtk_widget_hide(statusbar);
    }
}

int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox;

    GtkWidget *menubar;
    GtkWidget *viewmenu;
    GtkWidget *view;
    GtkWidget *tog_stat;
    GtkWidget *statusbar;

    gtk_init( &argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
    gtk_window_set_title(GTK_WINDOW(window), "view statusbar");

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    menubar = gtk_menu_bar_new();
    viewmenu = gtk_menu_new();

    view = gtk_menu_item_new_with_label("View");
    tog_stat = gtk_check_menu_item_new_with_label("View Statusbar");//新建一个选择菜单
    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tog_stat), TRUE);

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(view), viewmenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(viewmenu), tog_stat);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), view);
    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 3);
   
    statusbar = gtk_statusbar_new();
    gtk_box_pack_end(GTK_BOX(vbox), statusbar, FALSE, TRUE, 1);

    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(G_OBJECT(tog_stat), "activate", G_CALLBACK(toggle_statusbar), statusbar);

    gtk_widget_show_all(window);
 
    gtk_main();
 
    return 0;

}

 

工具栏

#include <gtk/gtk.h>


int main( int argc, char *argv[])
{

  GtkWidget *window;
  GtkWidget *vbox;
 
  GtkWidget *toolbar;
  GtkToolItem *new;
  GtkToolItem *open;
  GtkToolItem *save;
  GtkToolItem *sep;
  GtkToolItem *exit;


  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
  gtk_window_set_title(GTK_WINDOW(window), "toolbar");

  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);


  toolbar = gtk_toolbar_new();//新建一工具栏
  gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);//设置只显示图标

  gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);

  new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);//新建一个按钮
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new, -1);//将按钮插入工具栏

  open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), open, -1);

  save = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), save, -1);

  sep = gtk_separator_tool_item_new();
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);

  exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exit, -1);

  gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);

  g_signal_connect(G_OBJECT(exit), "clicked",
        G_CALLBACK(gtk_main_quit), NULL);

  g_signal_connect_swapped(G_OBJECT(window), "destroy",
        G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

 

撤销/重做 (undo/redo)

 

#include <gtk/gtk.h>
#include <string.h>


void undo_redo(GtkWidget *widget,  gpointer item)
{
  static int count = 2;
  const char *name = gtk_widget_get_name(widget);

  if ( strcmp(name, "undo") ) {
    count++;
  } else {
    count--;
  }
 
  if (count < 0) {
     gtk_widget_set_sensitive(widget, FALSE);
     gtk_widget_set_sensitive(item, TRUE);
  }

  if (count > 5) {
     gtk_widget_set_sensitive(widget, FALSE);
     gtk_widget_set_sensitive(item, TRUE);
  }
}


int main( int argc, char *argv[])
{

  GtkWidget *window;
  GtkWidget *vbox;

  GtkWidget *toolbar;
  GtkToolItem *undo;
  GtkToolItem *redo;
  GtkToolItem *sep;
  GtkToolItem *exit;


  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
  gtk_window_set_title(GTK_WINDOW(window), "undoredo");

  vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);


  toolbar = gtk_toolbar_new();
  gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);

  gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);

  undo = gtk_tool_button_new_from_stock(GTK_STOCK_UNDO);
  gtk_widget_set_name(GTK_WIDGET(undo), "undo");
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), undo, -1);

  redo = gtk_tool_button_new_from_stock(GTK_STOCK_REDO);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), redo, -1);

  sep = gtk_separator_tool_item_new();
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), sep, -1);

  exit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exit, -1);

  gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);


  g_signal_connect(G_OBJECT(undo), "clicked",
        G_CALLBACK(undo_redo), redo);

  g_signal_connect(G_OBJECT(redo), "clicked",
        G_CALLBACK(undo_redo), undo);

  g_signal_connect(G_OBJECT(exit), "clicked",
        G_CALLBACK(gtk_main_quit), NULL);

  g_signal_connect_swapped(G_OBJECT(window), "destroy",
        G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

 

 

 

 

 

 

 

原创粉丝点击