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

2023-11-02 18:11
文章标签 窗口 gtk 五脏六腑

本文主要是介绍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+信号机制的原理以及使用方法。

下面是程序的运行结果:

这篇关于GTK+(2)--窗口中添加五脏六腑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/332372

相关文章

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

主窗口的设计与开发(二)

主窗口的设计与开发(二) 前言         在上一集当中,我们完成了主窗口的初始化,主窗口包括了左中右三个区域。我们还完成了对左窗口的初始化,左窗口包括了用户头像、会话标签页按钮、好友标签页按钮以及好友申请标签页按钮。对于切换每个标签页,我们还做了初始化信号槽的内容。最后我们将整个MainWidget类设置为单例模式。         那么这一集我们将继续完成主窗口的设计与开发,这一集我

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.

运行.bat文件,如何在Dos窗口里面得到该文件的路径

把java代码打包成.jar文件,编写一个.bat文件,执行该文件,编译.jar包;(.bat,.jar放在同一个文件夹下) 运行.bat文件,如何在Dos窗口里面得到该文件的路径,并运行.jar文件: echo 当前盘符:%~d0 echo 当前路径:%cd% echo 当前执行命令行:%0 echo 当前bat文件路径:%~dp0 echo 当前bat文件短路径:%~sdp0 nc

类codepen的实现可拖拽窗口demo

首先说下思想 flex或者其他布局方式,实现左右分割布局,主盒子宽度100%,左右布局中包含一个分割条(可在布局容器中,也可以单独定义)为分隔条绑定鼠标点击事件,为document绑定鼠标移动事件和鼠标放开事件,通过监听鼠标移动事件和上一个状态保存下来的鼠标位置作对比,判断当前鼠标移动方向(往左还是往右)然后计算当前鼠标位置和鼠标点击位置的距离,来计算左右容器的变化,然后通过dom的方式设置宽度

【leetcode详解】考试的最大困扰度(滑动窗口典例)

实战总结: sum += answerKey[right] == c; 经典操作,将判断语句转化为0, 1接收来计数//大问题分解: 对'T'还是'F'做修改, 传参为c//滑动窗口: 遍历, 维护left& right指向 及 c的个数, 更新不知从何下手写代码时:考虑先写好第一次的,然后以此为基础补充代码以适后续情况 题面: 解题感受: 思路总体好想, 实现略有挑战。 思路分析:

【每日一题】LeetCode 2379.得到K个黑块的最少涂色次数(字符串、滑动窗口)

【每日一题】LeetCode 2379.得到K个黑块的最少涂色次数(字符串、滑动窗口) 题目描述 给定一个字符串 blocks,其中每个字符代表一个颜色块,可以是 ‘W’(白色)或 ‘B’(黑色)。你需要找到一个至少包含 k 个连续黑色块的子串。每次操作可以将一个白色块变成黑色块。你的任务是找到至少出现一次连续 k 个黑色块的最少操作次数。 和该题目类似:【每日一题】LeetCode 202

GTK中创建线程函数g_thread_new和g_thread_create的区别

使用GThread函数,需要引用glib.h头文件。 这两个接口的核心区别就是  g_thread_create 是旧的接口,现在已经不使用了,而g_thread_new是新的接口,建议使用。 g_thread_create: g_thread_create has been deprecated since version 2.32 and should not be used in n