计算器---gtk---001


代码内容:


文件列表


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$






jisuan.c//入口


#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;
}



calculate.h//计算模块声明


/** @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_ */


calcalute.c//计算模块实现


#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;
}


Makefile


# 功能:测试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.使布局更合理,现在的界面太丑了

你可能感兴趣的:(gtk)