📜  如何使用GTK Toolkit在C编程中创建GUI

📅  最后修改于: 2021-05-25 20:19:06             🧑  作者: Mango

GTK简介

许多编程语言都将GUI改进作为其语言亮点的核心之一。 C没有与之连接的库,例如字符串库,IO库等,我们时常会使用它。这种弱点为工程师从C语言中可访问的各种GUI库工具箱中选择提供了广阔的前景。GTK+是其中之一。它代表GIMP(GNU图像处理程序)工具包,可用于对当前的GUI界面进行编程。

GTK +的好处是它稳定发达,其起点可以追溯到X Windows的过去,构成了Linux的中心GUI布局。 GTK完全用C编写,而我们在Linux中经常使用的GTK +编程也用C编写。工作区管理员,例如GNOME和XFCE ,同样是利用GTK制造的。

GTK +应用程序不仅限于Linux阶段,还包括:它也很可能也可以移植到非UNIX / Linux阶段。

在这里,我们将紧扣GTK +的基本类型,它是Linux平台上的C语言。下载GTK +的官方网页是https://www.gtk.org。该站点包含API文档,指导性练习以及其他与GTK一起经常使用的Gnome库。说实话,GTK是基于库的,例如,

  • ATK:该库为创建可访问性工具(如粘滞键,屏幕阅读器等)提供帮助。
  • Glib:这是一个通用的实用程序库,可为线程,动态加载,事件循环,低级数据结构等提供帮助。
  • GObject:该库在不使用C++的情况下提供了C语言中功能全面的面向对象的帮助。该库鼓励为不同语言进行语言绑定,从而使您可以轻松访问C API。
  • GdkPixBuf:该库提供图片控制功能。
  • GDK(GIMP绘图工具包):这是设计库,可提供Xlib之上的低级绘图功能。
  • Pango:此库有助于内容和设计渲染
  • Xlib:该库为Linux系统提供底层图形支持

在使用GTK编写代码时,我们通常会发现大量原始数据类型都以’ g ‘作为前缀,如下所示:

  • int
  • gchar,
  • 短裤
  • gpointer,
  • 等等。

这些数据类型保证了可以在任何平台上重新编译代码而无需进行任何改进。这些库中对这些数据类型进行了表征,以帮助使其与平台无关

GUI编程固有的面向对象是主要问题。在这种情况下,程序世界观并不完全适合该方案。因此,无论GTK用C编写如何,它都会通过GObject提供面向对象的帮助。请注意,此项安排的帮助与C++无关。 C++有自己的GTK库,称为gtkmm 。 GObject鼓励使用一部分面向对象的原理,类似于多态和在宏的帮助下进行继承。下图说明了层次关系。

GtkWindow继承了GtkBin ,它本身是GtkContainer的子;以这种方式,GtkWindow的对象可以调用GtkBin或GtkContainer中定义的函数。这是GTK用C语言实现的面向对象的示例。

带有GTK的GUI

让我们从C中的第一个GTK代码中了解几件事。

  • 首先,我们合并头文件。它包含了制作GUI所需的所有文件,包括Glib库。
    #include 
  • 当前,我们声明一个指向GtkWidget指针,这只是我们情况的一个窗口。此外,另一个GtkWidget指针将是该按钮。检查GtkWidget是层次结构中小部件的顶级存储类型。
    GtkWidget *window;
    GtkWidget *button;
  • 接下来,我们通过传递main函数的命令行参数来调用gtk_init函数来初始化GTK +库。
    gtk_init(&argc, &argv);
  • 所有GTK +应用程序均已恢复原状;这是“绝对必要”的声明。它解析命令参数行并返回到应用程序。因此,可以利用这些参数来改变应用程序的运行时间。
  • 现在,我们创建窗口和按钮。
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    button = gtk_button_new_with_label
       ("Click Me!");
  • 窗口类型值GTK_WINDOW_TOPLEVEL表示所创建的窗口将是标准框架窗口。其他排序值可能是GTK_WINDOW_POPUP,这意味着将创建无框架对话窗口。
  • 当我们创建一个窗口时,它必须是可关闭的,以使客户端应该以任何方式准备关闭应用程序,因为客户端点击右上角会关闭窗口。这意味着窗口必须具有对事件(关闭事件)作出反应的选项。
  • 像所有窗口系统一样,GTK +还执行事件和事件处理程序。由于传输信号的代码位于特定对象的内部,因此我们必须组成一个接口回调函数。
  • 常规回调函数的组织为:
    void my_callback_function(GtkWidget *widget, gpointer data);
  • 主要参数表示产生信号的窗口小部件,而后续参数是可以出于任何原因使用的void指针。遵循这些原则,用于处理窗口关闭事件的回调函数将如下所示:
    void destroy( GtkWidget *widget, gpointer   data )
    {
       gtk_main_quit ();
    }
    
  • 函数gtk_main_quit()关闭应用程序。目前,我们应该将window对象与callback函数接口。
    g_signal_connect (window, "destroy",
                      G_CALLBACK (destroy),
                      NULL);
  • 同样,我们使回调函数处理按钮事件并将其与按钮小部件关联。
    void greet( GtkWidget *widget, gpointer data )
    {
       g_print ("Welcome to GTK\n");
       g_print ("%s clicked %d times\n",
          (char*)data, ++counter);
    }
    g_signal_connect (GTK_OBJECT(button), "clicked",
       G_CALLBACK (greet), "button");
  • 由于按钮窗口小部件包含在窗口内,因此我们应该将其显式添加到容器中。
    gtk_container_add (GTK_CONTAINER (window), button);
  • 同样,最后,我们展示了使用gtk_widget_show_all()函数在内存中制作的小部件,该小部件引用了我们制作的窗口。
  • 最后,召唤gtk_main()函数开始交互过程。
    gtk_widget_show_all(window);
    gtk_main();
  • 这是一个关键函数,因为通常C程序会在执行最后一条语句后结束。在这里,它将程序的控制权传递给GTK +,并在不确定的将来停留,直到客户端点击gtk_main_quit事件激活关闭按钮以适应我们的情况。

下面是上述步骤的实现:

#include 
  
static int counter = 0;
  
void greet(GtkWidget* widget, gpointer data)
{
    // printf equivalent in GTK+
    g_print("Welcome to GTK\n");
    g_print("%s clicked %d times\n",
            (char*)data, ++counter);
}
  
void destroy(GtkWidget* widget, gpointer data)
{
    gtk_main_quit();
}
  
int main(int argc, char* argv[])
{
  
    GtkWidget* window;
    GtkWidget* button;
    gtk_init(&argc, &argv);
  
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  
    g_signal_connect(window, "destroy",
                     G_CALLBACK(destroy), NULL);
    /* Let's set the border width of the window to 20.
    * You may play with the value and see the
    * difference. */
    gtk_container_set_border_width(GTK_CONTAINER(window), 20);
  
    button = gtk_button_new_with_label("Click Me!");
  
    g_signal_connect(GTK_OBJECT(button),
                     "clicked", G_CALLBACK(greet),
                     "button");
  
    gtk_container_add(GTK_CONTAINER(window), button);
  
    gtk_widget_show_all(window);
  
    gtk_main();
  
    return 0;
}
  • 对于编译,请编写以下命令(对于Linux中的GCC)
    gcc main.c -o p1
       `pkg-config --cflags --libs gtk+-2.0`
  • 要运行它,请编写以下命令
    ./p1

结论
GTK +具有创建一个专家级界面所需的所有GUI段。用GTK +进行GUI场合驱动编程的基本思想与模型中出现的思想没有太大不同。包括几个其他部分,利用各种隔间,进行设计,并且显然总是记得咨询GTK +文档。熟练的开发人员经常使用RAD工具(例如Glade)来快速规划GUI界面。首先,可以这样编写代码,而无需做任何准备就可以了解到什么地方以及如何真正完成。它将在以后补偿您。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。