Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370628
  • 博文数量: 100
  • 博客积分: 2500
  • 博客等级: 大尉
  • 技术积分: 1209
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-15 21:24
文章分类

全部博文(100)

文章存档

2011年(100)

分类: LINUX

2011-07-14 13:56:46

1:开始
      从hello开始吧。
  1. #include <gtk/gtk.h>

  2. static void
  3. hello(GtkWidget *widget, gpointer data)
  4. {
  5.     g_print("Hello world\n");
  6. }

  7. static gboolean
  8. delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
  9. {
  10.     g_print("delete event occurred\n");
  11.     return TRUE;
  12. }

  13. static void
  14. destroy(GtkWidget *widget, gpointer data)
  15. {
  16.     gtk_main_quit();
  17. }

  18. int
  19. main(int argc, char **argv)
  20. {
  21.     GtkWidget *window;
  22.     GtkWidget *button;

  23.     gtk_init(&argc, &argv);

  24.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  25.     g_signal_connect(window, "delete-event", G_CALLBACK(delete_event), NULL);
  26.     g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);
  27.     gtk_container_set_border_width(GTK_CONTAINER(window), 10);

  28.     button = gtk_button_new_with_label("Hello world");
  29.     g_signal_connect(button, "clicked", G_CALLBACK(hello), NULL);

  30.     g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
  31.     
  32.     gtk_container_add(GTK_CONTAINER(window), button);

  33.     gtk_widget_show(button);
  34.     gtk_widget_show(window);

  35.     gtk_main();

  36.     return 0;
  37. }

  1. ozo@ozo:~/work/gtk/hello$ gcc `pkg-config --cflags --libs gtk+-2.0` -Wall -O2 -o hello hello.c
  2. ozo@ozo:~/work/gtk/hello$ ./hello
  3. Hello world

我们可爱的"Hello world"。

  • 初始化gtk环境
  • 新建窗口
  • 注册窗口事件
  • 设置窗口属性
  • 新建按钮
  • 设置按钮属性
  • 注册按钮事件
  • 添加按钮到窗口
  • 显示按钮
  • 显示窗口
  • 进入主循环
和前面差不多,多了,事件注册,我们可以想想和VC界面编程有点类似,不过过程简单多了。

2:注
  1. gulong g_signal_connect( gpointer *object,
  2.                          const gchar *name,
  3.                          GCallback func,
  4.                          gpointer func_data );
  • object:发出信号的对象(例如窗口、按钮)
  • name:发出什么样的信号(例如按下按钮)
  • func:触发信号后做什么(例如按下按钮输出hello world)
  • func_data:额外传输参数的地方
  1. void callback_func( GtkWidget *widget,
  2.                     ... /* other signal arguments */
  3.                     gpointer callback_data );
  • widget:谁发出的信号
  • callback_data:传过来的参数

  1. gulong g_signal_connect_swapped( gpointer *object,
  2.                                  const gchar *name,
  3.                                  GCallback func,
  4.                                  gpointer *callback_data );
  • 和g_signal_connect类似,不同的我们可以看出来就是发信号的对象和用户数据位置交换了

  1. void callback_func( gpointer callback_data,
  2.                     ... /* other signal arguments */
  3.                     GtkWidget *widget);
看出来了吧,位置换了,

3:事件列表

  1. event
  2. button_press_event
  3. button_release_event
  4. scroll_event
  5. motion_notify_event
  6. delete_event
  7. destroy_event
  8. expose_event
  9. key_press_event
  10. key_release_event
  11. enter_notify_event
  12. leave_notify_event
  13. configure_event
  14. focus_in_event
  15. focus_out_event
  16. map_event
  17. unmap_event
  18. property_notify_event
  19. selection_clear_event
  20. selection_request_event
  21. selection_notify_event
  22. proximity_in_event
  23. proximity_out_event
  24. visibility_notify_event
  25. client_event
  26. no_expose_event
  27. window_state_event

4:事件类型列表
  1. GDK_NOTHING
  2. GDK_DELETE
  3. GDK_DESTROY
  4. GDK_EXPOSE
  5. GDK_MOTION_NOTIFY
  6. GDK_BUTTON_PRESS
  7. GDK_2BUTTON_PRESS
  8. GDK_3BUTTON_PRESS
  9. GDK_BUTTON_RELEASE
  10. GDK_KEY_PRESS
  11. GDK_KEY_RELEASE
  12. GDK_ENTER_NOTIFY
  13. GDK_LEAVE_NOTIFY
  14. GDK_FOCUS_CHANGE
  15. GDK_CONFIGURE
  16. GDK_MAP
  17. GDK_UNMAP
  18. GDK_PROPERTY_NOTIFY
  19. GDK_SELECTION_CLEAR
  20. GDK_SELECTION_REQUEST
  21. GDK_SELECTION_NOTIFY
  22. GDK_PROXIMITY_IN
  23. GDK_PROXIMITY_OUT
  24. GDK_DRAG_ENTER
  25. GDK_DRAG_LEAVE
  26. GDK_DRAG_MOTION
  27. GDK_DRAG_STATUS
  28. GDK_DROP_START
  29. GDK_DROP_FINISHED
  30. GDK_CLIENT_EVENT
  31. GDK_VISIBILITY_NOTIFY
  32. GDK_NO_EXPOSE
  33. GDK_SCROLL
  34. GDK_WINDOW_STATE
  35. GDK_SETTING

阅读(2047) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~