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

合集下载

第11章 GTK+图形界面编程(2010-12-7)

第11章  GTK+图形界面编程(2010-12-7)

第11章GTK+图形界面编程本章将介绍Linux下的图形界面编程,重点介绍基于C语言的具有面向对象特征的GTK+图形界面编程。

主要介绍GTK+图形界面应用程序的框架、基本原理、常用控件的使用。

读完本章,读者将了解以下内容:● GTK+程序的基本结构。

●事件和消息处理。

●常用控件的使用。

11.1 Linux下的图形界面编程11.1.1 GTK+开发环境虽然Linux下的大多数开发是基于字符界面的,但在Linux环境下也可以开发出美观大方的图形界面。

一般的嵌入式系统使用MiniGUI、Qt/E、uC/GUI等图形环境,它们都是专业的面向嵌入式系统,经过专门裁剪后的集成包,相对比较成熟、安装方便,不过大部份都是商业版。

经过多年的发展,目前已经存在多种用于在Linux下开发图形界面程序的开发包,其中较为常用的是Qt和GTK+。

Qt是一个跨平台的图形用户界面开发库,它不仅支持Linux操作系统,还支持所有类型的UNIX以及Windows操作系统。

Qt良好的封装机制使它模块化程度非常高,可重用性很强,Qt提供了丰富的API供开发人员使用。

使用Qt开发的图形用户界面程序具有良好的稳定性和健壮性。

桌面环境KDE(K Desktop EnVironment即K桌面环境)就是使用Qt作为其底层库开发出来的。

由于Qt使用C++面向对象编程语言作为其开发语言,而许多在Linux下从事开发的程序员更喜欢或更习惯于用C语言。

GTK+使用C语言作为开发语言。

它基于LGPL授权,因此GTK+是开放源代码而且完全免费的。

GTK+简单易用,执行效率高。

基于这些原因,GTK+拥有为数众多的拥护者。

Linux的桌面环境GNOME就是建立在GTK+基础上。

在嵌入式系统上完全可以构建GTK+的图形环境,但是整个环境由很多个源码包组成,依赖复杂,难度相对较大。

下面介绍GTK+2.6开发环境的安装.1.准备工作(1)GTK+2.6及相关源码包的下载在ftp://网站中可下载安装GTK+2.6所需的绝大多数的软件包。

Gtk图形界面程序设计

Gtk图形界面程序设计

应用容器的Gtk+程序
❖ 容器:
所谓容器,就是可以在其中放置其它界面元素的 元素。其中放置的元素可以是可见的按钮、图标, 也可以还是一个容器;
以继承的观点来理解,GtkWidget有一个直接的 派生类——GtkContainer作为所有容器类的基类;
按照容器中可以容纳元素的个数,容器又可以分 为两类:
主要内容
❖ Gtk+的主要功能 ❖ Gtk+简介 ❖ 利用Gtk+开发图形界面程序
基本程序示例 应用容器的程序示例
❖ Gtk+工具包在XWindows中的作用
是Xlib之上更高层的Gtk开+发的作工用具包,它们将底层的Xlib 的API进行封装,提供更高级的接口,达到降低开 发难度,提高开发效率的目的。
常用事件及处理函数原型
事件源 GtkWidget
常用的gtk+事件及处理函数原型
事件名
处理函数原型
show
void user_function (GtkWidget *widget, gpointer data);
expose- gboolean user_function(GtkWidget*widget,
X客户端(应用程序)
X客户端(应用程序)
X工具包、Gtk+,Qt
XLib
X工具包、Gtk+,Qt
XLib
网络协议
X服务器 设备驱动程序
❖ 来源:
Gimp(GUN ImGatgk+e简M介anipulation Program)
❖ 以Gtk+为基础的应用软件
Gimp Glade Gnome Abiword dia等
19 button = gtk_button_new_with_label ("Hello World");

GTK图形编程

GTK图形编程

GTK图形编程【摘要】GTK图形编程是一种用于创建图形用户界面的编程技术。

本文深入探讨了GTK图形编程的重要性,介绍了GTK图形编程框架、基本原理、主要组件以及常见问题。

文章还探讨了GTK图形编程的优势与劣势、影响以及展望。

通过本文的阅读,读者将深入了解GTK图形编程的应用场景,以及未来发展的方向。

GTK图形编程将为软件开发者提供强大的工具和技术,帮助他们更好地设计和实现图形用户界面,为用户提供更好的体验。

【关键词】GTK图形编程,介绍,应用场景,重要性,框架,基本原理,主要组件,常见问题,未来发展,优势,劣势,影响,展望1. 引言1.1 什么是GTK图形编程GTK图形编程是一种基于GTK(GIMP Toolkit)库的框架,用于在Linux操作系统中开发图形用户界面(GUI)应用程序。

GTK是一个开源的跨平台工具套件,被广泛应用于开发桌面应用、媒体播放器、文件管理器等软件。

GTK图形编程通过使用现代化、灵活且可扩展的工具,可以为用户提供美观、直观的图形界面,从而提升用户体验和增强程序的交互性。

GTK图形编程主要通过C语言编程来实现,但也支持多种编程语言的绑定,如Python、JavaScript等,使得开发者可以根据自己的技术偏好选择适合的开发语言进行应用程序的开发。

GTK图形编程的灵活性和跨平台特性使得它成为开发Linux图形界面应用程序的首选工具之一。

GTK图形编程是一种强大且灵活的开发方式,可以帮助开发者快速构建美观、交互性强的图形界面应用程序,在提高用户体验的也提升了开发效率和程序的可维护性。

GTK图形编程的应用场景广泛,有着重要的作用和推动力。

1.2 GTK图形编程的应用场景GTK图形编程是一种基于Gtk+开发工具包的图形用户界面编程技术,它广泛应用于Linux系统和其他开源操作系统中。

GTK图形编程的应用场景非常丰富,其中包括但不限于以下几个方面:1. 桌面应用程序开发:GTK图形编程可以用于开发各种桌面应用程序,包括文本编辑器、音乐播放器、图形设计软件等。

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

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

目录设计背景 (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库支持对象和面向对象编程,这个库通过宏来支持对象继承和多态。

Linux下的GTK图形界面编程

Linux下的GTK图形界面编程

注意fill取FALSE值,expand取TRUE值时与expand取FALSE值,fill值无效的区别。前者的盒子仍是原来创建盒子时指定的大小,而后者的盒子已经缩小到打包组件的大小了。
gtk_box_pack_end()函数的参数与上面描述的一致。只是排列顺序分别是从下到上
,从右到左。
gtk_widget_show (window); /*显示窗口*/
gtk_main (); /*进入睡眠状态,等待事件激活*/
return(0);
}
从上面的程序可以看出,GTK是一个事件驱动工具包,当它运行到gtk_main()函数时会自动睡眠,直到有事件发生,控制权转让给相应的函数调用,在该函数中可以用标准C写出相应的事物逻辑。这与windows 上的程序处理是一样的。
该函数的第二个参数就是上述gtk_signal_connect()函数的返回值,即关联标签。第一个参数指向了去除关联的对象名称。这样可以做到断开事件与回调函数的关联,使得事件发生后,不会调用相关的回调函数。
布局格式
2.1打包盒子
对GTK显示格式的控制是通常通过打包盒子来完成的。widget组件打包可以采用两种方式,水平盒子和垂直盒子。若将widget组件打包进平行盒子,组件就被依次水平的插入窗口;若是垂直盒子,则组件排列是垂直的。产生新的水平盒子的函数为
目前已经开发出来GTK的增强版GTK+。GTK+是将GTK,GDK,GLIB集成在一起的开发包,可以工作在许多类似于UNIX的系统上,没有GTK的平台限制。
1.GTK的消息处理机制
下面我们先看一个基本的例子,该例子产生一个200×200像素的窗口。它不能自己退出,只能通过shell来杀死进程(调用kill命令)。

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+完成界面布局。

GTK 编程

GTK 编程

linux GTK+界面编程——第一篇Linux 操作系统下GTK+界面编程——第一个程序今天,开始在工作之余,抽出时间来学习linux界面编程。

我计划在未来的半年内,学会 linux下的GTK+界面编程。

这个文档作为我学习linux编程的第一个文档,同时它也将上传到我163邮箱所附带的博客中去。

所以,我会尽量做的详细一点。

以后还会有关于linux界面编程之类的学习笔记会被记录并上传到博客中。

我所用的linux版本是Red Hat 9.0第一个程序——Hello,World在开始写第一个程序之前,需要做一点基本操作。

我登陆linux使用的是root用户(根用户,也叫超级用户)。

所以,所有笔记中产生的截图,均是root用户下的。

一、在linux桌面点击右键,在快捷菜单中选择“新建终端”选项,打开类似DOS的窗口,如图1.1所示。

图1.1 终端界面二、使用mkdir命令创建一个文件夹,文件夹命名为gtkgui,命令输入为:mkdir gtkgui 如图1.2所示图1.2 创建gtkgui目录命令输入完毕后敲回车键即可创建目录gtkgui,需要注意的是该目录的路径是:/root/gtktui三、使用cd命令进入目录gtkgui 命令输入:cd gtkgui 如图1.3所示。

图1.3 进入目录gtkgui输入图1.3的命令后敲回车键即可进入目录gtkgui四、创建第一个程序存放的目录,和第一步一样,这次在gtkgui目录下创建一个子目录1gui 然后进入1gui目录。

创建目录命令:mkdir 1gui 进入目录命令:cd lgui 命令界面输入如图1.4所示。

图1.4 在gtkgui目录下创建子目录1gui并进入子目录1gui(注意1gui第一个字符是“一”,不是小写的L)。

小提示:若你想查看当前目录的绝对路径。

可以在终端敲入命令:pwd 效果如图1.5所示图1.5 查看当前目录的绝对路径现在可以清楚的看到当前工作目录是“/root/gtkgui/1gui”。

JAVA中用GUI编程实现计算器模拟

JAVA中用GUI编程实现计算器模拟

JA V A中用GUI编程实现计算器模拟摘要:本文论述了用java对计算器程序进行需求分析、概要设计、详细设计,最后使用Java编程实现的全过程。

设计GUI界面的计算器,用户可以通过鼠标依次输入参加计算的数值,进行加、减、乘、除及求负、取余等,主要用到的组件有框架、面板、文本框、按钮和菜单栏等。

关键词:GUI 计算器一.编程思想定义计算器类calculator,该类继承JFrame类并实现ActionListener接口。

整体窗口采用边界布局,通过另外建立若干面板组件。

North位置的面板上放置一个文本框,用于显示运算中的数据及结果;center位置放置两个按钮,分别用来返回原界面和清零。

再用GridLayout(网格布局)对数字控件和操作按钮进行布局。

此外,单击任何一个按钮都会触发ActionEvent事件,要处理这些事件就必须实现ActionListener接口的actionPerformed方法。

二.程序代码如下import javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;//变量设置如下//继承JFrame类并实现ActionListenter接口public class calculator extends JFrame implements ActionListener{JFrame frame;//数字及操作按钮JButton num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,Back,c;//运算按钮JButtonplusButton,minusButton,multiplyButton,divideButton,residueButton,equalButton,changeButton,d otButton,sqrtButton,reciprocalButton;JMenu fileM;JMenuItem exitM,helpM;JTextField text;//状态变量boolean clicked=true;boolean clear=true;int all=0;double previous;String fuhao;int first=1;//界面设计public calculator(){setTitle("计算器");setSize(300,250);setLocation(400,400);text=new JTextField(25);text.setHorizontalAlignment(JTextField.LEFT);JPanel cp1=new JPanel();JPanel cp2=new JPanel();JPanel cp3=new JPanel();//设置整体布局getContentPane().add(cp1,"North");getContentPane().add(cp2,"Center");getContentPane().add(cp3,"South");cp1.setLayout(new GridLayout(1,1));cp2.setLayout(new GridLayout(1,2));cp3.setLayout(new GridLayout(5,4));plusButton=new JButton("+");//加minusButton=new JButton("-");//减multiplyButton=new JButton("*");//乘divideButton=new JButton("/");//除residueButton=new JButton("%");//余数equalButton=new JButton("=");//等号changeButton=new JButton("+/-");//正负号切换dotButton=new JButton(".");//小数点sqrtButton=new JButton("sqrt");//开方reciprocalButton=new JButton("1/x");//倒数//数字按钮num0=new JButton("0");num1=new JButton("1");num2=new JButton("2");num3=new JButton("3");num4=new JButton("4");num5=new JButton("5");num6=new JButton("6");num7=new JButton("7");num8=new JButton("8");num9=new JButton("9");cp1.add(text);text.setEditable(false);text.setBackground(Color.white);//监听设置Back=new JButton("Back");Back.addActionListener(this);c=new JButton("C");c.addActionListener(this);cp2.add(Back);cp2.add(c);cp3.add(num7);num7.addActionListener(this);cp3.add(num8);num8.addActionListener(this);cp3.add(num9);num9.addActionListener(this);cp3.add(divideButton); divideButton.addActionListener(this);cp3.add(num4);num4.addActionListener(this);cp3.add(num5);num5.addActionListener(this);cp3.add(num6);num6.addActionListener(this);cp3.add(multiplyButton); multiplyButton.addActionListener(this); cp3.add(num1);num1.addActionListener(this);cp3.add(num2);num2.addActionListener(this);cp3.add(num3);num3.addActionListener(this);cp3.add(minusButton); minusButton.addActionListener(this);cp3.add(num0);num0.addActionListener(this);cp3.add(changeButton); changeButton.addActionListener(this); cp3.add(dotButton);dotButton.addActionListener(this);cp3.add(plusButton);plusButton.addActionListener(this);cp3.add(reciprocalButton); reciprocalButton.addActionListener(this); cp3.add(residueButton); residueButton.addActionListener(this); cp3.add(sqrtButton);sqrtButton.addActionListener(this);cp3.add(equalButton);equalButton.addActionListener(this);//添加菜单组件JMenuBar mainMenu= new JMenuBar();setJMenuBar(mainMenu);JMenu editMenu=new JMenu("文件");JMenu helpMenu=new JMenu("帮助");helpM= new JMenuItem("关于");mainMenu.add(editMenu);mainMenu.add(helpMenu);helpMenu.add(helpM);helpM.addActionListener(this);fileM=new JMenu(" 文件");exitM=new JMenuItem(" 退出");fileM.addActionListener(this);exitM.addActionListener(this);editMenu.add(fileM);editMenu.add(exitM);setVisible(true);addWindowListener(new WindowDestroyer());//结束窗口}//响应动作代码public void actionPerformed(ActionEvent e){if (first ==1)text.setText("");first=0;Object temp=e.getSource();if (temp==exitM)System.exit(0);if (temp==helpM)JOptionPane.showMessageDialog(null,"请查看帮助文档","帮助", RMA TION_MESSAGE);//退格if (temp== Back){String s=text.getText();text.setText("");for (int i=0;i<s.length()-1;i++){char a=s.charAt(i);text.setText(text.getText()+a);}}//清零if (temp==c){text.setText("0.");clear=true;first=1;}if (temp==num0){//判断是否单击了符号位if (clear==false)text.setText("");text.setText(text.getText()+"0"); }if (temp==num1){if (clear==false)text.setText("");text.setText(text.getText()+"1");clear=true;}if (temp==num2){if (clear==false)text.setText("");text.setText(text.getText()+"2");clear=true;}if (temp==num3){if (clear==false)text.setText("");text.setText(text.getText()+"3");clear=true;}if (temp==num4){if (clear==false)text.setText("");text.setText(text.getText()+"4");clear=true;}if (temp==num5){if (clear==false)text.setText("");text.setText(text.getText()+"5");clear=true;}if (temp==num6){if (clear==false)text.setText("");text.setText(text.getText()+"6");clear=true;}if (temp==num7){if (clear==false)text.setText("");text.setText(text.getText()+"7");clear=true;}if (temp==num8){if (clear==false)text.setText("");text.setText(text.getText()+"8");clear=true;}if (temp==num9){if (clear==false)text.setText("");text.setText(text.getText()+"9");clear=true;}//判断是否含有小数点if (temp == dotButton){clicked=true;for (int i=0;i<text.getText().length();i++)if ('.'==text.getText().charAt(i)){clicked = false;break;}if (clicked == true)text.setText(text.getText()+".");}try{if (temp==plusButton){previous=Double.parseDouble(text.getText());fuhao="+";clear=false;}if (temp==minusButton){previous=Double.parseDouble(text.getText());fuhao="-";clear=false;}if (temp==multiplyButton){previous=Double.parseDouble(text.getText());fuhao="*";clear=false;}if (temp==divideButton){previous=Double.parseDouble(text.getText());fuhao="/";clear=false;}if (temp==equalButton){double next = Double.parseDouble(text.getText());text.setText("");if (fuhao =="+")text.setText(previous + next +"");if (fuhao =="-")text.setText(previous - next +"");if (fuhao =="*")text.setText(previous * next +"");if (fuhao =="/")if (next==0)text.setText("除数不能为零");elsetext.setText(previous + next +"");if (fuhao =="%")text.setText(previous % next +"");clear=false;}if (temp==sqrtButton){String s=text.getText();if (s.charAt(0)== '-')text.setText("负数不能开根号");elsetext.setText(Double.toString(ng.Math.sqrt(Double.parseDouble(text.getText()))));clear = false;}if (temp==reciprocalButton){if (text.getText().charAt(0)=='0'&& text.getText().length()==1)text.setText("除数不能为零");else{boolean isDec = true;int i,j,k;String s=Double.toString(1/Double.parseDouble(text.getText()));for (i=0;i<s.length();i++)if (s.charAt(i)=='.')break;for (j=i+1;j<s.length();j++)if (s.charAt(j)=='0'){isDec=false;break;}if (isDec == true){String stemp = "";for (k=0;k<i;k++)stemp += s.charAt(k);text.setText(stemp);}elsetext.setText(s);}clear = false;}if ( temp == residueButton){previous=Double.parseDouble(text.getText());fuhao="%";clear=false;}if ( temp == changeButton){boolean isNumber = true;String s = text.getText();for (int i=0;i<s.length();i++)if (!(s.charAt(i)>= '0'&& s.charAt(i)<= '9' ||s.charAt(i)>= '.'||s.charAt(i)>= '-' )){isNumber = false;break;}if (isNumber == true)//切换‘-’号{if (s.charAt(0) == '-'){text.setText("");for (int i=1;i<s.length();i++){char a=s.charAt(i);text.setText(text.getText()+ a);}}elsetext.setText('-'+ s);}}}catch (Exception e3){text.setText("There is a wrong");clear = false;}}//关闭窗口class WindowDestroyer extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}}public static void main(String arg[]){JFrame.setDefaultLookAndFeelDecorated(true);calculator cal = new calculator();}}三.程序运行结果如下图图3-1 计算器界面四.总结该程序显示GUI用户界面,既能实现实数的加、减、乘、除四则运算,也能进行开方、求余、倒数以及正负号转换的运算。

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

目录一.课程设计目的 (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和cehbox1 = gtk_hbox_new(FALSE,0);gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);button = gtk_button_new_with_label("Back"); //按键Backgtk_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"); //按键MCgtk_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); //数一elsemm = 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平台下图形界面——计算器设计的课程设计。

相关文档
最新文档