Linux 版 (精华区)

发信人: netiscpu (平淡是真), 信区: Linux
标  题: GTK入门导引(10)
发信站: 紫 丁 香 (Mon Dec 14 14:42:56 1998), 转信


发信人: hey (吟风·悠游98), 信区: Unix
标  题: GTK入门导引(10)
发信站: 华南网木棉站 (Tue Nov 10 11:02:10 1998), 转信

10. 其它物件

10.1 标签 

标签在GTK中用得很多, 而且很简单. 标签不送信号, 因为它们跟X window没
有关系. 如果您要接取信号, 或裁切, 可用EventBox物件. 

产生新的标签可用: 

    GtkWidget* gtk_label_new (char *str);

唯一个参数是您想要显示的文字. 

在产生标签后要改变其文字, 可用: 

    void gtk_label_set (GtkLabel  *label,
                        char      *str);

第一个参数是刚才所产生的标签(使用GTK_LABEL巨集来分派), 第二个是新
的字串. 

新字串的空间会自动被配置. 

要取得目前的字串可用: 

    void gtk_label_get (GtkLabel  *label,
                        char     **str);

第一个参数是标签, 第二个是返回字串的位置. 

10.2 Progress Bars 

Progress bars是用来显示某个作业的操作状态. 他们很容易使用, 您会看到以
下的程式. 我们先来产生一个Progress Bar. 

    GtkWidget *gtk_progress_bar_new (void);

这样就产生了, 够简单的了. 

    void gtk_progress_bar_update (GtkProgressBar *pbar, gfloat percentage);

第一个参数是您要操作的Progress Bar, 第二个是完成度, 其值为0-1. 

Progress Bars一般与timeouts及其它函数一起使用, (see section on Timeouts,
I/O and Idle Functions) 这是因为多工的考量. gtk_progress_bar_update会处
理这方面的事务. 

这里是使用Progress Bar的范例, 并用timeouts来更新. 同时也会展示如何重设
Progress Bar. 


    #include <gtk/gtk.h>

    static int ptimer = 0;
    int pstat = TRUE;

    /* This function increments and updates the progress bar, it also resets
     the progress bar if pstat is FALSE */
    gint progress (gpointer data)
    {
        gfloat pvalue;
        
        /* get the current value of the progress bar */
        pvalue = GTK_PROGRESS_BAR (data)->percentage;
        
        if ((pvalue >= 1.0) || (pstat == FALSE)) {
            pvalue = 0.0;
            pstat = TRUE;
        }
        pvalue += 0.01;
        
        gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);
        
        return TRUE;
    }

    /* This function signals a reset of the progress bar */
    void progress_r (void)
    {  
        pstat = FALSE;  
    }

    void destroy (GtkWidget *widget, gpointer *data)
    {
        gtk_main_quit ();
    }

    int main (int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *button;
        GtkWidget *label;
        GtkWidget *table;
        GtkWidget *pbar;
        
        gtk_init (&argc, &argv);
        
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        
        gtk_signal_connect (GTK_OBJECT (window), "destroy",
                            GTK_SIGNAL_FUNC (destroy), NULL);
        
        gtk_container_border_width (GTK_CONTAINER (window), 10);
        
        table = gtk_table_new(3,2,TRUE);
        gtk_container_add (GTK_CONTAINER (window), table);
        
        label = gtk_label_new ("Progress Bar Example");
        gtk_table_attach_defaults(GTK_TABLE(table), label, 0,2,0,1);
        gtk_widget_show(label);
        
        /* Create a new progress bar, pack it into the table, and show it */
        pbar = gtk_progress_bar_new ();
        gtk_table_attach_defaults(GTK_TABLE(table), pbar, 0,2,1,2);
        gtk_widget_show (pbar);
        
        /* Set the timeout to handle automatic updating of the progress bar */
        ptimer = gtk_timeout_add (100, progress, pbar);
        
        /* This button signals the progress bar to be reset */
        button = gtk_button_new_with_label ("Reset");
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (progress_r), NULL);
        gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1,2,3);
        gtk_widget_show(button);
        
        button = gtk_button_new_with_label ("Cancel");
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (destroy), NULL);
        
        gtk_table_attach_defaults(GTK_TABLE(table), button, 1,2,2,3);
        gtk_widget_show (button);
        
        gtk_widget_show(table);
        gtk_widget_show(window);
        
        gtk_main ();
        
        return 0;
    }

在这个小程式中有四个区域在一般的Progress Bar操作上, 我们会一个一个看
到. 

    pbar = gtk_progress_bar_new ();

产生Progress Bar, pbar. 

    ptimer = gtk_timeout_add (100, progress, pbar);

使用timeouts来产生一个固定时间间隔, Progress Bar不见的一定要用
timeouts. 

    pvalue = GTK_PROGRESS_BAR (data)->percentage;

这行指定目前的值. 

    gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);

最后, 这行更新Progress Bar的值. 

这就是Progress Bars, enjoy. 

10.3 对话盒 

对话盒物件很简单, 是个预先做好的视窗. 对话盒的结构如下: 

    struct GtkDialog
    {
          GtkWindow window;
        
          GtkWidget *vbox;
          GtkWidget *action_area;
    };

您看到, 它就是产生一个新的视窗. 然后包一个vbox到它上面, 接著一个
seperator, 然后是hbox给"action_area". 

对话盒是用于通告讯息, 及类似用途. 这很基本, 只有一个函数: 

    GtkWidget* gtk_dialog_new (void);

因此要产生新的对话盒, 

    GtkWidget window;
    window = gtk_dialog_new ();

这会产生对话盒, 然后您可以任意使用它. 然后将按钮包装到action_area, 像这
样: 

    button = ...
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
                        TRUE, TRUE, 0);
    gtk_widget_show (button);

然后您也可以用封装新增一个vbox, 例如, 一个新标签, 试试看: 

    label = gtk_label_new ("Dialogs are groovy");
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE,
                        TRUE, 0);
    gtk_widget_show (label);

做为一个对话盒的范例, 你可以使用两个按钮在action_area, 一个Cancel及Ok
按钮, 及一个标签在vbox area, 问使用者一个问题或提示错误的发生等等. 然后
您可以接到不同的信号上来处理使用者的选择. 

10.4 Pixmaps 

Undocumented. 

10.5 Images 

Undocumented. 
--
        6m3m┌───────────────────────┐0m
        6m3m│     4m疾如风,徐如林,侵掠如火,不动如山       3m│4m 0m
        6m3m└───────────────────────┘0m4m 0m
          4m                                                 0m

m;32m※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.212.66]m
--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.659毫秒