• GTK+ 实现的带背景的简易计算器:


    1: 概述

    是搜集别人的源代码, 自己修改了部分 ,主要目的是 应付学校的培训

    GTK+ 实现的带背景的简易计算器:

    /*gcc -o calc.c `pkg-config --cflags --libs gtk+-2.0`*/
    #include <gtk/gtk.h>
    #include <stdlib.h>
    // 全局输入框 
    static GtkWidget *entry;
    gint count = 0;
    
    gdouble nn = 0; // 操作数一 
    gdouble mm = 0;// 操作数 二 
    
    gint s = 0; // 1 ++> +  2>>- 3>>* 4>>/ 
    gboolean first = TRUE;
    gboolean have_dot = FALSE; //  存在点 
    gboolean have_result = FALSE;// 存在结果  
    gchar number[100];
    
    // 清除所有参数 
    void clear_all()
    {
        gint i;
        nn = 0;
        mm = 0;
        s = 0;
        count = 0;
        first = TRUE;
        have_dot = FALSE;
        have_result = FALSE;
        for (i = 0; i < sizeof(number); i++)
            number[i] = '';
        gtk_entry_set_text(GTK_ENTRY(entry), "");
    }
    void on_clear_clicked(GtkButton *button, gpointer data)
    {
        clear_all();
    }
    // 按钮数据处理函数 
    void on_num_clicked(GtkButton *button, gpointer data)
    {
        const gchar *num;
        gint i;
        if (have_result) clear_all();
        if (count == 6) return; //限制运算位数 
        count++;
        // 获取按钮数据 
        num = gtk_button_get_label(GTK_BUTTON(button));
        // 连接函数 
        i = g_strlcat(number, num, 100);
        //  first 切换参数一 二开关 
        if (first) {
            nn = g_ascii_strtod(number, NULL);// 将字符串数组转为gdouble 数据类型 
        }
        else
            mm = g_ascii_strtod(number, NULL);//将字符串数组转为gdouble 数据类型  
        gtk_entry_set_text(GTK_ENTRY(entry), number);
    }
    void on_suan_clicked(GtkButton *button, gpointer data)
    {
        gint i;
        s = GPOINTER_TO_INT(data);
        // 第二个 参数 
        first = FALSE;
        count = 0;
        have_dot = FALSE;
        gtk_entry_set_text(GTK_ENTRY(entry), "");
        // 清空缓存 
        for (i = 0; i < sizeof(number); i++)
            number[i] = '';
    }
    void on_dot_clicked(GtkButton *button, gpointer data)
    {
        gint i;
        if (have_result) clear_all();// 存在结果 
        if (have_dot == FALSE) {
            have_dot = TRUE;
            i = g_strlcat(number, ".", 100);
            gtk_entry_set_text(GTK_ENTRY(entry), number);
        }
    }
    void on_eq_clicked(GtkButton *button, gpointer data)
    {
        gdouble numb;
        gchar num[100];// 缓冲数组 
        gchar *result;
        switch(s) {
        case 1:
            numb = nn + mm;
            break;
        case 2:
            numb = nn - mm;
            break;
        case 3:
            numb = nn * mm;
            break;
        case 4:
            numb = nn / mm;
            break;
        }
        result = g_ascii_dtostr(num, 100, numb);
        have_result = TRUE;
        gtk_entry_set_text(GTK_ENTRY(entry), result);
    }
    /* 功能:  设置背景图
     * widget: 主窗口
     * w, h:   图片的大小
     * path:  图片路径
     */
    void chang_background(GtkWidget *widget, int w, int h, const gchar *path){
        gtk_widget_set_app_paintable(widget, TRUE);        //允许窗口可以绘图
        gtk_widget_realize(widget);    
        /* 更改背景图时,图片会重叠
         * 这时要手动调用下面的函数,让窗口绘图区域失效,产生窗口重绘制事件(即 expose 事件)。
         */
        gtk_widget_queue_draw(widget);
     
        GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);    // 创建图片资源对象
        // w, h是指定图片的宽度和高度
        GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);
     
        GdkPixmap *pixmap = NULL;
     
        /* 创建pixmap图像; 
         * NULL:不需要蒙版; 
         * 123: 0~255,透明到不透明
         */
        gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);
        // 通过pixmap给widget设置一张背景图,最后一个参数必须为: FASLE
        gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);
        // 释放资源
        g_object_unref(src_pixbuf);
        g_object_unref(dst_pixbuf);
        g_object_unref(pixmap);
    }
    int main(int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *vbox;
        GtkWidget *hbox, *hbox1, *hbox2, *hbox3, *hbox4;
        GtkWidget *button;
        gtk_init(&argc, &argv);
        
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        // 保证窗口正常退出 
        g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
        // 设置背景图片 
        chang_background(window, 230, 260, "bj_image.png");
        
        gtk_window_set_title(GTK_WINDOW(window), "计算器");
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);    //postion
        gtk_widget_set_usize (window, 230, 260);
        gtk_container_set_border_width(GTK_CONTAINER(window), 10);
        
        vbox = gtk_vbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(window), vbox);
        // 输入框 
        entry = gtk_entry_new();
        // 设置文本 方向 
        gtk_widget_set_direction(entry, GTK_TEXT_DIR_RTL);
        gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 5);
        
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
        button = gtk_button_new_with_label("CE");
        gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_clear_clicked), NULL);
        
        hbox1 = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
        button = gtk_button_new_with_label("3");
        gtk_box_pack_start(GTK_BOX(hbox1), button, TRUE, TRUE, 5);
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        button = gtk_button_new_with_label("2");
        gtk_box_pack_start(GTK_BOX(hbox1), button, TRUE, TRUE, 5);
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        button = gtk_button_new_with_label("1");
        gtk_box_pack_start(GTK_BOX(hbox1), button, TRUE, TRUE, 5);
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        button = gtk_button_new_with_label("+");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_suan_clicked), (gpointer)1);
        gtk_box_pack_start(GTK_BOX(hbox1), button, TRUE, TRUE, 5);
        
        hbox2 = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
        button = gtk_button_new_with_label("6");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("5");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("4");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("-");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_suan_clicked), (gpointer)2);
        gtk_box_pack_start(GTK_BOX(hbox2), button, TRUE, TRUE, 5);
        
        hbox3 = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 5);
        button = gtk_button_new_with_label("9");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox3), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("8");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox3), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("7");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox3), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("*");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_suan_clicked), (gpointer)3);
        gtk_box_pack_start(GTK_BOX(hbox3), button, TRUE, TRUE, 5);
        
        hbox4 = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox4, FALSE, FALSE, 5);
        button = gtk_button_new_with_label("0");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_num_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox4), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label(".");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_dot_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox4), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("=");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_eq_clicked), NULL);
        gtk_box_pack_start(GTK_BOX(hbox4), button, TRUE, TRUE, 5);
        button = gtk_button_new_with_label("/");
        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_suan_clicked), (gpointer)4);
        gtk_box_pack_start(GTK_BOX(hbox4), button, TRUE, TRUE, 5);
        // 显示 
        gtk_widget_show_all(window);
        // 主事件循环 
        gtk_main();
        return TRUE;
    }
  • 相关阅读:
    7
    6
    Robot Motion -- 机器人路径规划
    Delaunay Triangulation
    Voronoi Diagram -- 泰森多边形 (维诺图)
    Window query -- 区间线段包含问题
    5
    es6模块化
    js模块化编程之彻底弄懂CommonJS和AMD/CMD!
    混合开发菜鸟级别总结笔记 内容来自百度一下,你就知道
  • 原文地址:https://www.cnblogs.com/dgwblog/p/12142632.html
Copyright © 2020-2023  润新知