GTK+(2)--窗口中添加五脏六腑

在我们第一讲当中的窗口中,我们仅仅就是学习了如何使用GTK+创建一个空白的窗口,但是仅仅一个空白窗口是没有用的,我们总是需要设置窗口的属性和向窗口中添加一些子控件,包括应用程序的图标,菜单,工具栏等等内容.

下面的一段程序是设置我们的窗口的一些属性,包括设置窗口的标题,窗口的大小,窗口在屏幕中的位置等等属性.下面看一下代码:

#include <gtk/gtk.h>
#include <stdio.h>
int main(int argc,char *argv[])
{
    GtkWidget *window;
    gtk_init(&argc,&argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  //创建新的窗口
    //设置窗口的标题
    gtk_window_set_title(GTK_WINDOW(window),"bobo_GTK_Hello");
    //设置用户是否可以重新更改窗口的大小
    gtk_window_set_resizable(GTK_WINDOW(window),TRUE);  //可以更改大小
    //gtk_window_set_resizable(GTK_WINDOW(window),FALSE); //不可更改
    //获取当前window窗口能否改变大小
    gboolean canResize = gtk_window_get_resizable(GTK_WINDOW(window));

    //设置窗口的大小
    gtk_window_set_default_size(GTK_WINDOW(window),230,150);

    //设置窗口位置在屏幕中心
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    /**
     * 现在我们看一下gtk_window_set_position的函数原型
     * void gtk_window_set_position (GtkWindow *window,GtkWindowPosition position);
     * 而GtkWindowPosition是一个枚举类型的变量
     * typedef enum
     * {
     *  GTK_WIN_POS_NONE,  //不产生任何影响
     *  GTK_WIN_POS_CENTER, //窗口被放置的屏幕中央
     *  GTK_WIN_POS_MOUSE, //窗口被放置在当前鼠标的位置
     *  GTK_WIN_POS_CENTER_ALWAYS, //当窗口改变大小之后也在屏幕中央
     *  GTK_WIN_POS_CENTER_ON_PARENT //在他父窗口的中央
     * } GtkWindowPosition;
     *
     *
     *
     */

    gtk_widget_show(window);
    //设置程序退出的信号
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_main();
    return 0;
}

下面是这段程序的运行代码:

其中,那个设置退出信号我们后面会专门讲解.

下面我们学习一个窗口中,应用程序图标的制作.

先看下面为程序添加图标的代码:

#include <gtk/gtk.h>
GdkPixbuf *create_pixbuf(const gchar * filename)
{
    GdkPixbuf *pixbuf;
    GError *error = NULL;
    pixbuf = gdk_pixbuf_new_from_file(filename,&error);

    if(!pixbuf){
        fprintf(stderr,"%s
",error->message);
        g_error_free(error);
    }
    return pixbuf;
}
int main(int argc,char *argv[])
{
    GtkWidget *window;
    gtk_init(&argc,&argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  //创建新的窗口
    //设置窗口的标题
    gtk_window_set_title(GTK_WINDOW(window),"bobo_GTK_Hello");
    //设置用户是否可以重新更改窗口的大小
    gtk_window_set_resizable(GTK_WINDOW(window),TRUE);  //可以更改大小
    //gtk_window_set_resizable(GTK_WINDOW(window),FALSE); //不可更改
    //获取当前window窗口能否改变大小
    gboolean canResize = gtk_window_get_resizable(GTK_WINDOW(window));

    //设置窗口的大小
    gtk_window_set_default_size(GTK_WINDOW(window),230,150);

    //设置窗口位置在屏幕中心
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    /**
     * 现在我们看一下gtk_window_set_position的函数原型
     * void gtk_window_set_position (GtkWindow *window,GtkWindowPosition position);
     * 而GtkWindowPosition是一个枚举类型的变量
     * typedef enum
     * {
     *  GTK_WIN_POS_NONE,  //不产生任何影响
     *  GTK_WIN_POS_CENTER, //窗口被放置的屏幕中央
     *  GTK_WIN_POS_MOUSE, //窗口被放置在当前鼠标的位置
     *  GTK_WIN_POS_CENTER_ALWAYS, //当窗口改变大小之后也在屏幕中央
     *  GTK_WIN_POS_CENTER_ON_PARE_POS_NONE,  //不产生NT //在他父窗口的中央
     * } GtkWindowPosition;
     *
     *
     *
     */
    //设置程序图标
    gtk_window_set_icon(GTK_WINDOW(window),create_pixbuf("bobo.png"));

    gtk_widget_show(window);
    //设置程序退出的信号
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_main();
    return 0;
}

create_picbuf()函数的作用是从文件中读取图片文件,生成GdkPixbuf数据类型.下面我们看一下其中主要的函数

gdk_pixbuf_new_from_file()的定义.

GdkPixbuf * gdk_pixbuf_new_from_file (const char *filename, GError **error);

GdkPixbuf * gdk_pixbuf_new_from_file (const char *filename, GError **error);

意思就是:通过从文件中加载一个图像来创建一个新的pixbuf对象.文件的格式是自动检测的.如果返回值是NULL的话,error参数将会

被设置,可能的错误在GDK_PIXBUF_ERROR和G_FILE_ERROR域中.

?filename参数: 要被加载的文件的名称

?error参数:返回一个错误的位置

?返回值:将会返回一个新创建的pixbuf对象,并且该对象的引用数为1,或者是返回NULL如果发生下面的错误的话:文件无法打开,无法识别的 ?文件格式,没有足够的内存来加载该图片,或者是图片文件包含无效的数据

下面是程序的运行结果:

好了,对窗口的属性设置也了解的差不多了,现在我们设计一个小程序,学习向窗口中添加按钮等组件.

我们这个小程序向窗口中添加两个按钮和一个标签,标签的初始数为0,两个按钮分别控制标签中数字的增大和缩小.

下面请看一下实现的代码:

#include <gtk/gtk.h>
gint count = 0;
char buf[5];
void increase(GtkWidget *widget,gpointer label){
    count++;
    sprintf(buf,"%d",count);
    gtk_label_set_text(label,buf);
}
void decrease(GtkWidget *widget,gpointer label){
    count--;

    sprintf(buf,"%d",count);

    gtk_label_set_text(label,buf);
}
int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *label;
    GtkWidget *frame;
    GtkWidget *plus;
    GtkWidget *minus;

    gtk_init(&argc,&argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window),"a little program");
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),250,180);

    frame = gtk_fixed_new();

    gtk_container_add(GTK_CONTAINER(window),frame);

    plus = gtk_button_new_with_label("+");
    gtk_widget_set_size_request(plus,80,35);
    gtk_fixed_put(GTK_FIXED(frame),plus,50,20);

    minus = gtk_button_new_with_label("-");
    gtk_widget_set_size_request(minus,80,35);
    gtk_fixed_put(GTK_FIXED(frame),minus,50,80);

    label = gtk_label_new("0");
    gtk_fixed_put(GTK_FIXED(frame),label,190,58);

    gtk_widget_show_all(window);

    g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(plus,"clicked",G_CALLBACK(increase),label);
    g_signal_connect(minus,"clicked",G_CALLBACK(decrease),label);
    gtk_main();
    return 0;
}

注意这个地方,g_signal_connect(plus,”clicked”,G_CALLBACK(increase),label);

我们把回调函数increase()和增加按钮绑定,这个地方我们把label作为回调函数的参数.这样,在回调函数increase()里面就能对label进行处理了.

对程序组件添加监听机制我打算在后面的讲解中专门拿出一节来讲解,主要讲解一下GTK+信号机制的原理以及使用方法。

下面是程序的运行结果:

时间: 2024-08-26 01:58:53

GTK+(2)--窗口中添加五脏六腑的相关文章

V-3-1 Vmware EXSi中添加虚拟机之上传镜像文件

在安装虚拟机前,可以将需要的ISO映像上传到服务器的存储中以此节约安装时间. 选择你需要操作的服务器后,这里选择"配置"-"存储器" 可以看到这台服务器连接的存储设备和本地存储.选择你准备上传的存储. 右键,选择"浏览数据存储" 出现下图的界面.可在如下窗口中添加文件夹,上传文件与下载文件. 如下图所展示的是将文件上传到数据存储中.

MFC中添加ToolTip提示框

PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型成员,并在适当的地方将其初始化如下: m_ToolTipCtrl.Create(this); m_ToolTipCtrl.AddTool(GetDlgItem(IDC_BUTTON1), _T("This is ToolTip")); m_ToolTipCtrl.SetMaxTipWidt

[译]如何在Unity编辑器中添加你自己的工具

在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的. 这篇教程假设你已经熟悉Unity的基本工作流程.如果你知道如何在编辑器中创建物体.预设.场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了. 最终结果预览 让我们看一下我们做出的最终结果是什么样子: 如你所见,我们会创建一个编辑

为Windows窗口标题栏添加新按钮

为Windows窗口标题栏添加新按钮 对于我们熟悉的标准windows窗口来讲,标题栏上一般包含有3个按钮,即最大化按钮,最小化按钮和关闭按钮.你想不想在Windows的窗口标题栏上添加一个新的自定义按钮,满足你的个性化需求,从而也使自己的窗口更具特色呢? 下面我们就讨论一下在delphi中如何给窗口的标题栏上添加新的按钮. 一.实现起来要定义以下过程: 1. 定义DrawCaptButton过程,这个过程的功能是在指定的位置画出按钮. 在过程中要使用win32函数GetSystemMetric

1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览

 1 新建项目 A  修改pro中的内容如下: HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets printsupport B  编写MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H   #include <QWidget> #include <QGraphicsScene> #include <QGraphicsLineItem>

在现有WinForms应用中添加C1Themes主题控件

在本博客中,展示了如何在现有的WinForms应用中添加C1Themes控件支持. 本文使用名为C1dView Samples的应用程序,它包含C1Reports.它是基于C1Ribbon界面设计的C1Report/C1PrintDocument浏览应用程序.该应用最初没有包含主题的支持. C1DView示例下载:C1dView.zip (94.96 kb) (下载次数: 7) 如下描述的简单的步骤,为最终用户提供在程序中选择使用包含于C1Themes控件产品中的若干主题的支持.(请注意:在进行

(转)如何在maven的pom.xml中添加本地jar包

1 maven本地仓库认识 maven本地仓库中的jar目录一般分为三层:图中的1 2 3分别如下所示: 1 groupId 2 artifactId 3 version 4 jar包的依赖 如果要将maven本地仓库中的jar包添加到项目中,直接打开4 xx.pom文件,将改jar包的相关依赖复制pom.xml文件中即可. 2 将本地jar包添加到本地仓库 2.1 添加jar到本地仓库 原则上Maven的设计是不需要这么做的,因为pom.xml中依赖的jar包会自动实现从中央仓库下载到本地仓库

在IntelliJ IDEA中添加框架支持时找不到Hibernate的解决办法

问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找不到hibernate. 解决办法 打开项目根目录下的spring-mvc-crud.iml文件,搜索hibernate找到这段代码并删除,然后重新添加框架支持即可选择hibernate. <facet type="hibernate" name="Hibernate&qu

MFC解决View中添加控件闪烁

一.简介 我们经常会在我们的View类中添加各种类型的控件,列表控件就是最常用的了.但是我们发现添加控件的时候会,在窗口变化的时候会导致各种各样的闪烁,让我们烦恼异常.所以我对此找到新的解决方案. 二.步骤 新建工程->在最后选在类的时候我们把view选择CFormView,然后再在FormView上添加我们的控件.如果我们的工程已经建立了,那么我们重新定义一个FormView类,并把控件加入到FromView中.然后我们让这个FormView成为你已经创建好的View类的child控件,这样就