gtk-3.0学习笔记2-hellword

来源:互联网 发布:立极尺绘图罗盘软件 编辑:程序博客网 时间:2024/06/05 17:45

打开codeBlock创建一个空的文件或者项目,如果是空的项目请子空项目下创建一个空文件,具体过程不再描述。
我们这名为helloword/helloword.c

创建一个窗口

#include <gtk/gtk.h>static void activate(GtkApplication *app,gpointer user_data) {    GtkWindow *win;    win = gtk_application_window_new(app);    gtk_window_set_title(GTK_WINDOW(win), "my first gtk-3 window");    gtk_window_set_default_size(GTK_WINDOW(win),500,500);    gtk_widget_show_all(win);}int main(int argc, char **argv){    GtkApplication *app;    int status;    app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);    g_signal_connect(app,"activate",G_CALLBACK(activate),NULL);    status = g_application_run(G_APPLICATION(app),argc,argv);    g_object_unref(app);    return status;}

您可以使用GCC编译上述程序:在终端中编译

        gcc `pkg-config --cflags gtk+-3.0` -o helloword helloword.c `pkg-config --libs gtk+-3.0`

有关如何编译GTK +应用程序的更多信息,请参阅本参考中的“ 笔记1” 部分。

当然,所有GTK +应用程序都将包含 gtk/gtk.h,它声明了GTK +应用程序所需的功能,类型和宏。
即使GTK +安装了多个头文件,也只能gtk/gtk.h由第三方代码直接包含顶层标题。如果直接包含任何其他标 题,编译器会中止错误。

在GTK +应用程序中,该main()功能的目的是创建一个GtkApplication对象并运行它。在这个例子中,一个名为的 GtkApplication指针app被调用,然后使用它初始化gtk_application_new()。

接下来, 激活信号 连接到activate()功能上方的main()功能。activate当您的应用程序启动时,信号将在g_application_run()下面的行上发送 。的gtk_application_run()也需要作为参数的指针指向命令行参数计数器和串阵列; 这允许GTK +解析特定的控制GTK +本身行为的命令行参数。解析的参数将从数组中移除,使您无法识别的参数用于解析。

在g_application_run内activate(),发送信号,然后我们进入应用程序的activate()函数。在activate()函数内部,我们要构建我们的GTK窗口,以便在应用程序启动时显示一个窗口。调用gtk_application_window_new()将创建一个新的GtkWindow并将其存储在 window指针中。窗口将有一个框架,标题栏和窗口控件取决于平台。

使用窗口标题设置gtk_window_set_title()。此函数使用GtkWindow 指针和字符串作为输入。由于我们的 window指针是GtkWidget指针,因此我们需要将其转换为GtkWindow 。但不是铸造window通过 (GtkWindow*), window可以使用宏来投 GTK_WINDOW()。 GTK_WINDOW()将检查指针是否是GtkWindow类的实例,在转换之前,如果检查失败,则会发出警告。有关此约定的更多信息,请参见 此处。

最后,使用gtk_window_set_default_size设置窗口大小,然后由GTK通过窗口显示gtk_widget_show_all()。

当您退出窗口时,例如按下X,g_application_run()在主循环中返回一个保存在名为“status”的整数中的数字。之后, GtkApplication对象从内存中释放出来g_object_unref()。最后返回状态整数,GTK应用程序退出。

程序运行时,GTK +正在接收 事件。这些通常是由用户与程序交互引起的输入事件,也是窗口管理器或其他应用程序的消息。GTK +处理这些,结果可能会在您的小部件上发出信号。连接这些信号的处理程序是您通常使程序做出响应用户输入的操作。

以下示例稍微复杂一点,并尝试展示GTK +的一些功能。
在编程语言和图书馆的悠久传统中,它被称为Hello,World。

#include <gtk/gtk.h>static voidprint_hello (GtkWidget *widget,             gpointer   data){  g_print ("Hello World\n");}static void activate (                      GtkApplication *app,gpointer user_data){  GtkWidget *window;  GtkWidget *button;  GtkWidget *button_box;  window = gtk_application_window_new (app);  gtk_window_set_title (GTK_WINDOW (window), "Hello Word");  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);  button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);  gtk_container_add (GTK_CONTAINER (window), button_box);  button = gtk_button_new_with_label ("Hello World");  //G_CALLBACK()回调函数 button的点击事件  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);  //点击之后关闭程序窗口  //g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);  //把button加入到button_box中  gtk_container_add (GTK_CONTAINER (button_box), button);  gtk_widget_show_all (window);}intmain (int    argc,      char **argv){  GtkApplication *app;  int status;  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);  status = g_application_run (G_APPLICATION (app), argc, argv);  g_object_unref (app);  return status;}

如上所述,我们的窗口中添加一个按钮,使用标签“Hello World”进一步构建了例如0.c。两个新的GtkWidget指针声明来实现这一点,button和 button_box。button_box变量被创建为存储一个 GtkButtonBox,它是GTK +控制按钮的大小和布局的方式。所述GtkButtonBox被创建并分配给gtk_button_box_new()它接受一个 GtkOrientation枚举作为参数。此框将包含的按钮可以水平或垂直存储,但在这种特殊情况下无关紧要,因为我们仅处理一个按钮。在水平方向初始化button_box之后,

gtk_container_add() 向容器内添加部件

接下来,button以类似的方式初始化变量。 gtk_button_new_with_label()被调用返回一个GtkButton存储在里面 button。随后button被添加到我们的button_box。使用g_signal_connect,按钮被连接到我们应用程序中的一个函数 print_hello(),所以当按钮被点击时,GTK会调用这个函数。由于该print_hello()函数不使用任何数据作为输入,因此将NULL传递给它。使用字符串“Hello World” print_hello()调用g_print(),如果GTK应用程序从一个启动,将在终端中打印Hello World。

连接后print_hello(),另一个信号连接到使用按钮的“点击”状态g_signal_connect_swapped()。这个功能类似于一个g_signal_connect()区别在于如何处理回调函数。g_signal_connect_swapped()允许您通过让您将其作为数据传递来指定回调函数应该作为参数。在这种情况下,被调用的函数是gtk_widget_destroy()并且window 指针被传递给它。这样做的效果是当按钮被点击时,整个GTK窗口被销毁。相比之下,如果使用正常的g_signal_connect()连接“点击”信号gtk_widget_destroy(),那么它button 本身将被毁坏,而不是窗口。有关创建按钮的更多信息,请 点击此处。

原创来自翻译

0 0