GTK Labels

标签 Labels

标签(Labels)是 GTK 中最常用的构件,实际上它很简单。因为没有相关联的 X 窗口,标签不能引发信号。如果需要获取或引发信号,可以将它放在一个事件盒中,或放在按钮构件里面。

  下面是Labels的使用一个实例,点击按钮,可以打印原来标签的内容,并设置新的内容,具体代码如下: 


  1. /*File:label.c 
  2.  *Date:2013-12-13 
  3.  *Author:sjin 
  4.  *Mail:413977243@qq.com 
  5.  */  
  6.   
  7. #include<gtk/gtk.h>  
  8. GtkWidget *label1;  
  9.   
  10. void callBack(GtkWidget *widget,gpointer data)  
  11. {  
  12.     printf("label1 = %s\n",gtk_label_get_text(GTK_LABEL(label1)));  
  13.     gtk_label_set_text(GTK_LABEL(label1),(char*)data);  
  14.     sleep(1);  
  15.     gtk_main_quit();  
  16.   
  17. }  
  18.           
  19.   
  20. int main(int argc, char*argv[])  
  21. {  
  22.     GtkWidget *window;  
  23.     GtkWidget *box;  
  24.     GtkWidget *label2;  
  25.     GtkWidget *label3;  
  26.     GtkWidget *label4;    
  27.     GtkWidget *frame1;    
  28.     GtkWidget *frame2;    
  29.     GtkWidget *frame3;    
  30.     GtkWidget *frame4;    
  31.     GtkWidget *button;  
  32.     gchar *title ;  
  33.     //初始化GTK  
  34.     gtk_init(&argc,&argv);  
  35.     //创建最上层主窗口  
  36.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  37.     //连接信号"delete_event",使得窗口关闭时发生  
  38.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  39.     //设置窗口标题      
  40.     gtk_window_set_title(GTK_WINDOW(window),"多种样式的标签");  
  41.     //设定窗口的默认宽高  
  42.     //gtk_window_set_default_size(GTK_WINDOW(window),200,300);  
  43.     //设定窗口的位置,让窗口总在最前端  
  44.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  45.     //设定容器边框的宽度  
  46.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  47.   
  48.     //创建盒子  
  49.     box = gtk_vbox_new(FALSE,0);  
  50.     gtk_container_add(GTK_CONTAINER(window),box);  
  51.   
  52.     //创建框架1  
  53.     frame1 = gtk_frame_new("标签一");  
  54.     label1 = gtk_label_new("这是第一个标签,居左边的。This is the first label.");  
  55.     gtk_container_add(GTK_CONTAINER(frame1),label1);  
  56.     /*void gtk_label_set_justify(GtkLabel *label, GtkJustification jtype); 
  57.      * jtype 值:GTK_JUSTIFY_LEFT :左对齐 
  58.      *           GTK_JUSTIFY_RIGHT:右对齐 
  59.      *           GTK_JUSTIFY_CENTER:居中对齐(默认 ) 
  60.      *           GTK_JUSTIFY_FILL:充满 
  61.      */  
  62.     gtk_label_set_justify(GTK_LABEL(label1),GTK_JUSTIFY_LEFT);  
  63.     gtk_box_pack_start(GTK_BOX(box),frame1,FALSE,FALSE,5);  
  64.   
  65.     frame2 = gtk_frame_new("标签二");  
  66.     label2 = gtk_label_new("这是第二个标签,它是多行的。\n这还是第二个标签的内容,它是居右边的。");  
  67.     gtk_container_add(GTK_CONTAINER(frame2),label2);  
  68.     gtk_label_set_justify(GTK_LABEL(label2),GTK_JUSTIFY_RIGHT);  
  69.     //设置下划线  
  70.     gtk_label_set_pattern(GTK_LABEL(label2),"__ __   __  ");  
  71.     gtk_box_pack_start(GTK_BOX(box),frame2,FALSE,FALSE,5);  
  72.   
  73.     frame3 = gtk_frame_new("标签三");  
  74.     label3 = gtk_label_new(NULL);  
  75.     //标记语言形式  
  76.     title = "<span foreground=\"red\"><big><i>这是第三个标签。\n它被格式化成红色了,并且字体也大了。</i></big></span>";  
  77.     gtk_container_add(GTK_CONTAINER(frame3),label3);  
  78.     gtk_label_set_markup(GTK_LABEL(label3),title);  
  79.     gtk_box_pack_start(GTK_BOX(box),frame3,FALSE,FALSE,5);  
  80.   
  81.     frame4 = gtk_frame_new("标签四");  
  82.     label4 = gtk_label_new("这也是一个多行标签,它的换行方式和上一个有所不同,主要是编辑手段不一样了,请仔细查看一下源码就会明白怎么回事了。");  
  83.     gtk_label_set_justify(GTK_LABEL(label1),GTK_JUSTIFY_LEFT);  
  84.     //自动换行函数  
  85.     gtk_label_set_line_wrap(GTK_LABEL(label4),TRUE);  
  86.     gtk_container_add(GTK_CONTAINER(frame4),label4);  
  87.     gtk_box_pack_start(GTK_BOX(box),frame4,FALSE,FALSE,5);  
  88.   
  89.     button = gtk_button_new_with_label("set label1");  
  90.     gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,5);  
  91.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callBack),"set label1 111");  
  92.     gtk_container_add(GTK_CONTAINER(window),button);  
  93.     gtk_widget_show(button);  
  94.       
  95.       
  96.   
  97.     gtk_widget_show_all(window);  
  98.     gtk_main();  
  99.     return FALSE;  
  100. }  
运行结果:

箭头 Arrows
箭头构件(Arrow widget)画一个箭头,面向几种不同的方向,并有几种不同的风格。在许多应用程序中,常用于创建带箭头的按钮。和标签构件一样,它不能引发信号。下面是一个简单的示例:

  1. /*File:arrow.c 
  2.  *Date:2013-12-15 
  3.  *Author:sjin 
  4.  *Mail:413977243@qq.com 
  5.  * */  
  6.   
  7. #include<gtk/gtk.h>  
  8.   
  9. //创建自己按钮的函数  
  10. GtkWidget * create_arrow_button(GtkArrowType arrowtype, GtkShadowType shadowtype )  
  11. {     
  12.     GtkWidget *button;    
  13.     GtkWidget *arrow;  
  14.     button = gtk_button_new();  
  15.     /*void gtk_arrow_new(GtkArrowType arrow_type,GtkShadowType shadow_type); 
  16.      * 创建箭头, 
  17.      *          arrow_type:箭头方向; 
  18.      *               GTK_ARROW_UP:向上 
  19.      *               GTK_ARROW_DOWN:向下 
  20.      *               GTK_ARROW_LEFT:向左 
  21.      *               GTK_ARROW_RIGHT:向右 
  22.      *          shadow_type:箭头阴影类型 
  23.      *               GTK_SHADOW_IN: 
  24.      *               GTK_SHADOW_OUT(): 
  25.      *               GTK_SHADOW_ETCHED_IN: 
  26.      *               GTK_SHADOW_ETCHED_OUT: 
  27.      * 
  28.      */  
  29.     arrow  = gtk_arrow_new(arrowtype,shadowtype);  
  30.     gtk_container_add(GTK_CONTAINER(button),arrow);  
  31.     gtk_widget_show(arrow);  
  32.     return button;  
  33. }  
  34.   
  35. void callBack(GtkWidget *widget,gchar *data)  
  36. {  
  37.     printf("### %s is press\n",(char *)data);  
  38. }  
  39.   
  40. //主函数  
  41. int main(int argc, char*argv[])  
  42. {  
  43.     GtkWidget *window;  
  44.     GtkWidget *box;  
  45.     GtkWidget *arrow1;    
  46.     GtkWidget *arrow2;    
  47.     GtkWidget *arrow3;    
  48.     GtkWidget *arrow4;    
  49.     gchar *title = "方向按钮";  
  50.     //初始化GTK  
  51.     gtk_init(&argc,&argv);  
  52.     //创建最上层主窗口  
  53.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  54.     //连接信号"delete_event",使得窗口关闭时发生  
  55.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  56.     //设置窗口标题      
  57.     gtk_window_set_title(GTK_WINDOW(window),title);  
  58.     //设定窗口的默认宽高  
  59.     //gtk_window_set_default_size(GTK_WINDOW(window),200,300);  
  60.     //设定窗口的位置,让窗口总在最前端  
  61.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  62.     //设定容器边框的宽度  
  63.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  64.   
  65.     //创建盒子  
  66.     box = gtk_hbox_new(FALSE,0);  
  67.     gtk_container_add(GTK_CONTAINER(window),box);  
  68.     gtk_widget_show(box);  
  69.   
  70.     //创建带箭头的按钮,调用自定义的函数  
  71.     arrow1 = create_arrow_button(GTK_ARROW_LEFT,GTK_SHADOW_IN);  
  72.     g_signal_connect(G_OBJECT(arrow1),"clicked",G_CALLBACK(callBack),"向左");  
  73.     gtk_box_pack_start(GTK_BOX(box),arrow1,FALSE,FALSE,13);  
  74.     gtk_widget_show(arrow1);  
  75.   
  76.     arrow2 = create_arrow_button(GTK_ARROW_UP,GTK_SHADOW_OUT);  
  77.     g_signal_connect(G_OBJECT(arrow2),"clicked",G_CALLBACK(callBack),"向上");  
  78.     gtk_box_pack_start(GTK_BOX(box),arrow2,FALSE,FALSE,13);  
  79.     gtk_widget_show(arrow2);  
  80.   
  81.     arrow3 = create_arrow_button(GTK_ARROW_DOWN,GTK_SHADOW_ETCHED_IN);  
  82.     g_signal_connect(G_OBJECT(arrow3),"clicked",G_CALLBACK(callBack),"向下");  
  83.     gtk_box_pack_start(GTK_BOX(box),arrow3,FALSE,FALSE,13);  
  84.     gtk_widget_show(arrow3);  
  85.   
  86.     arrow4 = create_arrow_button(GTK_ARROW_RIGHT,GTK_SHADOW_ETCHED_OUT);  
  87.     g_signal_connect(G_OBJECT(arrow4),"clicked",G_CALLBACK(callBack),"向右");  
  88.     gtk_box_pack_start(GTK_BOX(box),arrow4,FALSE,FALSE,13);  
  89.     gtk_widget_show(arrow4);  
  90.   
  91.     gtk_widget_show(window);  
  92.     gtk_main();  
  93.     return FALSE;  
  94. }  


Tooltips:

工具提示对象(Tooltips)就是当鼠标指针移到按钮或其它构件上并停留几秒时,弹出的文本串。 工具提示对象很容易使用。具体看下面的示例。

  1. /*File:tooltip.c 
  2.  *Date:2013-12-15 
  3.  *Author:sjin 
  4.  *Mail:413977243@qq.com 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8. GtkTooltips *tooltips;  
  9. int ch = 0;  
  10.   
  11. void callback(GtkWidget *widget,gpointer data)  
  12. {  
  13.     //禁用已经激活的工具提示  
  14.     if(ch){  
  15.         gtk_tooltips_disable(tooltips);  
  16.         printf("0000\n");  
  17.         ch = 0;  
  18.     }else{  
  19.         ch = 1;  
  20.         printf("1111\n");  
  21.         gtk_tooltips_enable(tooltips);  
  22.     }  
  23.   
  24. }  
  25.   
  26. int main(int argc, char*argv[])  
  27. {  
  28.     GtkWidget *window;  
  29.     GtkWidget *button;  
  30.   
  31.     //初始化GTK  
  32.     gtk_init(&argc,&argv);  
  33.     //创建最上层主窗口  
  34.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
  35.     //连接信号"delete_event",使得窗口关闭时发生  
  36.     g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);  
  37.     //设置窗口标题      
  38.     gtk_window_set_title(GTK_WINDOW(window),"工具提示对象");  
  39.     //设定窗口的默认宽高  
  40.     //gtk_window_set_default_size(GTK_WINDOW(window),200,300);  
  41.     //设定窗口的位置,让窗口总在最前端  
  42.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);  
  43.     //设定容器边框的宽度  
  44.     gtk_container_set_border_width(GTK_CONTAINER(window),20);  
  45.   
  46.     //创建按钮  
  47.     button = gtk_button_new_with_label("关闭工具提示");  
  48.     gtk_container_add(GTK_CONTAINER(window),button);  
  49.     g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback),NULL);  
  50.     gtk_widget_show(button);  
  51.   
  52.     //创建工具提示  
  53.     tooltips = gtk_tooltips_new();  
  54.     gtk_tooltips_set_tip(tooltips,button,"这是一个工具提示按钮",NULL);  
  55.     gtk_tooltips_disable(tooltips);  
  56.   
  57.     gtk_widget_show_all(window);  
  58.     gtk_main();  
  59.     return FALSE;  
  60. }  

进度条 Progress Bars
进度条用于显示正在进行的操作的状态。

  1. #include <gtk/gtk.h>  
  2.   
  3. typedef struct _ProgressData {  
  4.     GtkWidget *window;  
  5.     GtkWidget *pbar;  
  6.     int timer;  
  7.     gboolean activity_mode;  
  8. }ProgressData;  
  9.   
  10. /* 更新进度条,这样就能够看到进度条的移动 */  
  11. gint progress_timeout( gpointer data )  
  12. {  
  13.     ProgressData *pdata =(ProgressData *)data;  
  14.     gdouble new_val;  
  15.     if (pdata->activity_mode)   
  16.         gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));  
  17.     else   
  18.     {  
  19.         /* 使用在调整对象中设置的取值范围计算进度条的值 */  
  20.         new_val =gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;  
  21.         if (new_val >1.0)  
  22.             new_val =0.0;  
  23.         /* 设置进度条的新值 */  
  24.         gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);  
  25.     }  
  26.     /* 这是一个 timeout 函数,返回 TRUE,这样它就能够继续被调用 */  
  27.     return TRUE;  
  28. }  
  29.   
  30. /* 回调函数,切换在进度条你的滑槽上的文本显示 */  
  31. void toggle_show_text( GtkWidget  *widget,  
  32.         ProgressData *pdata )  
  33. {  
  34.     const gchar *text;  
  35.     text =gtk_progress_bar_get_text (GTK_PROGRESS_BAR (pdata->pbar));  
  36.     if (text && *text)  
  37.         gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "");  
  38.     else   
  39.         gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "some text");  
  40. }  
  41.   
  42. /* 回调函数,切换进度条的活动模式 */  
  43. void toggle_activity_mode( GtkWidget  *widget,  
  44.         ProgressData *pdata )  
  45. {  
  46.     pdata->activity_mode = !pdata->activity_mode;  
  47.     if (pdata->activity_mode)   
  48.         gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));  
  49.     else  
  50.         /**/  
  51.         gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), 0.0);  
  52. }  
  53.   
  54. /* 回调函数,切换进度条的移动方向 */  
  55. void toggle_orientation( GtkWidget  *widget,  
  56.         ProgressData *pdata )  
  57. {  
  58.     /*获得滚动条的移动方向*/  
  59.     switch (gtk_progress_bar_get_orientation (GTK_PROGRESS_BAR (pdata->pbar))) {  
  60.     case GTK_PROGRESS_LEFT_TO_RIGHT:  
  61.         /*设置滚动条移动方向*/  
  62.         gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),   
  63.                 GTK_PROGRESS_RIGHT_TO_LEFT);  
  64.         break;  
  65.     case GTK_PROGRESS_RIGHT_TO_LEFT:  
  66.         gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (pdata->pbar),   
  67.                 GTK_PROGRESS_LEFT_TO_RIGHT);  
  68.         break;  
  69.     default:  
  70.         break;  
  71.         // 什么也不做  
  72.     }  
  73. }  
  74.   
  75. /* 清除分配的内存,删除定时器(timer) */  
  76. void destroy_progress( GtkWidget  *widget,ProgressData *pdata)  
  77. {  
  78.     gtk_timeout_remove (pdata->timer);  
  79.     pdata->timer =0;  
  80.     pdata->window =NULL;  
  81.     g_free (pdata);  
  82.     gtk_main_quit ();  
  83. }  
  84.   
  85. int main( int argc,char *argv[])  
  86. {  
  87.     ProgressData *pdata;  
  88.     GtkWidget *align;  
  89.     GtkWidget *separator;  
  90.     GtkWidget *table;  
  91.     GtkWidget *button;  
  92.     GtkWidget *check;  
  93.     GtkWidget *vbox;  
  94.     gtk_init (&argc, &argv);  
  95.     /* 为传递到回调函数中的数据分配内存 */  
  96.     pdata =g_malloc (sizeof (ProgressData));  
  97.     pdata->window =gtk_window_new (GTK_WINDOW_TOPLEVEL);  
  98.     gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);  
  99.     g_signal_connect (G_OBJECT (pdata->window), "destroy",G_CALLBACK (destroy_progress),pdata);  
  100.     gtk_window_set_title (GTK_WINDOW (pdata->window), "进度条练习");  
  101.     gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);  
  102.   
  103.     vbox =gtk_vbox_new (FALSE, 5);  
  104.     gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);  
  105.     gtk_container_add (GTK_CONTAINER (pdata->window), vbox);  
  106.     gtk_widget_show (vbox);  
  107.   
  108.     /* 创建一个居中对齐的对象 */  
  109.     align =gtk_alignment_new (0.5, 0.5, 0, 0);  
  110.     gtk_box_pack_start (GTK_BOX(vbox), align, FALSE, FALSE, 5);  
  111.     gtk_widget_show (align);  
  112.       
  113.     /* 创建进度条 */  
  114.     pdata->pbar =gtk_progress_bar_new ();  
  115.     gtk_container_add (GTK_CONTAINER (align), pdata->pbar);  
  116.     gtk_widget_show (pdata->pbar);  
  117.       
  118.     /* 加一个定时器(timer),以更新进度条的值 */  
  119.     pdata->timer =gtk_timeout_add (100, progress_timeout, pdata);  
  120.     separator =gtk_hseparator_new ();  
  121.     gtk_box_pack_start (GTK_BOX(vbox), separator, FALSE, FALSE, 0);  
  122.     gtk_widget_show (separator);  
  123.       
  124.     /* 行数、列数、同质性(homogeneous) */  
  125.     table =gtk_table_new (2, 2, FALSE);  
  126.     gtk_box_pack_start (GTK_BOX(vbox), table, FALSE, TRUE, 0);  
  127.     gtk_widget_show (table);  
  128.       
  129.     /* 添加一个复选按钮,以选择是否显示在滑槽里的文本 */  
  130.     check =gtk_check_button_new_with_label ("Show text");  
  131.     gtk_table_attach (GTK_TABLE (table), check, 0, 1, 0, 1,GTK_EXPAND |GTK_FILL, GTK_EXPAND |GTK_FILL,5, 5);  
  132.     g_signal_connect (G_OBJECT (check), "clicked",G_CALLBACK (toggle_show_text),pdata);  
  133.     gtk_widget_show (check);  
  134.   
  135.     /* 添加一个复选按钮,切换活动状态 */  
  136.     check =gtk_check_button_new_with_label ("Activity mode");  
  137.     gtk_table_attach (GTK_TABLE (table), check, 0, 1, 1, 2,GTK_EXPAND |GTK_FILL, GTK_EXPAND |GTK_FILL,5, 5);  
  138.     g_signal_connect (G_OBJECT (check), "clicked",G_CALLBACK (toggle_activity_mode),pdata);  
  139.     gtk_widget_show (check);  
  140.   
  141.     /* 添加一个复选按钮,切换移动方向 */  
  142.     check =gtk_check_button_new_with_label ("Right to Left");  
  143.     gtk_table_attach (GTK_TABLE (table), check, 0, 1, 2, 3,GTK_EXPAND |GTK_FILL, GTK_EXPAND |GTK_FILL,5, 5);  
  144.     g_signal_connect (G_OBJECT (check), "clicked",G_CALLBACK (toggle_orientation),pdata);  
  145.     gtk_widget_show (check);  
  146.   
  147.     /* 添加一个按钮,用来退出应用程序 */  
  148.     button =gtk_button_new_with_label ("close");  
  149.     g_signal_connect_swapped (G_OBJECT (button), "clicked",G_CALLBACK (gtk_widget_destroy),pdata->window);  
  150.     gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);  
  151.   
  152.     /* 将按钮设置为能缺省的构件 */  
  153.     GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);  
  154.     /* 将缺省焦点设置到这个按钮上,使之成为缺省按钮,只要按回车键 
  155.      * 就相当于点击了这个按钮 */  
  156.     //译者注: 能缺省的构件在获取焦点后成为缺省构件,用户按方向键等可以切换焦点。  
  157.     gtk_widget_grab_default (button);  
  158.       
  159.     gtk_widget_show (button);  
  160.     gtk_widget_show (pdata->window);  
  161.       
  162.     gtk_main ();  
  163.       
  164.     return 0;  
  165. }  

运行如下:


参考 资料:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值