Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174214
  • 博文数量: 35
  • 博客积分: 287
  • 博客等级: 二等列兵
  • 技术积分: 353
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-02 21:01
个人简介

君子务本,本立则道生。

文章分类
文章存档

2014年(4)

2013年(12)

2012年(19)

分类: C/C++

2012-05-03 15:50:26

放假回来后,现在在准备考试,本来Linux课是不想来上的,听说要点名,就来了,NND,竟然没有点,好吧,找点事情做吧,就继续写写GTK吧。
首先附上一段代码


  1. #include<gtk/gtk.h>
  2. #include<string.h>
  1. void closeApp(GtkWidget *window,gpointer data)
  2. {
  3.     gtk_main_quit();
  4. }


  5. void click_ok(GtkWidget *button,gpointer data)
  6. {
  7.     const char *password=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)data));
  8.     if(strcmp("secert",password)==0)
  9.         printf("OK!Access granted!\n");
  10.     else
  11.         printf("Access denied!\n");
  12. }

  13. int main(int argc,char *argv[])
  14. {
  15.     GtkWidget *window;

  16.     GtkWidget *username_label,*username_entry;
  17.     GtkWidget *password_label,*password_entry;

  18.     GtkWidget *button;
  19.     GtkWidget *hbox1;
  20.     GtkWidget *hbox2;
  21.     GtkWidget *vbox;
  22.     
  23.     gtk_init(&argc,&argv);
  24.     
  25.     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  26.     username_label=gtk_label_new("username");
  27.     username_entry=gtk_entry_new();
  28.     password_label=gtk_label_new("password");
  29.     password_entry=gtk_entry_new();
  30.     gtk_entry_set_visibility(GTK_ENTRY(password_entry),FALSE);
  31.     button=gtk_button_new_with_label("ok");
  32.     hbox1=gtk_hbox_new(TRUE,5);
  33.     hbox2=gtk_hbox_new(TRUE,5);
  34.     vbox=gtk_vbox_new(FALSE,10);

  35.     g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(closeApp),NULL);
  36.     gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  37.     
  38.     gtk_box_pack_start(GTK_BOX(hbox1),username_label,TRUE,FALSE,5);
  39.     gtk_box_pack_start(GTK_BOX(hbox1),username_entry,TRUE,FALSE,5);
  40.     gtk_box_pack_start(GTK_BOX(hbox2),password_label,TRUE,FALSE,5);
  41.     gtk_box_pack_start(GTK_BOX(hbox2),password_entry,TRUE,FALSE,5);
  42.     gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);
  43.     gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,5);
  44.     gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);

  45.     g_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(click_ok),password_entry);


  46.     gtk_container_add(GTK_CONTAINER(window),vbox);


  47.     gtk_widget_show_all(window);
  48.     gtk_main();
  49.     return 0;
  50. }


OK!  编译运行:
 
因为我只是个菜鸟吧,所以只能写写简单基础的东西,so大家不要鄙视哈,呵呵……

解析:
1、这个程序运行的结果是一个登录窗口,窗口中有两个label,两个enter,一个button

2、所以在代码中需要创建这几个构件
    代码的18到50行

3、光创建构件是不够的,需要把构件放在一个box里面,然后box  add到window中
     3.1 代码的44到50行就做了这样的一个工作
      先是把username_label和username_entry放在hbox1中,这里调用了函数gtk_box_pack_start();
这个函数的原型:
gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean expand,gboolean fill,gunit padding);
GtkBox *box:被填充的组装盒
GtkWidget *child:要放入组装盒的构件
gboolean expand:如果为TRUE,则这个构建将填充与其他这个参数也设为TRUE的构件共享的所有的可用空间
gboolean fil:如够为TRUE,则这个构件将填充满分配给他的空间,而不是将它作为围绕他的边缘填充。只有当expand为TRUE时,才有效
gunit padding:围绕在构件周围的以像素为单位的填充。
   3.2  之后,将password_label和password_entry放入hbox2中
 3.3  将hbox1,hbox2,button放在vbox中
 3.4  将vbox放入window中
4、回调函数、信号、事件:
      当触发某个事件的时候,发出一个信号,告诉回调函数,对他说:兄弟,有人揍我,帮我打他,于是回调函数开始执行。对于回调函数和信号的语句怎么写呢?:
      回调函数原型:void a callback_function(GtkWidget *widget,gpointer user_data);例如 程序中的closeApp和click_ok;
      声明了回调函数,那我们怎么用他呢? 要要回调函数帮忙的话,首先要和他搞好关系嘛,是吧,好吧,我承认在这个世界上,搞好关系是很重要的,好吧,回到正题,要连接回调函数其实是很简单的事情:
     gunlong g_signal_connect(gypointer *object,const gchar *name,GCallback func,gpointer user_data);
好吧,其中gpointer其实相当于void *;
注意
第一个参数是object,所以在上述代码中需要强制类型转换,GTK_OBJECT(......),这个参数是指所要操作的对象;
第二个参数是当什么事件触发的时候找人帮忙,比如上述代码中的"destroy","clicked";
第三个参数是要调用的函数
第四个参数是给回调函数所传的参数

         


ok!关于GTK的学习笔记,今天就写道这,BYE……^_^
 
阅读(2300) | 评论(0) | 转发(0) |
0

上一篇:GTK(一)

下一篇:判断是不是LL1文法

给主人留下些什么吧!~~