放假回来后,现在在准备考试,本来Linux课是不想来上的,听说要点名,就来了,NND,竟然没有点,好吧,找点事情做吧,就继续写写GTK吧。
首先附上一段代码
- #include<gtk/gtk.h>
- #include<string.h>
- void closeApp(GtkWidget *window,gpointer data)
- {
- gtk_main_quit();
- }
- void click_ok(GtkWidget *button,gpointer data)
- {
- const char *password=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)data));
- if(strcmp("secert",password)==0)
- printf("OK!Access granted!\n");
- else
- printf("Access denied!\n");
- }
- int main(int argc,char *argv[])
- {
- GtkWidget *window;
- GtkWidget *username_label,*username_entry;
- GtkWidget *password_label,*password_entry;
- GtkWidget *button;
- GtkWidget *hbox1;
- GtkWidget *hbox2;
- GtkWidget *vbox;
-
- gtk_init(&argc,&argv);
-
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- username_label=gtk_label_new("username");
- username_entry=gtk_entry_new();
- password_label=gtk_label_new("password");
- password_entry=gtk_entry_new();
- gtk_entry_set_visibility(GTK_ENTRY(password_entry),FALSE);
- button=gtk_button_new_with_label("ok");
- hbox1=gtk_hbox_new(TRUE,5);
- hbox2=gtk_hbox_new(TRUE,5);
- vbox=gtk_vbox_new(FALSE,10);
- g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(closeApp),NULL);
- gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
-
- gtk_box_pack_start(GTK_BOX(hbox1),username_label,TRUE,FALSE,5);
- gtk_box_pack_start(GTK_BOX(hbox1),username_entry,TRUE,FALSE,5);
- gtk_box_pack_start(GTK_BOX(hbox2),password_label,TRUE,FALSE,5);
- gtk_box_pack_start(GTK_BOX(hbox2),password_entry,TRUE,FALSE,5);
- gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);
- gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,5);
- gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5);
- g_signal_connect(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(click_ok),password_entry);
- gtk_container_add(GTK_CONTAINER(window),vbox);
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
- }
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) |