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

c 课程设计计算器报告一、教学目标本课程的教学目标是使学生掌握C语言的基本语法,熟练使用C语言进行程序设计。
具体分为三个部分:1.知识目标:学生需要掌握C语言的基本语法,包括数据类型、运算符、控制结构、函数等。
2.技能目标:学生能够使用C语言编写简单的程序,解决实际问题。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生解决问题的能力。
二、教学内容教学内容主要包括C语言的基本语法和程序设计的基本方法。
具体安排如下:1.第一章:C语言概述,介绍C语言的历史和发展,理解C语言的特点。
2.第二章:数据类型和运算符,学习C语言的基本数据类型和运算符。
3.第三章:控制结构,学习C语言的条件语句和循环语句。
4.第四章:函数,学习C语言的函数定义和调用。
5.第五章:数组和字符串,学习C语言的数组和字符串操作。
6.第六章:指针,学习C语言的指针概念和应用。
7.第七章:结构体和文件,学习C语言的结构体和文件操作。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法:1.讲授法:讲解C语言的基本语法和概念。
2.案例分析法:通过分析实际案例,让学生理解C语言的应用。
3.实验法:安排实验课程,让学生动手编写C语言程序。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C程序设计语言》2.参考书:《C Primer Plus》、《C和指针》3.多媒体资料:教学PPT、视频教程4.实验设备:计算机、编程环境五、教学评估本课程的评估方式包括平时表现、作业、考试等。
具体安排如下:1.平时表现:占课程总评的30%,包括课堂参与度、提问回答、小组讨论等。
2.作业:占课程总评的30%,包括课后练习、编程任务等。
3.考试:占课程总评的40%,包括期中考试和期末考试。
评估方式要求客观、公正,能够全面反映学生的学习成果。
我们将根据学生的实际情况,及时给予反馈,帮助学生提高。
六、教学安排本课程的教学进度安排如下:1.每周一次课,每次课2小时。
C语言实现计算器的两种方法

C语⾔实现计算器的两种⽅法本⽂实例为⼤家分享了C语⾔实现计算器的具体代码,供⼤家参考,具体内容如下C语⾔计算器两种⽅法//⼀般做法#include<stdio.h>#include<windows.h>//#include<assert.h>void menu(){printf("**************************\n");printf("****欢迎来到计算器页⾯****\n");printf("**** 1.add 2.mul *****\n");printf("*****3.sub 4.div1 *****\n");printf("*****0.exit *****\n");printf("**************************\n");}int add(int x, int y){return x + y;}int mul(int x, int y){return x * y;}int sub(int x, int y){return x - y;}int div1(int x, int y){return x / y;}int main(){int n = 1;menu();while (n){printf("请输⼊选项:\n");scanf("%d", &n);int x = 0, y = 0;/*printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);*///若将两个数字输⼊放在此处会出现输⼊错误时不能退出系统,⽽是显⽰“输⼊两个整数”的提⽰switch (n){case 1:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", add(x, y));break;case 2:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", mul(x, y));break;case 3:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", sub(x, y));break;case 4:printf("请输⼊两个整数!\n");scanf("%d%d", &x, &y);printf("%d\n", div1(x, y));break;case 0:printf("退出计算器!\n");break;default:printf("输⼊错误,请重新输⼊!\n");}}}//使⽤函数指针数组解决计算器问题#include<stdio.h>#include<windows.h>//#include<assert.h>void menu(){printf("**************************\n");printf("****欢迎来到计算器页⾯****\n");printf("**** 1.add 2.mul *****\n");printf("*****3.sub 4.div1 *****\n");printf("*****0.exit *****\n");printf("**************************\n");}int add(int x, int y){return x + y;}int mul(int x, int y){return x * y;}int sub(int x, int y){return x - y;}int div1(int x, int y){return x / y;}int main(){int n = 1;menu();while (n){printf("请输⼊选项:\n");scanf("%d", &n);int(*arr[5])() = { 0,add,mul,sub,div1 };//转移表 //定义⼀个函数指针数组,存放函数地址if (n >= 0 && n < 5){int x = 0, y = 0;printf("请输⼊两个整数:>\n");scanf("%d%d", &x, &y);printf("%d\n", (*arr[n])(x,y));//输出结果}else{printf("输⼊有误,请重新输⼊!\n");scanf("%d", &n);}}system("pause");return 0;}两种⽅法相⽐,第⼀种相似代码较多,⽐较冗余;第⼆种代码简洁直观,程序效率⾼。
用C语言实现计算器功能

⽤C语⾔实现计算器功能本⽂实例为⼤家分享了⽤C语⾔实现计算器功能的具体代码,供⼤家参考,具体内容如下代码如下:#include<stdio.h> //C语⾔编写计算器程序 ^_^void Counter1(int a,int b,char op); //函数声明!void Counter2(double c,double d,char op);void Show_Sum1(int a,char op,int b,int sum);void Show_Sum2(double c,double d,char op,double sum);int Add(int a,int b);int Sub(int a,int b);int Mul(int a,int b);double Div(double a,double b);int main(){int a=0,b=0;//初始化double c=0.0,d=0.0;char op='#';char ch='#';int choi=0;do{printf("请输⼊数据:(想使⽤加法减法乘法功能输⼊1,使⽤除法功能输⼊2)\n");scanf("%d",&choi);if(choi==1){printf("输⼊数据的格式:数值运算符数值\n");scanf("%d %c %d",&a,&op,&b);//别忘记取地址运算符!!fflush(stdin);//⽤来清理缓存区!(执⾏输⼊以'\n'代表输⼊结束,'\n'会留在缓存区,故应先清空缓存区以防ch接收到该字符⽽结束循环!) Counter1(a,b,op);}else if(choi==2){printf("输⼊数据的格式:数值运算符数值\n");scanf("%lf %c %lf",&c,&op,&d);//别忘记取地址运算符!!fflush(stdin);//⽤来清理缓存区!(执⾏输⼊以'\n'代表输⼊结束,'\n'会留在缓存区,故应先清空缓存区以防ch接收到该字符⽽结束循环!) Counter2(c,d,op);}printf("是否继续?(Y/N):\n");ch=getchar();//输⼊字符Y(y)或N(n)}while(ch=='Y'||ch=='y');return 0;}void Counter1(int a,int b,char op){int sum=0;int optag=true;//以防分母为零(出现错误)或输⼊错误字符仍调⽤Show_Sum()函数进⾏输出。
C语言实现计算器功能

C语言实现计算器功能C语言计算器实现是一种基本的编程练习,可以结合简单的数学表达式解析和计算功能来实现一个基本的计算器。
以下是一个简单的示例,它可以接受用户输入的数学表达式并返回计算结果。
首先,我们需要包含标准输入/输出库(stdio.h)和字符串处理库(string.h)。
我们还需要定义一些函数来处理数学表达式的解析和计算。
```c#include <stdio.h>#include <string.h>//返回运算符的优先级int precedence(char op)if (op == '+' , op == '-')return 1;if (op == '*' , op == '/')return 2;return 0;//执行四则运算int calculate(int a, int b, char op)switch (op)case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;}return 0;//解析数学表达式并计算结果int evaluate(char *expression)int i;//创建两个空栈,用于操作数和运算符int values[100];int top_values = -1;char ops[100];int top_ops = -1;//遍历表达式的每个字符for (i = 0; i < strlen(expression); i++)//如果字符是一个数字,将其解析为整数,并将其推到操作数栈中if (expression[i] >= '0' && expression[i] <= '9')int value = 0;while (i < strlen(expression) && expression[i] >= '0' && expression[i] <= '9')value = value * 10 + (expression[i] - '0');i++;}values[++top_values] = value;}//如果字符是一个左括号,将其推到运算符栈中else if (expression[i] == '(')ops[++top_ops] = expression[i];}//如果字符是一个右括号,执行所有高优先级的运算else if (expression[i] == ')')while (top_ops > -1 && ops[top_ops] != '(')int b = values[top_values--];int a = values[top_values--];char op = ops[top_ops--];values[++top_values] = calculate(a, b, op);}top_ops--;}//如果字符是一个运算符,执行所有高优先级的运算elsewhile (top_ops > -1 && precedence(ops[top_ops]) >= precedence(expression[i]))int b = values[top_values--];int a = values[top_values--];char op = ops[top_ops--];values[++top_values] = calculate(a, b, op);}ops[++top_ops] = expression[i];}}//执行剩余的运算while (top_ops > -1)int b = values[top_values--];int a = values[top_values--];char op = ops[top_ops--];values[++top_values] = calculate(a, b, op);}//返回最终结果return values[top_values];int mainchar expression[100];printf("请输入数学表达式:");scanf("%s", expression);int result = evaluate(expression);printf("结果:%d\n", result);return 0;```上面的代码使用了栈来解析和计算数学表达式。
C课程设计(计算器)[转载]
![C课程设计(计算器)[转载]](https://img.taocdn.com/s3/m/b3a47009a9956bec0975f46527d3240c8447a1f8.png)
04
C语言函数
函数的定义和声明
函数定义:函数是完成特定任务的独立代码块,可以重复使用 函数声明:在函数定义之前,需要先声明函数,以便编译器知道函数的存在 函数参数:函数可以接受参数,参数可以是变量、常量或其他表达式 函数返回值:函数可以返回一个值,返回值可以是任何类型的数据
2010年代,全球科学家共 同研发了第一台量子计算
机
计算器的应用场景
家庭日常计算:如购物、做饭等 学校教育:如数学、物理等学科的教学和练习 商业计算:如财务、会计等业务的计算和统计 科研计算:如科学研究、工程计算等数据的处理和分析
02
C语言基础
C语言概述
C语言是一种高级 编程语言,广泛应 用于系统编程、嵌 入式系统、驱动程 序等领域。
01
计算器概述
计算器的基本功能
加减乘除运算 平方、开方、求余等高级运算 存储和读取数据
计算器模式切换(如科学计算器、工 程计算器等)
单位转换(如长度、重量、温度等)
计算器设置(如时间、日期、闹钟等)
计算器的发展历程
1820年,英国数学家查尔 斯·巴比奇发明了第一台差
分机
1960年代,日本科学家发 明了第一台便携式电子计
执行流程:函 数被调用后, 会按照函数体 中的代码顺序
执行
返回值:函数 执行完成后,
可以通过 return语句返
回一个值
结束调用:函 数执行完成后, 会返回到调用 函数的位置, 继续执行后面
的代码
05
计算器功能实现
输入输出处理
输入:键盘输入,支持数字、运算符号等 输出:显示屏显示计算结果 处理:计算器内部进行计算,包括加减乘除等基本运算 错误处理:输入错误时,给出提示信息,如“输入错误,请重新输入”
C语言实现计算器功能

C语言实现计算器功能计算机科学中的计算器功能是一个非常常见的问题。
在C语言中,我们可以使用各种技术和算法来实现这个功能。
在本文中,我将介绍一种简单的实现方法,该方法可以处理基本的四则运算。
首先,我们需要定义我们的计算器结构。
在C语言中,我们可以使用结构来组织相关的数据和函数。
我们可以定义一个名为 Calculator 的结构体,它包含两个浮点数类型的操作数和一个字符类型的操作符。
```ctypedef structfloat operand1;float operand2;char operator;} Calculator;```接下来,我们可以定义一些辅助函数来执行各种计算。
我们可以使用switch 语句来根据操作符执行相应的操作。
我们可以使用 scanf 函数来读取用户输入的操作数和操作符。
```cfloat add(float operand1, float operand2)return operand1 + operand2;float subtract(float operand1, float operand2)return operand1 - operand2;float multiply(float operand1, float operand2)return operand1 * operand2;float divide(float operand1, float operand2)return operand1 / operand2;void calculate(Calculator* calculator)switch(calculator->operator)case '+':printf("Result: %f\n", add(calculator->operand1, calculator->operand2));break;case '-':printf("Result: %f\n", subtract(calculator->operand1, calculator->operand2));break;case '*':printf("Result: %f\n", multiply(calculator->operand1, calculator->operand2));break;case '/':printf("Result: %f\n", divide(calculator->operand1,calculator->operand2));break;default:printf("Invalid operator\n");break;}```现在我们可以编写一个主函数来演示我们的计算器功能。
基于GTK+的单词数值计算器

#include <gtk/gtk.h>#include <stdio.h>#include <string.h>GtkWidget *word_entry,*value_entry,*way_entry,*warn_label;//以下为回调函数void closeApp(GtkWidget *window,gpointer data){ //关闭窗口gtk_main_quit();}void button_cal_1(GtkWidget *window,gpointer data){ //计算结果并显示在输出框const gchar *word_input;gchar *word;gint i,j=0,sum=0;word_input=gtk_entry_get_text(GTK_ENTRY(word_entry));for ( i=0 ; i<strlen(word_input) ;i++){if ( *(word_input+i)<'A' || *(word_input+i)>'Z' ){sum=-1;break;}sum+=*(word_input+i)-'A'+1;}gtk_entry_set_text(GTK_ENTRY(value_entry),""); //每次计算先清空显示框内容if ( sum==0 ) {gtk_entry_set_text(GTK_ENTRY(value_entry),"没有输入");}else if ( sum > 0) {gtk_entry_prepend_text(GTK_ENTRY(value_entry),"%");}else {gtk_entry_set_text(GTK_ENTRY(value_entry),"输入含非法字符");}while ( sum > 0){*word=sum%10+'0';sum=sum/10;gtk_entry_prepend_text(GTK_ENTRY(value_entry),word);}}void button_cal_2(GtkWidget *window,gpointer date){const gchar *filename;char s[100];int sum,i;filename=gtk_entry_get_text(GTK_ENTRY(way_entry));if((freopen(filename,"r",stdin))==NULL){gtk_label_set_text(GTK_LABEL(warn_label),"该文件不存在!");}else{freopen("result.txt","w",stdout);while(scanf("%s",s)!=EOF){for(i=0,sum=0;i<strlen(s);i++){sum+=s[i]-'A'+1;}printf("%d%\n",sum);}gtk_label_set_text(GTK_LABEL(warn_label),"恭喜,计算完成!");}}void button_clear1(GtkWidget *window,gpointer date){ //清空输入框和显示框gtk_entry_set_text(GTK_ENTRY(word_entry),"");gtk_entry_set_text(GTK_ENTRY(value_entry),"");}int main(int argc,char *argv[]){GtkWidget *window;GtkWidget *fixed;GtkWidget *word_label,*value_label,*way_label;GtkWidget *ok_button1,*ok_button2,*clear_button;gtk_init(&argc,&argv);fixed=gtk_fixed_new();window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window),"单词计算器");gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);//窗口显示在桌面中间gtk_window_set_default_size(GTK_WINDOW(window),300,210);//设置窗体大小// gtk_widget_set_usize(fixed,150,150);//以下为连接回调函数g_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(closeApp),NU LL);word_label=gtk_label_new("请输入单词:");value_label=gtk_label_new("该单词的值:");way_label=gtk_label_new("输入文件路径:");warn_label=gtk_label_new("");word_entry=gtk_entry_new();value_entry=gtk_entry_new();way_entry=gtk_entry_new();// gtk_entry_set_visibility(GTK_ENTRY(value_entry),FALSE);ok_button1=gtk_button_new_with_label("计算");ok_button2=gtk_button_new_with_label("计算");clear_button=gtk_button_new_with_label("清空");gtk_editable_set_editable(GTK_EDITABLE(value_entry),FALSE);//输入框不可编辑gtk_widget_set_size_request(value_entry,150,28);//设置输入框长度gtk_widget_set_size_request(word_entry,150,28);gtk_widget_set_size_request(way_entry,230,28);//以下为连接回调函数g_signal_connect(GTK_OBJECT(ok_button1),"clicked",GTK_SIGNAL_FUNC(button_cal_ 1),value_entry);g_signal_connect(GTK_OBJECT(ok_button2),"clicked",GTK_SIGNAL_FUNC(button_cal_ 2),value_entry);g_signal_connect(GTK_OBJECT(clear_button),"clicked",GTK_SIGNAL_FUNC(button_cle ar1),value_entry);//进行界面设计gtk_fixed_put(GTK_FIXED(fixed),word_label,10,30);gtk_fixed_put(GTK_FIXED(fixed),value_label,10,73);gtk_fixed_put(GTK_FIXED(fixed),way_label,10,120);gtk_fixed_put(GTK_FIXED(fixed),word_entry,90,25);gtk_fixed_put(GTK_FIXED(fixed),value_entry,90,65);gtk_fixed_put(GTK_FIXED(fixed),way_entry,10,145);gtk_fixed_put(GTK_FIXED(fixed),ok_button1,250,65);gtk_fixed_put(GTK_FIXED(fixed),ok_button2,250,145);gtk_fixed_put(GTK_FIXED(fixed),clear_button,250,25);gtk_fixed_put(GTK_FIXED(fixed),warn_label,150,180);gtk_container_add(GTK_CONTAINER(window),fixed);gtk_widget_show_all(window);gtk_main();return 0;}。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 <gtk/gtk.h>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/gtk.h>来包含所必需的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,则强制盒中每个构件都占据相同大小的空间,而不管每个构件的大小,spacing则以像素为单位设置构件的间距。
一旦创建好组装盒之后,就可以使用下面的函数来添加构件:void gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);void gtk_box_pack_end (GtkBox *box, GtkWidget *child, gboolean expand , gboolean fill, guint padding);其中第一个是向GtkBox的右边和底部增加构件,而gtk_box_pack_end则向左边和顶部增加构件。
它们的参数控制组装盒中每个构件的间距和格式:GtkBox *box 将被填充的组装盒GtkWidget *child 将放入组装盒的构件gboolean expand 如果为TRUE,则这个构件将填充与其他改标志也被设为TRUE的构件共享的所有可用空间gboolean fill 如果为TRUE,则这个构件将填满分配给它的空间,而不是将它作为围绕它的边缘填充guint padding 围绕在构件周围的以像素为单位的填充GtkButton能派生出很多按钮构件,他们有着丰富的功能,通过创建不同类型的按钮,并把它按照界面设计装入盒容器中,即可构建好所需要的界面。
输入框的实现GtkEntry是一个单行文本输入构件,常用于输入简单的文本信息,可以通过相应的API调用来设置和读取输入的文本,设置允许的最大字符数,以及设置设置其他一些属性来控制文本的定位和选择。
要获取GtkEntry的内容,可以调用gtk_entry_get_text函数,它将返回GtkEntry内部的一个const char指针,如果想修改这个文本或把它传给一个可能修改的函数,就必须使用像strcpy这样的函数来复制这个字符串。
可以通过_set_text、_appen_end_text、_modift_text函数来手工设置或修改它的内容,这些函数都使用const指针作为参数。
采用一个纵向盒装容器和多个横向盒装容器设计,另外在单行输入控件的阅读方向属性上用gtk_widget_set_direction设定为GTK_TEXT_DIR_RTL,即从右到左,使此控件的数字显示器更像一个计算器的显示屏。
回调函数的实现在程序中多次用到stdli.h和glib中将字符串转换为浮点数和将浮点数转换为字符串的转换函数。
在键盘处理程序中,用到gdk/gdkkeysyms.h中键值的宏定义,字符处理中用到string.h相关函数,故应该在头文件中包含这三个函数。
数字键0-9的功能是向计算器输入数字,通过记位和定位,最后显示出来,所以它们的回调函数是同一个,只是传递的参数不同而已。