GTK简单版计算器

来源:互联网 发布:centos 关闭selinux 编辑:程序博客网 时间:2024/04/30 03:25

接下来我们做一个简单版的计算器。

1)获取按钮上的内容。

2)如果获取的内容是“ c ”,则代表进行退格操作,相当于删去最后一个字符。

3)如果获取的内容不是“ c ”,则把每一次获取的内容连接起来,如:

第一次按了 “ 1 ”, 第二次按了 “ + ”, 第三次按了 “ 1 ”, 连起来则变为 “1+1”。

4)如果获取的内容是“ = ”,则需要相应的运算。先把连起来的字符串拆出来,然后再进行相应操作,最后把运算结果重新显示到行编辑上。


完整代码如下:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include <gtk/gtk.h>  // 头文件  
  2. #include <string.h>  
  3.   
  4. char buf[50] = {0}; //全局变量,保存数据  
  5.   
  6. // 按钮的回调函数  
  7. void deal_num(GtkButton *button, gpointer data)  
  8. {  
  9.     const charchar *txt = gtk_button_get_label( button ); // 获取点击按钮的内容  
  10.       
  11.     // 退格操作  
  12.     if0 == strcmp("c", txt) ){ // 如果是退格键  
  13.         buf[strlen(buf) - 1] = 0// 最后一个字符变为 0  
  14.         //gtk_entry_set_text(GTK_ENTRY(data), buf); //重新给行编辑设定内容  
  15.           
  16.     }else{  
  17.         int a = 0, b = 0;  
  18.         char c;  
  19.         strcat(buf, txt);   // 内容追加  
  20.           
  21.         // 运算操作  
  22.         if(0 == strcmp("=", txt) ){ // 如果是 " = "  
  23.             sscanf(buf, "%d%c%d", &a, &c, &b);  // 拆包  
  24.             printf("a=%d, c = %c, d=%d\n", a, c, b);  
  25.             if('+' == c){  
  26.                 sprintf(buf, "%d", a+b);  
  27.             }else if('-' == c){  
  28.                 sprintf(buf, "%d", a-b);  
  29.             }else if('*' == c){  
  30.                 sprintf(buf, "%d", a*b);  
  31.             }else if('/' == c){  
  32.                 sprintf(buf, "%d", a/b);  
  33.             }  
  34.         }  
  35.     }  
  36.       
  37.     gtk_entry_set_text(GTK_ENTRY(data), buf);   // 给行编辑设定内容  
  38.       
  39.   
  40. }  
  41.   
  42.   
  43. int main( int   argc, charchar *argv[] )   
  44. {  
  45.     gtk_init (&argc, &argv);    // 初始化  
  46.       
  47.     // 窗口的操作  
  48.     GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    // 创建窗口   
  49.     gtk_widget_set_size_request(window, 270320);  
  50.       
  51.     // 表格的操作  
  52.     GtkWidget *table = gtk_table_new(54, TRUE);   // 表格布局,5行4列    
  53.       
  54.     // 行编辑的操作  
  55.     GtkWidget *entry = gtk_entry_new();     // 行编辑的创建  
  56.     //gtk_entry_set_text(GTK_ENTRY(entry), "2+2=4");    // 给行编辑设置内容  
  57.     gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);// 设置行编辑不允许编辑,只做显示用  
  58.       
  59.     // 按钮的操作  
  60.     GtkWidget *button0 = gtk_button_new_with_label("0");    // 按钮0  
  61.     GtkWidget *button1 = gtk_button_new_with_label("1");    // 按钮1  
  62.     GtkWidget *button2 = gtk_button_new_with_label("2");    // 按钮2  
  63.     GtkWidget *button3 = gtk_button_new_with_label("3");    // 按钮3  
  64.     GtkWidget *button4 = gtk_button_new_with_label("4");    // 按钮4  
  65.     GtkWidget *button5 = gtk_button_new_with_label("5");    // 按钮5  
  66.     GtkWidget *button6 = gtk_button_new_with_label("6");    // 按钮6  
  67.     GtkWidget *button7 = gtk_button_new_with_label("7");    // 按钮7  
  68.     GtkWidget *button8 = gtk_button_new_with_label("8");    // 按钮8  
  69.     GtkWidget *button9 = gtk_button_new_with_label("9");    // 按钮9  
  70.     GtkWidget *button_add = gtk_button_new_with_label("+");         // 加  
  71.     GtkWidget *button_minus = gtk_button_new_with_label("-");       // 减  
  72.     GtkWidget *button_multiply = gtk_button_new_with_label("*");    // 乘  
  73.     GtkWidget *button_divide = gtk_button_new_with_label("/");      // 除  
  74.     GtkWidget *button_equal = gtk_button_new_with_label("=");       // 等于  
  75.     GtkWidget *button_detele = gtk_button_new_with_label("c");      // 退格  
  76.       
  77.     // 布局操作  
  78.     gtk_container_add(GTK_CONTAINER(window), table); // 表格放入窗口   
  79.     gtk_table_attach_defaults(GTK_TABLE(table), entry, 0401); // 行编辑放入表格  
  80.     gtk_table_attach_defaults(GTK_TABLE(table), button00145);   // 按钮放入表格  
  81.     gtk_table_attach_defaults(GTK_TABLE(table), button10134);  
  82.     gtk_table_attach_defaults(GTK_TABLE(table), button21234);  
  83.     gtk_table_attach_defaults(GTK_TABLE(table), button32334);  
  84.     gtk_table_attach_defaults(GTK_TABLE(table), button40123);  
  85.     gtk_table_attach_defaults(GTK_TABLE(table), button51223);  
  86.     gtk_table_attach_defaults(GTK_TABLE(table), button62323);  
  87.     gtk_table_attach_defaults(GTK_TABLE(table), button70112);  
  88.     gtk_table_attach_defaults(GTK_TABLE(table), button81212);  
  89.     gtk_table_attach_defaults(GTK_TABLE(table), button92312);  
  90.     gtk_table_attach_defaults(GTK_TABLE(table), button_add, 1245);  
  91.     gtk_table_attach_defaults(GTK_TABLE(table), button_minus, 2345);  
  92.     gtk_table_attach_defaults(GTK_TABLE(table), button_multiply, 3423);  
  93.     gtk_table_attach_defaults(GTK_TABLE(table), button_divide, 3434);  
  94.     gtk_table_attach_defaults(GTK_TABLE(table), button_equal, 3445);  
  95.     gtk_table_attach_defaults(GTK_TABLE(table), button_detele, 3412);  
  96.       
  97.     // 注册信号函数,把 entry 传给回调函数 deal_num()  
  98.     g_signal_connect(button0"pressed", G_CALLBACK(deal_num), entry);  
  99.     g_signal_connect(button1"pressed", G_CALLBACK(deal_num), entry);  
  100.     g_signal_connect(button2"pressed", G_CALLBACK(deal_num), entry);  
  101.     g_signal_connect(button3"pressed", G_CALLBACK(deal_num), entry);  
  102.     g_signal_connect(button4"pressed", G_CALLBACK(deal_num), entry);  
  103.     g_signal_connect(button5"pressed", G_CALLBACK(deal_num), entry);  
  104.     g_signal_connect(button6"pressed", G_CALLBACK(deal_num), entry);  
  105.     g_signal_connect(button7"pressed", G_CALLBACK(deal_num), entry);  
  106.     g_signal_connect(button8"pressed", G_CALLBACK(deal_num), entry);  
  107.     g_signal_connect(button9"pressed", G_CALLBACK(deal_num), entry);  
  108.     g_signal_connect(button_add, "pressed", G_CALLBACK(deal_num), entry);  
  109.     g_signal_connect(button_minus, "pressed", G_CALLBACK(deal_num), entry);  
  110.     g_signal_connect(button_multiply, "pressed", G_CALLBACK(deal_num), entry);  
  111.     g_signal_connect(button_divide, "pressed", G_CALLBACK(deal_num), entry);  
  112.     g_signal_connect(button_equal, "pressed", G_CALLBACK(deal_num), entry);  
  113.     g_signal_connect(button_detele, "pressed", G_CALLBACK(deal_num), entry);  
  114.   
  115.     gtk_widget_show_all(window);  // 显示所有控件  
  116.        
  117.     gtk_main();  //进入事件循环   
  118.        
  119.     return 0;   
  120. }   


操作图如下:









源代码下载请点此处。

0 0
原创粉丝点击