博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算器---gtk---002
阅读量:6396 次
发布时间:2019-06-23

本文共 15987 字,大约阅读时间需要 53 分钟。

hot3.png

文件目录列表:

文件列表:

laolang@laolang:~/code/gtk/eclipse/fanli/my_jisuan_two$ tree -L 2.├── calHandle.o├── calMain.o├── cal.o├── Debug│   ├── makefile│   ├── objects.mk│   ├── sources.mk│   └── subdir.mk├── doc│   └── html├── Doxyfile├── Doxyfile.bak├── Doxyfile.default├── helloGTK.c├── include│   ├── cal.h│   └── calHandle.h├── Makefile├── src│   ├── cal.c│   ├── calHandle.c│   └── calMain.c└── test5 directories, 18 fileslaolang@laolang:~/code/gtk/eclipse/fanli/my_jisuan_two$

calMain.c//主函数,

//Helloworld.c#include 
#include"../include/calHandle.h"/** @brief 创建数字,运算符和等于号部分 * * @return 创建的表格容器 */GtkWidget * create_table(struct _calhandle * handle);/** @brief 数字按钮单击 * * @param button * @param data 表达式处理器 */void on_button_num_clicked(GtkWidget * button, gpointer data);/** @brief 运算符单击 * * @param button * @param data 表达式处理器 */void on_button_op_clicked(GtkWidget * button, gpointer data);/** @brief 小数点单击 * * @param button * @param data 表达式处理器 */void on_button_dot_clicked(GtkWidget * button, gpointer data);/** @brief 等于单击 * * * @param button * @param data 表达式处理器 */void on_button_eq_clicked(GtkWidget * button, gpointer data);/** @brief 清除按钮,清除本次数字输入,以便重新输入 * * @param button * @param data 表达式处理器 */void on_button_clear_clicked(GtkWidget * button, gpointer data);int main(int argc, char *argv[]) { //主窗体 GtkWidget *window; //主容器 GtkWidget * vbox_contain; //清除按钮和标签容器 GtkWidget * hbox_top; //标签 GtkWidget * label; //清除按钮 GtkWidget * button_clear; //显示输入和结果 GtkWidget * entry; //数字区表格容器 GtkWidget * table; struct _calhandle * handle; gtk_init(&argc, &argv); //主窗体 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "计算器---gtk---002"); gtk_window_set_default_size(GTK_WINDOW(window), 220, 240); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(window), 10); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); //主容器 vbox_contain = gtk_vbox_new( FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox_contain), 3); gtk_container_add(GTK_CONTAINER(window), vbox_contain); //上半部窗口 hbox_top = gtk_hbox_new( FALSE, 0); label = gtk_label_new("计算器--gtk002"); button_clear = gtk_button_new_with_label("清除"); gtk_box_pack_start(GTK_BOX(hbox_top), label, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox_top), button_clear, FALSE, FALSE, 10); gtk_box_pack_start(GTK_BOX(vbox_contain), hbox_top, FALSE, FALSE, 3); //显示框 entry = gtk_entry_new(); //设置显示框从右向左显示 gtk_widget_set_direction(entry, GTK_TEXT_DIR_RTL); gtk_box_pack_start(GTK_BOX(vbox_contain), entry, FALSE, FALSE, 3); handle = cal_handle_init(entry); g_signal_connect(G_OBJECT(button_clear), "clicked", G_CALLBACK(on_button_clear_clicked), (gpointer )handle); //下半部数字区 table = create_table(handle); gtk_box_pack_start(GTK_BOX(vbox_contain), table, FALSE, FALSE, 3); gtk_widget_show_all(window); gtk_main(); return 0;}/** @brief 创建数字区 * * @return */GtkWidget * create_table(struct _calhandle * handle) { //表格容器 GtkWidget * table; //数字 GtkWidget * button_0; GtkWidget * button_1; GtkWidget * button_2; GtkWidget * button_3; GtkWidget * button_4; GtkWidget * button_5; GtkWidget * button_6; GtkWidget * button_7; GtkWidget * button_8; GtkWidget * button_9; //小数点 GtkWidget * button_dot; //等于号 GtkWidget * button_eq; //运算符 GtkWidget * button_sum; GtkWidget * button_minus; GtkWidget * button_ride; GtkWidget * button_divide; //创建各个组件并与相关事件处理函数连接起来 button_0 = gtk_button_new_with_label("0"); g_signal_connect(G_OBJECT(button_0), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_1 = gtk_button_new_with_label("1"); g_signal_connect(G_OBJECT(button_1), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_2 = gtk_button_new_with_label("2"); g_signal_connect(G_OBJECT(button_2), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_3 = gtk_button_new_with_label("3"); g_signal_connect(G_OBJECT(button_3), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_4 = gtk_button_new_with_label("4"); g_signal_connect(G_OBJECT(button_4), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_5 = gtk_button_new_with_label("5"); g_signal_connect(G_OBJECT(button_5), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_6 = gtk_button_new_with_label("6"); g_signal_connect(G_OBJECT(button_6), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_7 = gtk_button_new_with_label("7"); g_signal_connect(G_OBJECT(button_7), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_8 = gtk_button_new_with_label("8"); g_signal_connect(G_OBJECT(button_8), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_9 = gtk_button_new_with_label("9"); g_signal_connect(G_OBJECT(button_9), "clicked", G_CALLBACK(on_button_num_clicked), (gpointer )handle); button_dot = gtk_button_new_with_label("."); g_signal_connect(G_OBJECT(button_dot), "clicked", G_CALLBACK(on_button_dot_clicked), handle); button_eq = gtk_button_new_with_label("="); g_signal_connect(G_OBJECT(button_eq), "clicked", G_CALLBACK(on_button_eq_clicked), handle); button_sum = gtk_button_new_with_label("+"); g_signal_connect(G_OBJECT(button_sum), "clicked", G_CALLBACK(on_button_op_clicked), (gpointer )handle); button_minus = gtk_button_new_with_label("-"); g_signal_connect(G_OBJECT(button_minus), "clicked", G_CALLBACK(on_button_op_clicked), (gpointer )handle); button_ride = gtk_button_new_with_label("*"); g_signal_connect(G_OBJECT(button_ride), "clicked", G_CALLBACK(on_button_op_clicked), (gpointer )handle); button_divide = gtk_button_new_with_label("/"); g_signal_connect(G_OBJECT(button_divide), "clicked", G_CALLBACK(on_button_op_clicked), (gpointer )handle); //创建表格容器 table = gtk_table_new(4, 4, TRUE);// gtk_table_set_row_spacing(GTK_TABLE(table), 4, 5);// gtk_table_set_col_spacing(GTK_TABLE(table), 4, 5);//将各个组件添加到表格窗口 gtk_table_attach_defaults(GTK_TABLE(table), button_7, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), button_8, 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), button_9, 2, 3, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), button_sum, 3, 4, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), button_4, 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), button_5, 1, 2, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), button_6, 2, 3, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 3, 4, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), button_1, 0, 1, 2, 3); gtk_table_attach_defaults(GTK_TABLE(table), button_2, 1, 2, 2, 3); gtk_table_attach_defaults(GTK_TABLE(table), button_3, 2, 3, 2, 3); gtk_table_attach_defaults(GTK_TABLE(table), button_ride, 3, 4, 2, 3); gtk_table_attach_defaults(GTK_TABLE(table), button_0, 0, 1, 3, 4); gtk_table_attach_defaults(GTK_TABLE(table), button_dot, 1, 2, 3, 4); gtk_table_attach_defaults(GTK_TABLE(table), button_eq, 2, 3, 3, 4); gtk_table_attach_defaults(GTK_TABLE(table), button_divide, 3, 4, 3, 4); return table;}/** @brief 数字按钮单击 * * @param button * @param data 表达式处理器 */void on_button_num_clicked(GtkWidget * button, gpointer data) { const gchar * num = gtk_button_get_label((GtkButton*) button); struct _calhandle * handle = (struct _calhandle *) data; cal_handle_append(handle, num[0]);}/** @brief 运算符单击 * * @param button * @param data 表达式处理器 */void on_button_op_clicked(GtkWidget * button, gpointer data) { const gchar * op = gtk_button_get_label((GtkButton*) button); struct _calhandle * handle = (struct _calhandle *) data; cal_handle_append_op(handle, op[0]);}/** @brief 小数点单击 * * @param button * @param data 表达式处理器 */void on_button_dot_clicked(GtkWidget * button, gpointer data) { char dot = gtk_button_get_label((GtkButton*) button)[0]; struct _calhandle * handle = (struct _calhandle *) data; cal_handle_append_dot(handle, dot);}/** @brief 等于单击 * * * @param button * @param data 表达式处理器 */void on_button_eq_clicked(GtkWidget * button, gpointer data) { struct _calhandle * handle = (struct _calhandle *) data; cal_handle_cal(handle);}/** @brief 清除按钮,清除本次数字输入,以便重新输入 * * @param button * @param data 表达式处理器 */void on_button_clear_clicked(GtkWidget * button, gpointer data) { struct _calhandle * handle = (struct _calhandle *) data; GtkEntry * entry = (GtkEntry*) handle->entry; gtk_entry_set_text(entry, ""); handle->len = 0; if (-1 == handle->num) { handle->one[0] = '\0'; } if (1 == handle->num) { handle->two[0] = '\0'; }}

cal.h//计算模块

/*+ * cal.h * *  Created on: 2014年11月27日 *      Author: laolang */#ifndef INCLUDE_CAL_H_#define INCLUDE_CAL_H_int sum( int a, int b );/** @brief 加 *  * @param a * @param b * @return a + b  */char * cal_sum( char * a, char * b );/** @brief 减 *  * @param a * @param b * @return a - b  */char * cal_minus( char * a, char * b );/** @brief 乘 *  * @param a * @param b * @return a * b  */char * cal_ride( char * a, char * b );/** @brief 除 *  * @param af * @param b * @return a / b  */char * cal_divide( char * a, char * b );/** @brief 处理计算结果,使其具有合理的格式 * 如去除末尾多余的0或小数点 * @param res */void cal_result_handle( char * res );/** @brief 查找字符 ch 在字符串 str 中第一次出现的位置 *  * @param str * @param ch * @return ch 第一次出现的位置 * @retval -1 未找到 */int cal_str_ch_index( char * str, char ch );#endif /* INCLUDE_CAL_H_ */

cal.c//计算模块实现

#include"../include/cal.h"#include
#include
#include
int sum(int a, int b) { return a + b;}/** 加 * * @param a * @param b * @return a + b */char * cal_sum(char * a, char * b) { double da = 0; double db = 0; da = atof(a); db = atof(b); char * res = (char*) malloc(sizeof(char) * 20); sprintf(res, "%lf", da + db); cal_result_handle(res); return res;}/** @brief 减 * * @param a * @param b * @return a - b */char * cal_minus(char * a, char * b) { double da = atof(a); double db = atof(b); char * res = (char*) malloc(sizeof(char) * 20); sprintf(res, "%lf", da - db); cal_result_handle(res); return res;}/** @brief 乘 * * @param a * @param b * @return a * b */char * cal_ride(char * a, char * b) { double da = atof(a); double db = atof(b); char * res = (char*) malloc(sizeof(char) * 20); sprintf(res, "%lf", da * db); cal_result_handle(res); return res;}/** @brief 除 * * @param af * @param b * @return a / b */char * cal_divide(char * a, char * b) { double da = atof(a); double db = atof(b); char * res = (char*) malloc(sizeof(char) * 20); sprintf(res, "%lf", da / db); cal_result_handle(res); return res;}/** @brief 处理计算结果,使其具有合理的格式 * 如去除末尾多余的0或小数点 * @param res */void cal_result_handle(char * res) { int len = strlen(res); int dot_index = cal_str_ch_index(res, '.'); int i = 0; int not_zero = len - 1; if (0 == len) { return; } for (i = len - 1; i >= dot_index; i--) { if ('0' != res[i]) { not_zero = i; break; } } if (not_zero == dot_index) { res[not_zero] = '\0'; } else { res[not_zero + 1] = '\0'; }}/** @brief 查找字符 ch 在字符串 str 中第一次出现的位置 * * @param res * @param ch * @return ch 第一次出现的位置 * @retval -1 未找到 */int cal_str_ch_index(char * str, char ch) { int len = strlen(str); int i = 0; int result = -1; for (i = 0; i < len; i++) { if (ch == str[i]) { result = i; break; } } return result;}

calHandle.h//输入输出处理模块

/* + * calHandle.h * *  Created on: 2014年11月28日 *      Author: laolang */#ifndef INCLUDE_CALHANDLE_H_#define INCLUDE_CALHANDLE_H_#include
/** @struct 表达式处理器 * 负责接收输入,计算并显示结果 */struct _calhandle { /** @brief 第一个数字 */ char * one; /** @brief 第二个数字 */ char * two; /** @brief 运算结果 */ char * result; /** @brief 运算符 */ char ope; /** @brief 显示结果的单选输入框 */ GtkWidget * entry; /** @brief 标志现在输入的是第几个数字 */ int num; /** @brief 标志现在僌的数字的长度 */ int len; /** @brief 标志当前数字是否已经输入了小数点 * * @warning 在此版中,此字段未起作用 */ int dot;};/** @brief 创建一个表达式处理器 * * @return 初始化的表达式处理器 */struct _calhandle* cal_handle_init(GtkWidget * entry);/** @brief 向表达式处理器中添加一个字符 * * @param handle 表达式处理器 * @param ch 要添加的数字 */void cal_handle_append(struct _calhandle * handle, char ch);/** @brief 向表达式处理器中添加一个小数点 * * @param handle 表达式处理器 * @param ch 要添加的小数点 */void cal_handle_append_dot(struct _calhandle * handle, char ch);/** @brief 向表达式处理器添加一个运算符 * * @param handle 表达式处理器 * @param ch 运算符 */void cal_handle_append_op(struct _calhandle * handle, char ch);/** @brief 根据给定的表达式处理器,计算列表式结果,并显示 * * @param handle 表达式处理器 */void cal_handle_cal(struct _calhandle* handle);#endif /* INCLUDE_CALHANDLE_H_ */

calHandle.c//输入输出实现

 

#include"../include/calHandle.h"#include"../include/cal.h"#include
#include
/** @brief 创建一个表达式处理器 * * @return 初始化的表达式处理器 */struct _calhandle* cal_handle_init(GtkWidget * entry) { struct _calhandle * handle = (struct _calhandle*) malloc( sizeof(struct _calhandle)); if ( NULL == handle) { puts("cal_handle_init...handle==null,动态分配内在失败"); exit(-1); } handle->one = (char*) malloc(sizeof(char) * 20); handle->two = (char*) malloc(sizeof(char) * 20); handle->result = (char*) malloc(sizeof(char) * 20); handle->ope = '\0'; handle->entry = entry; handle->num = -1; handle->len = 0; handle->dot = 0; return handle;}/** @brief 向表达式处理器中添加一个字符 * * @param handle 表达式处理器 * @param ch 要添加的数字 */void cal_handle_append(struct _calhandle * handle, char ch) { if (-1 == handle->num) { handle->one[handle->len] = ch; handle->len++; handle->one[handle->len] = '\0'; gtk_entry_set_text((GtkEntry*) handle->entry, (gchar*) handle->one); } if (1 == handle->num) { handle->two[handle->len] = ch; handle->len++; handle->two[handle->len] = '\0'; gtk_entry_set_text((GtkEntry*) handle->entry, (gchar*) handle->two); } return;}/** @brief 向表达式处理器中添加一个小数点 * * @param handle 表达式处理器 * @param ch 要添加的小数点 */void cal_handle_append_dot(struct _calhandle * handle, char ch) { if (-1 == handle->num) { cal_handle_append(handle, ch); } else if (1 == handle->num) { cal_handle_append(handle, ch); }}/** @brief 向表达式处理器添加一个运算符 * * @param handle 表达式处理器 * @param ch 运算符 */void cal_handle_append_op(struct _calhandle * handle, char ch) { handle->num = 1; handle->len = 0; handle->ope = ch; char chstr[2]; chstr[0] = ch; chstr[1] = '\0'; gtk_entry_set_text((GtkEntry*) handle->entry, chstr);}/** @brief 根据给定的表达式处理器,计算列表式结果,并显示 * * @param handle 表达式处理器 */void cal_handle_cal(struct _calhandle* handle) { char o = handle->ope; switch (o) { case '+': { handle->result = cal_sum(handle->one, handle->two); gtk_entry_set_text((GtkEntry*) handle->entry, handle->result); break; } case '-': { handle->result = cal_minus(handle->one, handle->two); gtk_entry_set_text((GtkEntry*) handle->entry, handle->result); break; } case '*': { handle->result = cal_ride(handle->one, handle->two); gtk_entry_set_text((GtkEntry*) handle->entry, handle->result); break; } case '/': { handle->result = cal_divide(handle->one, handle->two); gtk_entry_set_text((GtkEntry*) handle->entry, handle->result); break; } } gtk_entry_set_text((GtkEntry*) handle->entry, (gchar*) handle->result); handle->num = -1; handle->len = 0; handle->dot = 0;}

Makefile

# 功能:测试gtk+ Makefile## 作者:小代码# # 时间:2014年 11月 23日 星期日 21:23:20 CSTPROGRAM=test# 指定编译器CC=gcc# 指定编译选项CFLAGS=-Wall -I include# 指定连接时的库LDADD=`pkg-config --libs gtk+-2.0`GTK_CFLAGS=`pkg-config --cflags gtk+-2.0`# 指定删除命令及选项RM=rm -rf# 指定源文件目录vpath %.c src# 指定头文件目录vpath %.h include# 源文件列表SOURS:=$(shell cd src; ls *.c)# .o 文件列表OBJS:=$(patsubst %.c, %.o, $(SOURS))testcflags:=$(CFLAGS)testcflags+=$(GTK_CFLAGS)# 默认目标,创建可执行程序all:${PROGRAM}${PROGRAM}:$(OBJS)	${CC} -o ${PROGRAM} $^ ${LDADD}calMain.o:calMain.c calHandle.hcalMain.o:CFLAGS+=$(GTK_CFLAGS)calHandle.o:calHandle.h cal.hcalHandle.o:CFLAGS+=$(GTK_CFLAGS)cal.o:cal.h.PHNOY:clean run# 清除工作clean:	-${RM} ${PROGRAM} $(OBJS)# 运行程序run:	./${PROGRAM}

运算效果:

已解决问题:

1. 源文件布局,已可以把头文件和源文件放在不同的目录中

2. 编译选项,已可以针对不同的源代码使用不同的编译选项

未解决问题:

1.输入框禁止输入,函数倒是找到了,gtk_etnry_set_editable,不过文档好像说是不推荐,暂时没有找到更好的

达成目标:

1.已加入除法

2. 有了简单布局

未达成目标:

1. 无大数算法,计算结果不够精确

待解决问题:

1.小数点可以输入多次,这明示不合理,应该有的效果是:在一个数字的输入中,小数点只能输入一次,暂时没有想到比较好的办法

2.布局还是不行

下一步目标:

1.加入菜单

2.应有不同的模式

转载于:https://my.oschina.net/iamhere/blog/350145

你可能感兴趣的文章
.NET源代码的内部排序实现
查看>>
解决Strict Standards: Only variables should be passed by reference
查看>>
解决JBoss只能通过localhost(127.0.0.1)而不能通过IP访问
查看>>
MS SQL处理双引号(DoubleQuote)函数
查看>>
[智能架构系列]什么是Buddy智能开发框架
查看>>
三十一、关于android camera setParameters出错
查看>>
【收藏】QCIF、 CIF、2CIF、DCIF、D1(4CIF)格式介绍
查看>>
hdu 3836 Equivalent Sets (tarjan缩点)
查看>>
一些iOS高效开源类库(转)
查看>>
JAVA编程心得-JAVA实现CRC-CCITT(XMODEM)算法
查看>>
C# DES加密
查看>>
浅谈Oracle分区表之范围分区
查看>>
IBM Tivoli NetView网管软件实战
查看>>
IPSec逻辑体系架构
查看>>
Exchange 2013部署系列之(六)配置邮件流和客户端访问
查看>>
List of Free Programming books
查看>>
思考Android架构(二):像Android框架,如何(How-to)吸引开发者来使用它呢?
查看>>
windows 8 应用小技巧(36-40)
查看>>
8. package 和 import
查看>>
在html中,怎么获取当前页面body的高度,body是没有设置高度的,但是里面有内容...
查看>>