Gtk 3.0 原创教程 第三节

· · 个人记录

前言

欢迎来到 JMY 的 Gtk 3.0 原创教程!

上节课,我们开发了第一个程序,叫 Helloworld

现在我们要往窗体里扔点东西,比如 按钮文本 等。

添油加醋

代码如下:

#include <gtk/gtk.h>

int main(int argc,char *argv[])
{
    GtkWidget *window;//窗口
    GtkWidget *button;//按钮

    gtk_init(&argc,&argv);//初始化

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口
    gtk_window_set_title(GTK_WINDOW(window),"Button Test");//设置标题
    button = gtk_button_new_with_label("Click me");//创建按钮
    gtk_container_add(GTK_CONTAINER(window),button);//将按钮加入容器

    gtk_widget_show(button);//显示按钮
    gtk_widget_show(window);//显示窗口

    gtk_main();//进入主循环

    return 0;
}

这里多了三个函数,他们是什么意思呢?

gtk_button_new_with_label 是用来创建一个 带有标签的按钮

gtk_container_add 就是 往指定容器里添加组件

GTK_CONTAINER 其实是一个宏,来 获取对应容器组件的容器对象

看到这,你可能会有点问题,既然是 容器组件 了,他还要获取啥 容器 啊?

这里,我们要讲一下 继承 的思想:有 父类 Object,一个类 Plant 继承于 Object,那么 Plant 不仅 拥有了 Object 的特点,自己也可以 扩展 出自己的特点。所以 Object 类型的对象,能向下转换成 Plant 类型的对象,但 Plant 却不能向上转换(除了强制)。

\huge\text{(强烈建议读者看懂上面后再看下面的)}

为了强制将 GtkWindow 转换成 GtkContainer(因为 GtkWindowGtkContainer的子类),于是就定义了这么个宏。

相信你都理解了吧,那好,我们把他保存成 gtk-button.c,然后编译他,如图所示(本人开发环境又变成了 Cygwin,因为懒得开虚拟机了):

也可以在 Linux 终端里直接输入 gcc gtk-button.c -o gtk-button.o `pkg-config --cflags --libs gtk+-3.0`,然后回车。

编译完之后,再运行生成的 gtk-button.o 文件:

(注意,这里我又打错了,应该使用 ./gtk-button.o

然后就会弹出个窗口(如果用 Cygwin 没有弹出而且报了 cannot open display 的错,Use The ****ing Google 或者加上 --display=:0.0 选项,我也遇到了这个问题,调一下程序所显示的显示器就好了):

至此,我们成功地往窗体里添加了组件,这不禁让人兴奋。

接下来?

下一步,我们将学习四种布局盒子。这将让你可以构造出一个友好的用户界面,而不再是一个按钮占满了整个窗口了,这听上去不错,对吗?