`
hongbochen1223
  • 浏览: 43282 次
文章分类
社区版块
存档分类
最新评论

GTK学习3--菜单栏和工具栏

 
阅读更多

通过上一小节,基本上掌握了如何向窗口中添加菜单栏以及为menu_item添加快捷键,下面我们通过一个实例来创建选择菜单选项.GtkCHeckMenuItem就是一个可以生成带有选择的菜单选项.

下面看一下代码:

#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 status bar");

    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;
}

Makefile文件同上面小节.首先,我们先看一下,运行之后的效果:

这个就是带有选项框的菜单项.

我们这个实例的意思是,当选中该菜单项的时候,显示状态栏,如果取消选中,则隐藏状态栏.

函数 gtk_check_menu_item_new_with_label() 可以生成一个新的带有选择框的菜
单选项。

好了,菜单栏的使用大致上就这些了,下面我们了解一下工具栏的使用方法.

#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_NEW);
    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;

}

下面是工具栏运行之后的效果:

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

从上面两行代码可以看出,生成一个带有图片显示的工具栏.

new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar),new,-1);

从stock中生成一个新的工具按钮,要想添加到工具栏中,只需要函数gtk_toolbar_insert()就可以.

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

该代码生成一个分割线把工具栏分开.
这样就生成了我们经常见到的工具栏了.

下面我们学习一个功能失效,也就是使工具栏中的一个按钮失效,也就是对该item无法操作.

下面请看一下代码:

#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;
    GtkWidget *undo;
    GtkWidget *redo;
    GtkWidget *sep;
    GtkWidget *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;
}

下面是运行之后的结果

gtk_widget_set_sensitive() 是被用来告诉计算机是否要击活一个工具栏按钮。

下面我们来看一下这个toolbar的一个官方api:

1): gtk_container_set_border_width(GTK_CONTAINER(toolbar),2);
函数原型:

void
gtk_container_set_border_width (GtkContainer *container,
                                guint border_width);

根据官方文档介绍:

Sets the border width of the container.
The border width of a container is the amount of space to leave around the outside of the container. The only exception to this is GtkWindow; because toplevel windows can’t leave space outside, they leave the space inside. The border is added on all sides of the container. To add space to only one side, use a specific “margin” property on the child widget, for example “margin-top”.
也就是说,该函数用于设置容器边界宽度.
该函数是设置所有的边界的宽度,如果想要仅仅设置一个边界的话,可以使用margin,例如”margin-top”.

注意:
由于我在学习GTK的时候,是看的别人的书籍,是基于2.0的,但是现在GTK版本已经升级到3.0了,很多方法都已经发生了改变,不过,这些方法仍然是可以使用的.

举个例子:

函数:

gtk_tool_button_new_from_stock ()

官方上是这样说的:
gtk_tool_button_new_from_stock has been deprecated since version 3.10 and should not be used in newly-written code.
Use gtk_tool_button_new() instead.

我们看一下函数gtk_tool_button_new()的使用
其函数原型为:

GtkToolItem *
gtk_tool_button_new (GtkWidget *icon_widget,                     const gchar *label);

使用icon_widget作为内容和使用label作为标签创建一个新的GtkToolButton
参数:
​label 一个作为标签的字符串或者为NULL
​icon_widget 一个将被用作按钮内容的widget,或者为NULL

返回
​一个新的GtkToolButton
从版本2.4开始使用

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    GTK+2.0中文教程 html格式

    工具栏 Toolbar 笔记本 Notebooks 菜单构件 手工创建菜单 手工菜单示例 使用套件 套件示例 无文档构件 快捷标签 Accel Label 选项菜单 Option Menu 菜单项 Menu Items 复选菜单项 Check Menu Item ...

    GTK+2.0 中文版(基于GNOME官方文档翻译)

    工具栏 Toolbar 笔记本 Notebooks 菜单构件 手工创建菜单 手工菜单示例 使用套件 套件示例 无文档构件 快捷标签 Accel Label 选项菜单 Option Menu 菜单项 Menu Items 复选菜单项 Check Menu ...

    GTK+2.0编程范例.rar

    关于基础的GTK使用,包括窗口和控件,菜单与工具栏,对话框,综合应用

    GPyFSA:fsarchiver的gtk + GUI前端-开源

    fsarchiver的gtk + GUI前端,带有安装工具。 恢复尚未起作用。 计划-v 0.35 ------- -----------------&gt;删除ex菜单,每个选项卡添加一个菜单项,然后在menuitem上绑定打开文件对话框动作&gt;在便捷选项卡中设置适当...

    GTK初步入门

    “菜单” (menubar)和“工具栏”(toolbars) GTK+ 布局管理 GTK+ 中的事件(events)和信号(signals) GTK+中的对话框 GTK+ 中的常用构件(widget) GTK+ 中的常用构件(widget)II

    Linux程序设计 第4版.haozip01

    17.6 kde的菜单和工具栏 620 17.7 使用kde/qt编写cd数据库应用程序 624 17.7.1 主窗口 624 17.7.2 addcddialog 627 17.7.3 logondialog 629 17.7.4 main.cpp 630 17.8 小结 632 第18章 linux标准 633 18.1 c...

    Linux程序设计 第4版.haozip02

    17.6 kde的菜单和工具栏 620 17.7 使用kde/qt编写cd数据库应用程序 624 17.7.1 主窗口 624 17.7.2 addcddialog 627 17.7.3 logondialog 629 17.7.4 main.cpp 630 17.8 小结 632 第18章 linux标准 633 18.1 c...

    myScite:全能口袋大小的代码编辑器。-开源

    翻新的 Scintilla.orgs/SciTE 带有一些额外的补丁。 -功能--完整的MinGW和GTK SDK自动完成。(190+)-做系统脚本(bash,apple... - 提供主题、可自定义的工具栏、带有文件浏览器的侧边栏和清理过的选项菜单。 --- 总结

    myScite:allRound袖珍型CodeEditor。-开源

    翻新了Scintilla.orgs / SciTE,并添加了一些其他补丁程序。 -功能--完整的MinGW和... -提供主题,可自定义的工具栏,带有文件浏览器的边栏和清理选项菜单。 ---总结---享受您的vlc进行sourceCode讲座;)(30种语言)

    汉化必备工具之一 Poedit Pro 2.2 Build 5561 中文多语免费版.zip

    打开一个需要翻译的PO文件,然后在PoEdit菜单栏中选择“类目》使用TM自动翻译”,PoEdit就会自动从翻译词库中提取精确匹配或模糊匹配的翻译。模糊匹配的翻译一般是粗体显示,可以用“CTRL+U”确定,也可以用鼠标右键...

    xtd_forms:现代 c++17 库,用于为 Microsoft Windows、Apple macOS 和 Linux 创建本机 gui

    包含常用控件、容器、菜单、工具栏、组件、各种对话框、... 通过使用事件和委托类轻松捕获控制事件。 所有控件都是原生控件(windows 上的 win32,macOS 上的 cocoa,linux 上的 gtk+3)。 ... 有关详细信息,请...

    精通qt4编程(源代码)

    \4.2.2 工具栏 93 \4.2.3 中心部件 96 \4.3 代码创建主窗口 98 \4.3.1 创建资源文件 98 \4.3.2 定义主窗口类 98 \4.4 锚接部件 102 \4.5 状态栏 105 \4.6 实现文本编辑器功能 107 \4.7 多文档 118 \4.8 打印文档 119...

    精通Qt4编程(第二版)源代码

    \4.2.2 工具栏 93 \4.2.3 中心部件 96 \4.3 代码创建主窗口 98 \4.3.1 创建资源文件 98 \4.3.2 定义主窗口类 98 \4.4 锚接部件 102 \4.5 状态栏 105 \4.6 实现文本编辑器功能 107 \4.7 多文档 118 \4.8 ...

    CurlyAnkles-开源

    CurlyAnkles是在GNU / Linux上用C编写的通用库,并且是为GTK / GNOME编写的。 CurlyAnkles致力于将对接小部件,可自定义的工具栏和菜单与GNOME桌面的易用性相结合。

Global site tag (gtag.js) - Google Analytics