PROPHET

吾日三省吾身——为人谋而不忠乎?与朋友交而不信乎?传不习乎?

平平ID:bat603
162420次访问,排名446好友0人,关注者2
计算机、足球
bat603的文章
原创 123 篇
翻译 1 篇
转载 159 篇
评论 163 篇
最近评论
smile2008:pthread_id _threadId;错了
应改为
pthread_t _threadId;

太马虎了
linhanjie:你好!原创 利用libpcap分析网络上的数据包(入门级),看了这篇文章,我也挺关注的!我试了一下啊,通过路由器连接起来的局域网上。好像收到其他电脑的数据包啊!!!
qq : 110024218
flag_and_leg:写得很好,很详细,非常适合我等初学者!
谢谢作者!
qianqiuwanzi:很好,很受益!
i_like_cpp:专业路过。。。。
好动心
文章分类
收藏
    相册
    同学的婚礼
    c/c++
    C++Builder天地
    masterlee
    shell入门
    stl
    STL 中文站
    网友
    linux
    exosip2
    Faq It
    GTK+ 2.0 Tree View Tutorial
    GTK+ 2.0 教程
    GTK+ FAQ
    GTK+2.0库函数
    GTK+中国社区
    huihoo
    Linux频道--中国IT实验室
    MYSQL入门教程
    OSIP2
    qtopia
    为LINUX服务
    嵌入式资讯网
    开源传万世,因有我参与
    陈皓专栏
    电子图书
    e书时空——电子书公益下载中心
    中华电脑书库
    中国E书网 -电子图书下载站
    电子图书
    电子图书下载E书中国电子图书免费下载
    西安信息资源网信息发布电子书下载E书下载
    朋友
    二小
    友亮的小屋
    妹妹
    张阿鹏
    曾在一个屋檐下的老勇
    狗狗窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 gtk/glade程序开发(一)收藏

    新一篇: gtk/glade程序开发(二) | 旧一篇: 用anjuta编译gtk程序时出现类似与"main.c::10:21:gtk/gtk.h:没有那个文件和目录"问题的解决

    转自 http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=kylix&Number=566950&page=0&view=collapsed&sb=4&o=all&fpart=all&vc=1
    by cuigf
    我已经安装好gtk2.0/glade2.10.0,系统环境 RH9
    准备用一个月的时间 对gtk编程做一个介绍,希望大家支持。

    在windows下做开发,把做成的程序转移到Linux.(源代码不做任何修改,只要重新编译、连接一次即可)

    需要的开发工具:
    Dev-cpp 4.9.9.2 (进行C程序的编译、连接)
    Glade (进行图形界面设计)
    Gtk开发组件

    只需两个软件包:
    devcpp-4.9.9.2_setup
    gtk-win32-devel-2.6.8-rc1(包含glade和gtk开发组件)

    下载网址:
    www.bloodshed.net
    gladewin32.sourceforge.net,

    请按上面的版本下载,其它版本有bug。

    下载软件并安装(先装devcpp-4.9.9.2_setup,再安装gtk-win32-devel-2.6.8-rc1,等出现dev-cpp选项时,选中它),

    接下来,来运行我们的第一个程序。

    (点评:作者是在windows下开发移植到Linux下的,本人不推荐这种方法)
    第二节 读懂Glade生成的代码(一)

    在glade的源文件目录src下有7个代码文件,它们分别是:

    1> callbacks.c Glade生成的大部分空的回调函数所在的文件,你自己往里面添加代码
    2> callbacks.h (头文件)Glade生成的回调函数的定义文件
    4> interface.c Glade生成的界面源代码文件
    5> interface.h (头文件)Glade生成的界面的定义文件
    6> main.c 主函数
    7> support.c 支持文件
    8> support.h (头文件)支持文件

    在galde生成的devcpp目录里有2个文件
    1> config.h Glade 生成的配置文件
    2>gtk1.dev Glade 生成的devcpp工程文件(就是你保存时启的那个名子)。

    不要被这么多的文件吓着,需要你自己编写代码的文件只有三个(其它文件不要动),它们是:
    main.c (一般只需做少量的修改)
    callbacks.h (一般只需做少量的修改,甚至不作修改)
    callbacks.c (函数的具体实现部分,你需要在这里编写一定量的代码)

    其中callbacks.c是你编写代码的主文件。

    下面我们来简单了解一下glade生成的界面文件interface.c

    GtkWidget*
    create_window1 (void)
    {
    GtkWidget *window1; /*定义一个窗口构件*/
    GtkWidget *fixed1; /*定义一个固定容器构件,用于放置其它构件*/
    GtkWidget *label1; /*定义一个标签构件*/

    window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*新建一个窗口*/
    gtk_window_set_title (GTK_WINDOW (window1), _("window1")); /*设置窗口的标题*/
    gtk_window_set_default_size (GTK_WINDOW (window1), 400, 300); /*设置窗口的默认大小为400,300*/

    fixed1 = gtk_fixed_new (); /*新建一个固定容器*/
    gtk_widget_show (fixed1); /*显示固定容器*/
    gtk_container_add (GTK_CONTAINER (window1), fixed1); /*添加固定容器到窗口*/

    label1 = gtk_label_new (_("\346\254\242\350\277\216\350\265\260\350\277\233GTK\347\232\204\344\270\226\347\225\214")); /*新建一个标签*/
    gtk_widget_show (label1); /*显示标签*/
    gtk_fixed_put (GTK_FIXED (fixed1), label1, 120, 72); /*把标签添加到固定容器中*/
    gtk_widget_set_size_request (label1, 136, 40); /*设置标签的大小*/

    /* Store pointers to all widgets, for use by lookup_widget(). */
    GLADE_HOOKUP_OBJECT_NO_REF (window1, window1, "window1");
    GLADE_HOOKUP_OBJECT (window1, fixed1, "fixed1");
    GLADE_HOOKUP_OBJECT (window1, label1, "label1");

    return window1;
    }
    (点评:版本不一样,里面的代码可能有一些不同)

    (这部分内容,能理解多少,理解多少,看不懂也不要紧。)
    文件:main.c

    只作部分解释,以后你水平高了,慢慢看吧!
    以下代码节选自main.c

    int main (int argc, char *argv[])
    {
    GtkWidget *window1; /*定义window1构件*/

    gchar *pixmap_dir;
    #ifdef G_OS_WIN32
    package_prefix = g_win32_get_package_installation_directory (NULL, NULL);
    package_data_dir = g_build_filename (package_prefix, "share", NULL);
    package_locale_dir = g_build_filename (package_prefix, "share", "locale", NULL);
    #endif

    #ifdef ENABLE_NLS
    bindtextdomain (GETTEXT_PACKAGE, package_locale_dir);
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
    textdomain (GETTEXT_PACKAGE);
    #endif

    gtk_set_locale (); /*通过调用这个函数才可显示中文*/
    gtk_init (&argc, &argv); /*GTK初始化*/

    pixmap_dir = g_build_filename (package_data_dir, PACKAGE, "pixmaps", NULL);
    add_pixmap_directory (pixmap_dir);
    g_free (pixmap_dir);

    /*
    * The following code was added by Glade to create one of each component
    * (except popup menus), just so that you see something after building
    * the project. Delete any components that you don't want shown initially.
    */
    window1 = create_window1 (); /*创建window1构件*/
    gtk_widget_show (window1); /**显示window1构件/
    g_signal_connect ((gpointer) window1, "destroy", G_CALLBACK(gtk_main_quit),
    NULL);
    /*为window1构件的“destroy”事件,关联函数,
    也就是当单击window1的关闭按钮时,关闭window1,同时退出gtk*/
    gtk_main (); /*gtk主程序开始执行*/

    #ifdef G_OS_WIN32
    g_free (package_prefix);
    g_free (package_data_dir);
    g_free (package_locale_dir);
    #endif

    return 0;
    }

    标签构件

    标签构件用到的有关函数

    创建新标签:
    gtk_label_new(“label1”);
    gtk_label_new_with_mnemonic(“label1”);
    在字符串中放置换行符,可以创建多行标签。

    改变标签的文本:
    gtk_label_set_text(GTK_LABEL(label1),”label2”);

    取得标签的当前文本:
    gtk_label_get_text(GTK_LABEL(label1));

    设置标签文本的对齐方式:
    gtk_label_set_justify(GTK_LABEL(label1),GTK_JUSTIFY_LEFT);

    GTK_JUSTIFY_LEFT /*左对齐*/
    GTK_JUSTIFY_RIGHT /*右对齐*/
    GTK_JUSTIFY_CENTER /*居中对齐*/
    GTK_JUSTIFY_FILL /*充满*/

    标签内的文本自动换行:
    gtk_label_set_line_wrap(GTK_LABEL(label1),TRUE);

    注:标签不能引发信号,如需引发信号,需将标签放置在事件盒中。

    文本输入构件的常用函数:

    创建文本输入构件:
    GtkWidget *entry1;
    entry1 = gtk_entry_new();

    改变文本输入构件当前的文本内容:
    gtk_entry_set_text(GTK_ENTRY(entry1),"entry2");

    取得文本输入构件当前的文本内容:
    const gchar *text1;
    text1 = gtk_entry_get_text(GTK_ENTRY(entry1));

    下一节,通过一个例子来说明文本输入构件(text entry)的使用。

    文本输入构件 (二)


    一、用glade设计界面
    1、新建glade工程

    2、放置各种构件:新建window构件(window1),在window1上放置固定容器构件(fixed positions),在固定容器构件上放置文本输入构件(entry1)。

    3、为文本输入构件entry1添加changed信号响应(其它程序设计语言中为事件响应)on_entry1_changed,一定注意在signals选项卡中把object设置为entry1

    4、单击Build按钮生成源代码。



    二、添加代码


    只需在callbacks.c中添加三行代码



    Callbacks.c

    void on_entry1_changed (GtkEditable *editable,

    gpointer user_data)

    {

    const gchar *text1;

    text1 = gtk_entry_get_text(GTK_ENTRY(editable));

    printf("text entry : %s\n",text1);

    }



    三、运行程序


    在编译程序之前,在devcpp中设置工程属性为“win32控制台程序”

    步骤:1、单击“工程”菜单下的“工程属性”子菜单。

    2、在“普通”选项卡中的“类型”中单击“win32控制台程序”。

    3、单击“确定”。



    编译、运行程序,在文本输入框内随变输入几个英文字母,看看运行效果。
    注:在linux下,操作很简单,点击 glade 的 build 就会自动产生代码,然后运行改目录下的autogen.sh运行make ,就会在
    src 目录下产生可执行的程序.

    组合框构件的常用函数:


    新建组合框构件:

    comboboxentry1 = gtk_combo_box_entry_new_text ();



    给组合框构件的下拉列表添加一个新的项目:

    gtk_combo_box_append_text (GTK_COMBO_BOX (comboboxentry1), _("one"));



    读取组合构件里的文本内容:

    text1 = gtk_combo_box_get_active_text(combobox);



    例子:


    一、用Glade设计界面
    步骤:1、新建Glade工程

    2、依次放置window构件(大小:400,300)、fixed positions(固定容器)构件、comboboxentry(组合框)构件。

    3、在属性面板中,设置comboboxentry1的Item属性为:one (按回车)、two (按回车)、three (按回车)、

    4、为comboboxentry1构件添加changed信号响应(注意:object后的文本框里填写comboboxentry1)。

    5、保存项目,生成代码。



    二、编写代码


    编写代码以前,参照上节内容,设置工程属性为“win32控制台程序”。



    callbacks.h


    void on_comboboxentry1_changed (GtkComboBox *combobox,

    gpointer user_data);



    callbacks.c
    void on_comboboxentry1_changed (GtkComboBox *combobox,

    gpointer user_data)

    {

    gchar *text1;

    text1 = gtk_combo_box_get_active_text(combobox);

    printf("The combo text is : %s \n",text1);

    }



    三、运行程序,观看运行效果

    开关按钮(toggle button)构件


    常用函数:


    创建一个新的开关按钮构件
    GtkWidget *togglebutton1;

    togglebutton1 = gtk_toggle_button_new();

    togglebutton1 = gtk_toggle_button_new_with_label(“toggle button”);

    togglebutton1 = gtk_toggle_button_new_with_mnemonic(“toggle button”);



    读取开关按钮的状态
    gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))



    设置开关按钮的状态
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE)

    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE)



    例子:


    一、设计界面


    步骤:1、新建Glade工程

    2、依次放置window构件(大小:300,200)、fixed positions(固定容器)构件、toggle button(开关按钮)构件。

    3、在属性面板中,设置togglebutton1的 label 属性为“开关按钮” 。

    4、为togglebutton1构件添加clicked信号响应(注意:object后的文本框里填写togglebutton1)。

    5、保存项目,生成代码。



    二、编写代码


    运行以前,设置工程属性为“win32控制台程序”。

    callbacks.c

    void on_togglebutton1_clicked (GtkButton *button,

    gpointer user_data)

    {

    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))

    { printf("toggle button is on \n"); }

    else

    { printf("toggle button is off \n"); }

    }



    三、运行调试
    单选按钮Radio Buttons构件


    单选按钮构件的常用函数:

    创建单选按钮构件的代码:


    /*以下代码节选自interface.c*/



    /*定义构件*/]

    GtkWidget *radiobutton1;

    GSList *radiobutton1_group = NULL;

    GtkWidget *radiobutton2;

    GtkWidget *radiobutton3;



    /* 创建构件的步骤,先定义一个radiobutton构件,

    再把这个radiobutton构件添加到组(radiobutton1_group)中,

    这样,所有的radiobutton构件才能关联成一个整体。
    */

    (注:该文写的不详细,应该是:1.创建一个radiobutton1.
    2.在 radiobutton1的属性栏中的最下方有个 编组 项,选择 radiobutton1.
    3.创建新的radiobutton,按照上面操作,加入 radiobutton1.
    )
    radiobutton1 = gtk_radio_button_new_with_mnemonic (NULL, _("radiobutton1"));

    gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton1), radiobutton1_group);

    radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton1));



    radiobutton2 = gtk_radio_button_new_with_mnemonic (NULL, _("radiobutton2"));

    gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton2), radiobutton1_group);

    radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton2));



    radiobutton3 = gtk_radio_button_new_with_mnemonic (NULL, _("radiobutton3"));

    gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton3), radiobutton1_group);

    radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton3));



    判断单选按钮构件状态的函数(同开关按钮):
    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton1))



    一、用Glade设计界面
    步骤:1、新建glade工程

         2、依此放置 窗口(400,300)、固定位置、三个单选按钮构件。

         3、为三个单选按钮构件,分别添加toggled信号响应,object后分别填写:radiobutton1,radiobutton2,radiobutton3。

         4、保存工程,并生成代码。

    二、修改代码
    Interface.c

    g_signal_connect_swapped ((gpointer) radiobutton1, "toggled",

    G_CALLBACK (on_radiobutton1_toggled),

    GTK_OBJECT (radiobutton1));

    g_signal_connect_swapped ((gpointer) radiobutton2, "toggled",

    G_CALLBACK (on_radiobutton2_toggled),

    GTK_OBJECT (radiobutton2));

    g_signal_connect_swapped ((gpointer) radiobutton3, "toggled",

    G_CALLBACK (on_radiobutton3_toggled),

    GTK_OBJECT (radiobutton3));



    Callbacks.h

    void on_radiobutton1_toggled (GtkToggleButton *radiobutton1,

    gpointer user_data);

    void on_radiobutton2_toggled (GtkToggleButton *radiobutton2,

    gpointer user_data);



    void on_radiobutton3_toggled (GtkToggleButton *radiobutton3,

    gpointer user_data);



    Callbacks.c



    void on_radiobutton1_toggled (GtkToggleButton *radiobutton1,

    gpointer user_data)

    {

    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton1)))

    {

    printf("radiobutton1 is True\n");

    }

    }



    void on_radiobutton2_toggled (GtkToggleButton *radiobutton2,

    gpointer user_data)

    {

    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton2)))

    {

    printf("radiobutton2 is True\n");

    }

    }



    void on_radiobutton3_toggled (GtkToggleButton *radiobutton3,

    gpointer user_data)

    {

    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radiobutton3)))

    {

    printf("radiobutton3 is True\n");

    }

    }

    发表于 @ 2006年08月23日 00:40:00|评论(loading...)|编辑

    新一篇: gtk/glade程序开发(二) | 旧一篇: 用anjuta编译gtk程序时出现类似与"main.c::10:21:gtk/gtk.h:没有那个文件和目录"问题的解决

    评论

    #prophet 发表于2006-08-23 01:11:00  IP: 221.192.160.*
    组合框中的操作在运行时产生的错误是:
    ./combo1: relocation error: ./combo1: undefined symbol: gtk_combo_box_entry_new_text

    怀疑是glade提供的代码和 gtk 本身的代码不兼容的原因.
    #liujia_rui 发表于2008-06-17 11:37:29  IP: 220.201.36.*
    有个疑问
    组合框构件的常用函数,里面没有设置组合框当前显示项的函数。。。
    能指导下么?
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © rainfish