GTK图形界面编程-计算器的实现

GTK图形界面编程-计算器的实现
GTK图形界面编程-计算器的实现

目录

一.课程设计目的 (2)

二.课程设计任务与要求 (2)

三.功能分析 (3)

四.功能模块分析与设计 (3)

1.图形界面设计 (4)

2.按键处理模块 (4)

3.数字键处理模块 (5)

4.小数点处理模块 (6)

5.加减乘除运算按键处理模块 (6)

6.结果按键,即等号处理模块 (7)

7.清除模块 (8)

五.功能测试 (9)

六.课程设计总结 (10)

高级C语言实训报告

一.课程设计目的

现在大多数的计算器都具备+,-,*,/等四则运算的功能。用计算器来算数显然比用脑袋或用纸笔计算要来得方便。当我们看到一个很长很大的表达式需要得到结果时,我们就会想到计算器,这样,本程序就是为解决大家基本四则运算的问题而产生的。主要基于对表达式的分析并利用C进行编程进而实现算法的。C在程序运行效率、内存使用的可控性和编程的灵活性上均具有较大的优势,与汇编语言和C语言更具有面向对象的优点,我采用Ubuntu Linux操作系统以及GTK+2.0,以达到算法快速有效地执行。

二.课程设计任务与要求

1.使用C语言和GTK+图形库进行开发,计算器可以在装有GTK+运行环境的各种操作系统上运行;

2.实现标准型计算器上的四则运算功能(参考Windows 7系统标准型计算器);

3.根据课程设计进度对程序功能进行扩展:

添加捕捉键盘事件功能,通过PC键盘的数字键盘也可以进行输入;

为计算器添加存储功能(MR、M+、M-等按键功能),实现完整的标准型计算器;

4.实现科学型计算器上的四则运算功能(参考Windows 7系统科学型计算器或Ubuntu 系统基本型计算器)。

本课程设计内容是在Linux平台下开发一个简单的计算器程序,采用GCC编程工具和GTK+2.0工具包等软件为开发工具以及C语言知识实现图形化的计算器程序。该程序能够实现的对整数的加减乘除和小数的加减乘除。

三.功能分析

1.整数之间的加减乘除运算

2.小数之间的加减乘除运算

3.小数与整数之间的加减乘除运算

四.功能模块分析与设计

本计算器主要是完成整数之间、小数之间、整数和小数之间的加减乘除的运算,使用GTK+完成界面布局。

根据需求分析的结果,总体结构如下图所示:

本课程设计所实现的计算器可以分为以下几个模块实现:图形界面设计、数字键处理模块、小数点处理模块、加减乘除运算按键处理模块

1.图形界面设计

此程序采用一个纵向盒状容器和多个横向盒状容器来设计界面。另外在单行输入控件的阅读方向属性上用函数gtk_widget_set_direction 设定为GTK_TEXT_DIR_LTR,即从左向右,使此控件的数字显示更像一个计算器的显示屏。

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //主窗体

G_CALLBACK(gtk_main_quit),NULL);

gtk_window_set_title(GTK_WINDOW(window),"计算器"); //窗体名称

gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);

gtk_container_set_border_width(GTK_CONTAINER(window),15);

vbox = gtk_vbox_new(FALSE,0);

gtk_container_add(GTK_CONTAINER(window),vbox);

hbox = gtk_hbox_new(FALSE,0);

gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);

2.按键处理模块

label = gtk_label_new("欢迎使用"); //标签名称

gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5);

button = gtk_button_new_with_label("CE"); //清除按键

gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,5);

定义hbox1容纳back和ce

hbox1 = gtk_hbox_new(FALSE,0);

gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);

button = gtk_button_new_with_label("Back"); //按键Back

gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);

g_signal_connect(G_OBJECT(button),"clicked",

G_CALLBACK(clear_one),NULL);

button = gtk_button_new_with_label("MC"); //按键MC

gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);

g_signal_connect(G_OBJECT(button),"clicked",

G_CALLBACK(clear_one),NULL);

类似的构建hbox2控件容纳“1”、“2”、“3”和“+”四个按键hbox3控件容纳“1”、“2”、“3”和“+”四个按键,hbox4容纳“7”、“8”、“9”和“*”四个按键,hbox5容纳“0”、“.”、“=”和“/”四个按键。

3.数字键处理模块

数字按钮0~9 的功能是向计算器输入数字,通过计算和定位,最后显示出来,所以它们的回调函数都是同一个,只不过传递的参数根据不同的按钮传递不同的数字,关键代码如下:

void on_num_clicked (GtkButton* button,gpointer data)

{ //当数定键按下时执行

const gchar *num;

gint i;

if(have_result)

clear_all(); //有结果则全部清除

if(count == 6) return; //够6位数则不能再输入数字

count++;

num = gtk_button_get_label(GTK_BUTTON(button)); //取数

i = g_strlcat(number,num,100); //保存

if(first)

nn = strtod(number,NULL); //数一

else

mm = strtod(number,NULL); //数二

gtk_entry_set_text(GTK_ENTRY(entry),number); //显示

}

4.小数点处理模块

小数点按钮的回调函数是较特殊的一个。首先小数点在一个数中只能出现一次,再按的话则不起作用,小数点按钮在点击后要对所输入的数字做一下处理,使之成为浮点数,并且让后续数字也转换为相应的浮点数字,关键代码如下:

void on_dot_clicked (GtkButton* button,gpointer data)

{ //当小数点按下时

gint i;

if(have_result)

clear_all(); //全部清除

if(have_dot == FALSE) //如果无小数点则可以

{

have_dot = TRUE;

i = g_strlcat(number,".",100);

gtk_entry_set_text(GTK_ENTRY(entry),number);

} //如果有小数点则不输出

}

5.加减乘除运算按键处理模块

本计算器软件只有加减乘除4种运算功能,这4个运算按钮用了同一个回调函数,根据传递的参数设定当前的计算方法。其关键代码如下:

switch(GPOINTER_TO_INT(data))

{

case 1: //当"+"时

s = 1;

gtk_entry_set_text(GTK_ENTRY(entry),"");

first = FALSE ; count = 0; break;

case 2: //当"-"时

s = 2;

gtk_entry_set_text(GTK_ENTRY(entry),"");

first = FALSE ; count = 0; break;

case 3: //当"*"时

s = 3;

gtk_entry_set_text(GTK_ENTRY(entry),"");

first = FALSE ; count = 0; break;

case 4: //当"/"时

s = 4;

gtk_entry_set_text(GTK_ENTRY(entry),"");

first = FALSE ; count = 0; break;

}

6.结果按键,即等号处理模块

等号按钮的回调函数是根据当前的计算方法进行相应的运算,并将运算结果输出到单行输出控件中。其关键代码如下:

switch(s) //判断四则运算的符号

{

case 1: //当"+"时

numb = nn+mm;

break;

case 2: //当"-"时

numb = nn-mm;

break;

case 3: //当"*"时

numb = nn*mm;

break;

case 4: //当"/"时

numb = nn/mm;

break;

}

7.清除模块

清除按钮的功能是清除当前显示,同时清除所有标记,将标记设为默认等。关键代码如下:

void clear_all (void)

{ //清除所有相关标记

gint i;

gtk_entry_set_text(GTK_ENTRY(entry),"");

nn = 0; //第一个数清零

mm = 0 ; //第二个数清零

s = 0;

count = 0 ;

first = TRUE;

have_dot = FALSE; //小数点标记

have_result = FALSE; //结果标记

for(i = 0 ; i < 100 ; i++)

number[i] = '\0';

}

五.功能测试

(1)计算器主界面

(2)除法运算演示:10/3=3.33333

(3)如果用glade先设置布局

如果先用glade设计好了布局,只需在写回调函数就可以了。

六.课程设计总结

通过两周周的数据结构课程设计,我基本完成了Linux平台下图形界面——计算器设计的课程设计。感觉在这次课程设计中自己受益匪浅,必须自觉得学习GTK+图形设计,将数据结构的知识与Linux知识相结合,这样才能做出功能丰富的应用程序。

在课程设计中遇见的课题中的很多技术问题,好多东西都会混用。比如说格状容器和盒状容器,在用的时候不能同时实现,只能在一种容器中添加另一种容器,开始我马虎的看了一下教程就顾着编程,也没发现问题出在哪,后来通过一起做的搭档才知道我的粗心造成的

后果。在这个程序中,设计要求上的有些功能还没有实现,存储功能(MR、M+、M-等按键功能)没有实现,退格功能没能实现,只能进行基本的四则运算。

在glade设计上,我们花了很多功夫,到后来还是不知道怎么把glade图和回调函数结合起来。

但也学会了一些GTK+图形设计的基本东西:

1.安装GTK的命令:

sudo apt-get install libgtk2.0-dev

2.编译文件的命令:

gcc 文件名`pkg-config --libs --cflags gtk+-2.0`

3.初始化整个GTK+程序,每一个GTK+程序必不可少的部分:

gtk_init(&argc, &argv);

4. window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

这里我们首先生成了一个构件——GtkWindow. 这个窗口构件的种类是GTK_WINDOW_TOPLEVEL. . Toplevel 窗口拥有一个标题栏和边框。他们同意由窗口管理器进行管理。

5.gtk_widget_show(window);

在我们生成了一个窗口构件以后,必不可少的是,我们需要用这句语句来显示构件。

6. gtk_main();

这句代码语句将进入“主循环”。在这一点上,GTK+程序将安静的等待“事件”(event)的发生,以便做出相应的反应。

相关主题
相关文档
最新文档