c语言课程设计GTK+计算器的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

设计背景 (2)

GTK+简介 (2)

程序实现 (3)

界面的构建 (3)

窗口的实现 (3)

按钮的实现 (4)

输入框的实现 (5)

回调函数的实现 (5)

数字键 (6)

小数点 (6)

运算符 (7)

等号 (7)

清除键 (8)

退格键 (8)

键盘事件 (8)

心得体会 (10)

参考文献 (10)

设计背景

GTK+简介

GTK+一开始是作为流行的GNU图像处理程序GIMP的一部分产生的,逐渐成为功能强大最受欢迎的工具包之一,因为变成了一个独立的项目。它是一个函数库,提供了一组已经制作好的被称为构件的组件,可以通过简单易懂的函数调用把这些组件和应用程序逻辑组合在一起,从而极大的简化了GUI的创建。

GTK+使用自由的LGPL许可证,它完全是用C语言编写的,绝大多数GTK也是用C语言编写的,也有许多语言绑定可以在C++,Python,PHP,Java中使用它。

GTK本身是建立在一组其它函数库上的,例如他需要Glib提供底层数据结构、类型、线程支持、事件循环和动态加载。

Glib和GObject提供了一组数据类型、函数和宏的标准替代集来进行内存管理和处理常见任务,从而实现跨平台开发,意味着GTK+能够可靠的移植到其他平台和体系结构上。

Glib还定义了一些方便的常量:

#define FALSE 0

#define TRUE !FALSE

这些附加的数据类型基本上是标准C语言数据类型的代替,以及用于确保跨平台字节长度不变。

●gint、guint、gchar、guchar、glong、gulong、gfloat和gdouble是标准C

语言数据类型的简单代替

●gpointer与(void *)同义

●gboolean 用于表示布尔类型的值,它事对int的一个包装

●gint8、guint8、gint16、guint16、gint32和guint32是保证字节长度的有

符合和无符号类型

尽管GTK+是完全用C语言编写的,但是它通过GObjiect库支持对象和面向对象编程,这个库通过宏来支持对象继承和多态。为了方便起见,所有构件创建函数都返回一个GtkWidget类型。

程序实现

要实现本次课程设计要求,首先考虑的是将图形界面和回调函数分开来实现,图形界面通过窗口、按钮、盒、文本框等GTK+构件即可实现,而回调函数应该分开来考虑,可以用数字键回调函数、小数点回调函数、运算符回调函数、等号回调函数、记忆功能回调函数、退格键回调函数、键盘事件处理函数来实现,它们之间可以相互独立。

界面的构建

窗口的实现

我们可以通过GTK+ 来创建一个窗口:

#include

int main (int argc,char *argv[])

{

GtkWidger *window;

gtk_init(&argc,&argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_default_size(GTK_WINDOW(window),250,300);

gtk_container_set_border_width(GTK_CONTAINER(window),10);

gtk_window_set_title(GTK_WINDOW(window),"计算器");

gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);

g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_m ain_quit),NULL);

gtk_widger_show(window);

gtk_main();

return 0;

}

首先使用#include 来包含所必需的GTK+库和相关库的头文件,接着,声明window为一个指向GtkWidget的指针,必须在调用任何GTK+函数之前对其调用gtk_init函数进行初始化,将命令行参数argc和argv传递给它,给GTK+一个机会来解析它所需要的任何命令行参数。GtkWidget* gtk_window_new (GtkWindowType type)调用在内存中建立窗口,参数type根据窗口的目的有两种取值,GTK_WINDOW_TOPLEVELW为一个标准的有框架窗口,

GTK_WINDOW_POPUP可以创建一个实用于对话框的无框架窗口,使得将窗口实际显示在屏幕之前,可以在它里面放置构件,通过gtk_window_set_title可以设置窗口的标题,通过gtk_widow_setdefault_size可视设置窗口的大小,通过gtk_window_set_border_with则可以设置边框大小,通过gtk_window_set_position可以设置窗口的初始位置,要实际显示窗口,则需要调用gtk_widget_show;改函数只需一个GtkWidget指针,只需要将窗口的引用传给它。最后调用gtk_main,这个关键函数通过把控制权交给GTK+来启动交互过程,并且一直运行,直到gtk_main_quit才返回,它是GTK+的主事件循环,每一个GTK+程序都必须有,否则程序就没法运行,它在程序运行时等待来自外部用户发出的事件,如键盘事件鼠标移动等,GTK+将这些事件包装成信号,用户在根据信号的功能编写相应的回调函数来处理。代码最后返回FALSE,相当于整数0,使程序更具完整性和可读性。

按钮的实现

多数情况下,标签文本在GTK+编程中起到提示的作用,用gtk_label_new 函数可以直接创建一个便签文本,它的参数就是标签要显示的文本字符串,事实上创建带有标签的按钮时,按钮中就包含一个标签控件。用gtk_button_new 创建按钮后,就可以用gtk_box_pack_start函数排放到盒装容器中。

GTK+以信号和回调函数作为自己的事件和事件监听系统,非常容易使用,可用用函数指针来设置信号处理器。回调函数的原型通常为:

void a_callback_function(GtkWidget *widget, gpointer user_data);传递的第一个参数是指向发出信号的构件的指针,第二个参数是但你连接回掉函数是自己选择的一个任意指针,可用于任何目的。连接回调函数只需要调用g_signal_connect,并传递如下几个参数:构件、信号名、回调函数指针和你的任意指针:

gulong g_signal_connect(gpointer *object, const gchar *name, GCallback func, gpointer user_data);

连接回调函数没有任何限制,可以讲多个信号连接到同一个回调函数,也可以讲多个回调函数连接到同一信号。

GTK+通过容器构件这种灵活的布局系统来避免使用绝对坐标导致的GUI不一致,它可以用来在应用程序窗口中控制构件的布局,盒是一个不可见的的构件,它的工作就是包含其它的构件,并控制他们的布局,为了控制盒中的每个构件的大小,为他们指定的是规则而不是坐标,因为盒构件可以包含任何GtkWidget,而GtkBox本身就是一个GtkWidget,故可以嵌套盒构件创建复杂的布局。GtkBox有两个主要的子类,GtkHBox是一个单行的横向组装盒构件,GtkVBox是一个单列的的纵向组装盒构件,在创建盒构件时,需要指定两个参数,通过homogeneous和spacing来控制特定组装盒所有构件的布局,homogeneous是一个布尔值,如果被设置成TRUE,则强制盒中每个构件都占据

相关文档
最新文档