laolang@laolang:~/code/gtk/eclipse/fanli/my_jisuan_one$ tree . ├── calculate.c ├── calculate.h ├── calculate.o ├── Debug │ ├── makefile │ ├── objects.mk │ ├── sources.mk │ └── subdir.mk ├── jisuan.c ├── jisuan.o ├── Makefile └── test 1 directory, 11 files laolang@laolang:~/code/gtk/eclipse/fanli/my_jisuan_one$
#include <gtk/gtk.h> #include<stdlib.h> #include<string.h> #include"calculate.h" /** @struct 传入按钮函数的gpointer的参数 * 将三个输入框和下拉列表框传入 */ struct _input { GtkWidget * entry_one; GtkWidget * entry_two; GtkWidget * combo; GtkWidget * entry_sum; }; /** @typedef 传入结构体类型 */ typedef struct _input input; /** @typedef 传入指针类型 */ typedef struct _input * inputPtr; /** @brief 按钮单击事件 * * @param button * @param in */ void on_button_clicked(GtkWidget * button, gpointer in) { GtkWidget * one = ((inputPtr) in)->entry_one; GtkWidget * two = ((inputPtr) in)->entry_two; GtkWidget * combo = ((inputPtr) in)->combo; GtkWidget * sum = ((inputPtr) in)->entry_sum; char * a = (char*) gtk_entry_get_text((GtkEntry*) one); char * b = (char*) gtk_entry_get_text((GtkEntry*) two); char * c = (char*) malloc(sizeof(char) * 20); //提取运算符 const gchar * op = gtk_entry_get_text( GTK_ENTRY(GTK_COMBO(combo)->entry)); char o = op[0]; //根据运算符,进行相应的计算 switch (o) { case '+': { sprintf(c, "%d", add(a, b)); break; } case '-': { sprintf(c, "%d", minus(a, b)); break; } case '*': { sprintf(c, "%d", ride(a, b)); break; } } // g_print("%s %s %s = %s\n", a, op, b, c); //设置第三个输入框的值 gtk_entry_set_text((GtkEntry*) sum, (gchar*) c); } int main(int argc, char *argv[]) { //窗口 GtkWidget *window; //容器 GtkWidget * box; //三个输入框,前两个输入,第三个显示计算结果 GtkWidget * entry_one; GtkWidget * entry_two; GtkWidget * entry_three; //运算符下拉列表框 GtkWidget * combo; //四个运算符 GList * items = NULL; items = g_list_append(items, "+"); items = g_list_append(items, "-"); items = g_list_append(items, "*"); items = g_list_append(items, "/"); //=号,此处点击实现计算 GtkWidget * button; gtk_init(&argc, &argv); //创建主窗口 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "简单计算器"); gtk_window_set_default_size(GTK_WINDOW(window), 600, 30); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); //主窗口退出 g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); //容器 box = gtk_hbox_new( FALSE, 5); gtk_container_add(GTK_CONTAINER(window), box); //第一个输入框 entry_one = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(box), entry_one, FALSE, FALSE, 5); combo = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo), items); gtk_container_add(GTK_CONTAINER(box), combo); //第二个输入框 entry_two = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(box), entry_two, FALSE, FALSE, 5); //= 按钮 button = gtk_button_new_with_label("="); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 5); //第三个输入框,显示计算结果 entry_three = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(box), entry_three, FALSE, FALSE, 5); //构造结构体 inputPtr in = (inputPtr) malloc(sizeof(input)); in->entry_one = entry_one; in->entry_two = entry_two; in->combo = combo; in->entry_sum = entry_three; //按钮单击 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_clicked), (gpointer )in); //显示所有控件 gtk_widget_show_all(window); //事件循环 gtk_main(); return 0; }
/** @file calculate.h 计算模块 * */ #ifndef CALCULATE_H_ #define CALCULATE_H_ /** @brief 加 * * @param a * @param b * @return a + b 的值 */ int add( char * a, char * b ); /** @brief 减 * * @param a * @param b * @return a - b 的值 */ int minus( char * a, char * b ); /** @brief 减 * * @param a * @param b * @return a * b 的值 */ int ride( char * a, char * b ); #endif /* CALCULATE_H_ */
#include"calculate.h" #include<stdlib.h> #include<stdio.h> /** @brief 加 * * @param a * @param b * @return a + b 的值 */ int add(char * a, char * b) { int na = atoi(a); int nb = atoi(b); return na + nb; } /** @brief 减 * * @param a * @param b * @return a - b 的值 */ int minus(char * a, char * b) { int na = atoi(a); int nb = atoi(b); return na - nb; } /** @brief 减 * * @param a * @param b * @return a * b 的值 */ int ride(char * a, char * b) { int na = atoi(a); int nb = atoi(b); return na * nb; }
# 功能:测试gtk+ Makefile # # 作者:小代码 # # 时间:2014年 11月 23日 星期日 21:23:20 CST PROGRAM=test # 指定编译器 CC=gcc # 指定编译选项 CFLAGS=-c -Wall `pkg-config --cflags gtk+-2.0` # 指定连接时的库 LDADD=`pkg-config --libs gtk+-2.0` # 指定删除命令及选项 RM=rm -rf # 源文件列表 SOUR := $(shell ls *.c ) # .o 文件列表 OBJS := $(patsubst %.c,%.o,$(SOUR)) # 默认目标,创建可执行程序 all:${PROGRAM} ${PROGRAM}:$(OBJS) ${CC} -o ${PROGRAM} $^ ${LDADD} jisuan.o:jisuan.c calculate.h calculate.o:calculate.h .PHNOY:clean run testlist # 清除工作 clean: -${RM} ${PROGRAM} $(OBJS) # 运行程序 run: ./${PROGRAM} testlist: @echo $(SOUR) @echo $(OBJS)
1. 我的Makefile还不够好,我的Makefile的执行过程:
laolang@laolang:~/code/gtk/eclipse/fanli/my_jisuan_one$ make gcc -c -Wall `pkg-config --cflags gtk+-2.0` -c -o calculate.o calculate.c gcc -c -Wall `pkg-config --cflags gtk+-2.0` -c -o jisuan.o jisuan.c gcc -o test calculate.o jisuan.o `pkg-config --libs gtk+-2.0` laolang@laolang:~/code/gtk/eclipse/fanli/my_jisuan_one$问题分析:所有文件的编译选项都一个样,原因应是把 CFLAGS给规定死了,应当具有的效果是不同的源文件用不同的编译选项,具体来说就是用到什么库就在编译选项中添加,没有用到的就不添加
解决方法:可参考GNU make中文手册中的6.10的目标指定变量,以此来达到对于使用不同库的源文件使用合适的相应编译命令
还是Makefile的问题:如果把源文件和头文件放不同的目录中,就不知道怎么写了,这个还要查找资料
2.下拉框和最后一个输入框的禁止输入问题
3. 没有合法判断
1. 尝试大数算法
2.加入除法
3.使布局更合理,现在的界面太丑了