zoukankan      html  css  js  c++  java
  • (二)、一步一步学GTK+之窗口

    本系列不准备对GTK+的各个组件分别介绍,这会让人觉得很无趣,采用开发一个小软件作为演示,该软件的功能就是演示GTK+的控件应用,以达到学习目的。在上一篇的最后我给出了一段代码来测试环境——显示了一个空白的窗口,代码如下:

    #include <gtk/gtk.h>
    int main( int argc, char *argv[])
    {
        GtkWidget *window;
        /*初始化整个GTK+程序,是每一个GTK+程序必不可少的部分*/
        gtk_init(&argc, &argv);
        /*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
        /*开始显示窗口*/
        gtk_widget_show(window);
        gtk_main();
        return 0;
    }

    现在我们来给窗口做一些改进工作:

    一、添加一个标题、设置默认大小以及显示位置。

    #include <gtk/gtk.h>
    int main( int argc, char *argv[])
    {
        GtkWidget *window;
        /*初始化整个GTK+程序,是每一个GTK+程序必不可少的部分*/
        gtk_init(&argc, &argv);
        /*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /*设置窗口标题*/
        gtk_window_set_title(GTK_WINDOW(window), "一步一步学GTK+ DEMO");
        /*设置窗口默认大小*/
        gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);
        /*
         * 设置窗口在显示器中的位置为居中。
         *   GTK_WIN_POS_NONE            :不固定
         *   GTK_WIN_POS_CENTER          : 居中
         *   GTK_WIN_POS_MOUSE           : 出现在鼠标位置
         *   GTK_WIN_POS_CENTER_ALWAYS   : 窗口改变大小的时候仍然居中
        */
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    
        /*开始显示窗口*/
        gtk_widget_show(window);
        gtk_main();
        return 0;
    }

    约定:红色部分为新增代码,方便读者更容易看到变化,运行结果如下:

    二、设置应用程序的图标

    #include <gtk/gtk.h>
    
    /*
      @Description: 从一个图片中获取信息得到pixbuf
      @param:       gchar filename
    */
    GdkPixbuf *create_pixbuf(const gchar * filename)
    {
        GdkPixbuf *pixbuf;
        GError *error = NULL;
        /*
         * 函数gdk_pixbuf_new_from_file() 从一个图片文件中加载图象数据,从而生成一个新的 pixbuf,
         * 至于文件中包含图象的格式,是由系统自动检测的。如果该函数返回值是NULL 的话,程序就会出现错误。
        */
        pixbuf = gdk_pixbuf_new_from_file(filename, &error);
        if(!pixbuf) {
            fprintf(stderr, "%s\n", error->message);
            g_error_free(error);
        }
        return pixbuf;
    }
    
    int main( int argc, char *argv[])
    {
        GtkWidget *window;
        /*初始化整个GTK+程序,是每一个GTK+程序必不可少的部分*/
        gtk_init(&argc, &argv);
        /*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /*设置窗口标题*/
        gtk_window_set_title(GTK_WINDOW(window), "一步一步学GTK+ DEMO");
        /*设置窗口默认大小*/
        gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);
        /*
         * 设置窗口在显示器中的位置为居中。
         *   GTK_WIN_POS_NONE            :不固定
         *   GTK_WIN_POS_CENTER          : 居中
         *   GTK_WIN_POS_MOUSE           : 出现在鼠标位置
         *   GTK_WIN_POS_CENTER_ALWAYS   : 窗口改变大小的时候仍然居中
        */
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    
        /*函数gtk_window_set_icon() 是为窗口设置图标用的,函数create_pixbuf是我们自定义的,目的是从一个图片中获取信息得到pixbuf。*/
        gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("./images/bear.png"));
    
        /*开始显示窗口*/
        gtk_widget_show(window);
        gtk_main();
        return 0;
    }

    三、当点击关闭窗口(X)时,应该结束程序
       在命令行下运行这个demo,点击右上角的X时候,窗口虽然关闭了,但是程序还在运行,需要按ctrl+C(linux下 ctrl+D)来结束程序运行。我们希望点击X的时候就结束程序的运行。我们必须要明确为这个例子程序连接一个关闭的信号(destroy signal),然后调用回调函数gtk_main_quit() 实现结束程序。这里涉及到事件和信号会在日后讲到。

    #include <gtk/gtk.h>
    
    /*
      @Description: 从一个图片中获取信息得到pixbuf
      @param:       gchar filename
    */
    GdkPixbuf *create_pixbuf(const gchar * filename)
    {
        GdkPixbuf *pixbuf;
        GError *error = NULL;
        /*
         * 函数gdk_pixbuf_new_from_file() 从一个图片文件中加载图象数据,从而生成一个新的 pixbuf,
         * 至于文件中包含图象的格式,是由系统自动检测的。如果该函数返回值是NULL 的话,程序就会出现错误。
        */
        pixbuf = gdk_pixbuf_new_from_file(filename, &error);
        if(!pixbuf) {
            fprintf(stderr, "%s\n", error->message);
            g_error_free(error);
        }
        return pixbuf;
    }
    
    int main( int argc, char *argv[])
    {
        GtkWidget *window;
        /*初始化整个GTK+程序,是每一个GTK+程序必不可少的部分*/
        gtk_init(&argc, &argv);
        /*这里生成了一个窗口构件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的标题栏和边框,同意用窗口管理器来进行管理*/
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /*设置窗口标题*/
        gtk_window_set_title(GTK_WINDOW(window), "一步一步学GTK+ DEMO");
        /*设置窗口默认大小*/
        gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);
        /*
         * 设置窗口在显示器中的位置为居中。
         *   GTK_WIN_POS_NONE            :不固定
         *   GTK_WIN_POS_CENTER          : 居中
         *   GTK_WIN_POS_MOUSE           : 出现在鼠标位置
         *   GTK_WIN_POS_CENTER_ALWAYS   : 窗口改变大小的时候仍然居中
        */
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    
        /*函数gtk_window_set_icon() 是为窗口设置图标用的,函数create_pixbuf是我们自定义的,目的是从一个图片中获取信息得到pixbuf。*/
        gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("./images/bear.png"));
    
        /***********************************以下是信号处理部分************************************/
    
        /*关闭窗口时退出主循环*/
        g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit), NULL);
    
        /***********************************以下是显示控件部分************************************/
        /*开始显示窗口*/
        gtk_widget_show(window);
    
        
        gtk_main();
        return 0;
    }

    关于移动窗口、改变窗口大小以及拖拽等情况会在下一篇中介绍。

  • 相关阅读:
    Linux常用命令2
    Linux常用命令1
    Nginx配置Kafka
    SpringBoot整合Druid
    spring boot jpa
    mybatis-plus_2
    copy data to map
    HashMap容量问题
    在SpringBoot主启动类中获取实例化的Bean
    Linux环境中Rsync增量备份文件
  • 原文地址:https://www.cnblogs.com/ikodota/p/step_by_step_study_gtk_window.html
Copyright © 2011-2022 走看看