第一个GTK+程序
在这一章节中,我们将开始编写第一个GTK+程序。
超级简单的例子
我们要“制造”一个超级简单的GTK+程序。就是显示一个空白的窗口。
#include <gtk/gtk.h> int main( int argc, char *argv[])
{
GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window); gtk_main(); return 0;
}
这个例子就是为我们显示了一个空白的窗口。
gcc -o simple simple.c `pkg-config --libs --cflags gtk+-2.0`
这就是我们用来编译这个例子的命令。下面我们将对这个简单的程序进行详细的解读。
gtk_init(&argc, &argv);
这就是在初始化整个GTK+程序,是每一个GTK+程序必不可少的部分。
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
这里我们首先生成了一个构件—— GtkWindow
. 这个窗口构件的种类是GTK_WINDOW_TOPLEVEL
. . Toplevel 窗口拥有一个标题栏和边框。他们同意由窗口管理器进行管理。
gtk_widget_show(window);
在我们生成了一个窗口构件以后,必不可少的是,我们需要用这句语句来显示构件。
gtk_main();
这句代码语句将进入“主循环”。 在这一点上,GTK+程序将安静的等待“事件”(event)的发生,以便做出相应的反应。
生成一个窗口
如果我们不安排窗口的摆放位置的话,那么窗口管理器将为我们给这个窗口“安一个家”。在下个例子中,我们将走进“窗口”。
#include <gtk/gtk.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), "Center");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_widget_show(window); g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0;
}
在我们上面的这个例子,我将深入了解窗口构件(window widget),为窗口构件设置标题和大小。
gtk_window_set_title(GTK_WINDOW(window), "Center");
gtk_window_set_title()
这个函数就可以为window设置一个标题,如果我们不用这个函数的话,GTK+将用源文件的名字来作为窗口的标题。
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
上面这个代码片段为window设置了 230x150 像素的大小。值得注意的是,我们这里提到的大小是指主窗口的大小;而不包括窗口管理器提供的修饰或者装饰的部分。
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
这段代码把窗口设定在显示器的中央。
g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
在之前的例子中,我们没有设置窗口的关闭,当我按下右上角的“X”时。我们可以看到,如果是从命令行的方式来运行例子程序的话,默认情况下窗口程序并不会对你刚刚的动作作出反应(当然,最新的窗口管理器,譬如X11会强行关闭)。我们必须要明确为这个例子程序连接上一个关闭的信号(the destroy signal),就是 gtk_main_quit()
这个函数。
应用程序图标的制作
在下面的例子中,我们会进行应用程序图标的制作。大多数的窗口管理器都会把图标放置在标题栏的左上方和任务栏上。
#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\n", 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), "icon");
gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("web.png"));
gtk_widget_show(window); g_signal_connect_swapped(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0;
}
上面的就是为一个填加上图标的窗口程序了.
gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("web.png"));
函数gtk_window_set_icon()
是为窗口设置图标用的。函数 create_pixbuf()
作用是从一个png图象文件中生成 GdkPixbuf
类型数据。
pixbuf = gdk_pixbuf_new_from_file(filename, &error);
根据官方公布的文档说明,函数 gdk_pixbuf_new_from_file()
一个文件中加载图象数据,从而生成一个新的 pixbuf。 至于文件中包含图象的格式,是由系统自动检测的。如果该函数返回值是NULL的话,程序就会出现错误。
增加 和 减少
下面我们将用一个简单的示例,来完成了“GTK+程序设计初级教程”的第一阶段,在这里我们用到了三个构件:两个按钮和一个标签。这个标签将保存一个整数,两个按钮会分别增加和减少这个数。
#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 *label;
GtkWidget *window;
GtkWidget *frame;
GtkWidget *plus;
GtkWidget *minus; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 250, 180);
gtk_window_set_title(GTK_WINDOW(window), "+-"); 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;
}
这个示例代码完的功能是:增加和减少对象GtkLabel的值。
g_signal_connect(plus, "clicked",
G_CALLBACK(increase), label);
我们把回调函数increase()
和增加按钮进行了连结。还有值得注意的是我们把label作为回调函数调用的参数。 这样的话就可以在回调函数increase()中对label进行处理。
count++; sprintf(buf, "%d", count);
gtk_label_set_text(label, buf);
在“增加”的回调函数中,增加数字。 然后在label中的数字就会随之增加。
第一个GTK+程序的更多相关文章
- GTK+2.0学习——第一个GTK程序
#include <gtk/gtk.h> #include <stdio.h> #include <stdlib.h> /* *点击了关闭按钮之后的回调函数 *gt ...
- 第一个GTK程序
/*我已经把代码写在此处 希望借鉴和完善!一起加油奥(PS:我的QQ是1693672542欢迎加我一起进行探讨学习奥!!!)*/#include <stdio.h>#include< ...
- Ubuntu下在Eclipse IDE for C/C++ Developers中怎样执行C语言的GTK程序?(已解决)
(已解决.详见Ubuntu 12.04下在Eclipse IDE for C/C++ Developers中执行C语言的GTK程序) 按"Ubuntu下GTK的安装.编译和測试"( ...
- DirectX游戏编程(一):创建一个Direct3D程序
一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...
- 第一个python程序
一个python程序的两种执行方式: 1.第一种方式是通过python解释器: cmd->python->进入python解释器->编写python代码->回车. 2.第二种方 ...
- 编写第一个MapReduce程序—— 统计气温
摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...
- 1.3 第一个C#程序
几乎没一门编程语言的第一个程序都叫“你好,世界”,所以先在visual studio 中创建一个Helloworld程序. 各部分的详细内容: Main方法是程序运行的起点,最重要的代码就写在Main ...
- 一个.net程序员的安卓之旅-Eclipse设置代码智能提示功能
一个.net程序员的安卓之旅-代码智能提示功能 过完年回来就决心开始学安卓开发,就网上买了个内存条加在笔记本上(因为笔记本原来2G内存太卡了,装了vs2010.SQL Server 2008.orac ...
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(02)
1.3.1 应用程序对象 MFC应用程序的核心就是基于CWinApp类的应用程序对象,CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口.当包含头文件<afxwin.h>, ...
随机推荐
- (转)Const,Const函数,Const变量,函数后面的Const
本文转自http://www.cnblogs.com/Fancyboy2004/archive/2008/12/23/1360810.html 看到const 关键字,C++程序员首先想到的可能是co ...
- embed标签遮住div层
依然是上次的那个返工友情项目,当时帮忙用jquery ui写了一个漂浮的投票箱,就是类似点击一个项目然后就收藏到了投票箱中的效果.. 虽然不是很复杂,但是由于页面上有大面积的由kindeditor上传 ...
- python字符串内容替换的方法(转载)
python字符串内容替换的方法 时间:2016-03-10 06:30:46来源:网络 导读:python字符串内容替换的方法,包括单个字符替换,使用re正则匹配进行字符串模式查找与替换的方法. ...
- ArcGIS Engine实现LAS数据集转RASTER
ArcGIS 10.1版本开始提供了将LAS数据集转换为栅格的新功能,最近在做LAS数据处理时通过ArcGIS Engine10.1+C#实现了LAS数据集转RASTER,既然ArcGIS DeskT ...
- Delphi XE5 如何设计并使用FireMonkeyStyle(转)
如何设计并使用FireMonkeyStyle FireMonkey使用Style来控制控件的显示方式. 每个控件都有一个StyleLookup属性,FireMonkey就是通过控件的这个属性来在当前窗 ...
- [machine learning] Loss Function view
[machine learning] Loss Function view 有关Loss Function(LF),只想说,终于写了 一.Loss Function 什么是Loss Function? ...
- <span> <div> 局部 keydown ,keyup事件。页面部分div $(document) 无效,可能焦点,添加焦点。
前天改一个bug, js 实现的一个 面板拖拉,左右各两个列表,中间面板画线连接,页面左侧列表选中后,key 事件无效.右侧选中确有效,很奇怪,查看源码,左侧选中后,$(document).on(&q ...
- 思科模拟器软件教程---教你如何划分Vlan
方法/步骤 1.打开Cisco Packet Tracer,点击[交换机],选择第三个图标2960交换机,按住鼠标左键拖动到工作区.这里有很多类型的交换机,但是我们比较常用的是这个. 2.我们选择[终 ...
- javaweb学习总结(四十五)——监听器(Listener)学习二
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- UVA548——Tree(中后序建树+DFS)
Tree You are to determine the value of the leaf node in a given binary tree that is the terminal nod ...