GTK(二)

放假回来后,现在在准备考试,本来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……^_^
 
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(599) | 评论(0) | 转发(0) |
0

上一篇:GTK(一)

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

给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值