⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entry.c

📁 用GTK在 Linux 下写的一个模拟小键盘
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <gtk/gtk.h>static 	GtkWidget *entry1;GtkWidget *win;const gchar *text_entry;gchar number[8];guint count=0;char *strin[16] = {"1","2","3","+","4","5","6","-","7","8","9","Back","0","●","Del","Enter"};void clear_all (void) //消除所有相关标记{	    gint i;    count=0;   // gtk_entry_set_text (GTK_ENTRY (entry),""); //消除单行输入控件标记    for (i = 0; i < 100; i++) //消除保存的数字    {        number[i] = '\0';    }    gtk_entry_set_text(GTK_ENTRY(entry1),"");} void CountChange(  ){    if (strchr(number,0x2E))    {        count--;        fprintf(stderr,"%d\n",count);        return;    }    else    {        char *p=strchr(number,0x30);        if(p == "1" )        {   // 第一位是小数点            if(count<1)            {                return;            }            count=0;            if(strchr(text_entry,'-'))            {                gtk_entry_set_text(GTK_ENTRY(entry1),"-");            }            else            {                gtk_entry_set_text(GTK_ENTRY(entry1),"");            }            memset(number,0,8);            fprintf(stderr,"%d\n",count);            return;        }             else        {            if(count<1)            {                return;            }            count = strlen(number);            fprintf(stderr,"%d\n",count);            return;        }    }    }void on_back_clicked(GtkButton *button,  gpointer data){    // const gchar *text_entry;    gchar number1[8]={0};    text_entry = gtk_entry_get_text(GTK_ENTRY(entry1));    if(*text_entry == '-')    {        if(strlen(text_entry)==1)        {            gtk_entry_set_text(GTK_ENTRY(entry1),"");        }        else        {            g_strlcpy(number1,number,strlen(number));            g_strlcpy(number,number1,strlen(number1)+1);            gtk_entry_set_text(GTK_ENTRY(entry1),number);            gtk_entry_prepend_text (GTK_ENTRY (entry1), "-");            CountChange();            }    }    else    {        g_strlcpy(number1,number,strlen(number));        g_strlcpy(number,number1,strlen(number1)+1);        gtk_entry_set_text(GTK_ENTRY(entry1),number);        CountChange();        }}void on_num_clicked (GtkButton *button, gpointer data){ //当数字键按下时执行    const gchar *num,*Floatnum;    gint i;    gchar number1[8]={0},panduan[8]={0};    num = gtk_button_get_label (GTK_BUTTON (button));  //取数    //  g_strlcat (number, num, 8);  //保存    if(number[0]!= 0)    {        // if( !(strchr(num,0x30)) )        // {   // 数不是0        if (count == 4)        {            return; //够4位则不能在输入数字*/        }        count++;        g_strlcat (number, num, 8);  //保存        gtk_entry_append_text (GTK_ENTRY (entry1), num);  //显示           //  }    }    else    {   // 第一个数是0        if(strchr(num,0x30))        {   // 第二个数是0            if(count<1)            {                gtk_entry_append_text (GTK_ENTRY (entry1),"0");  //显示                count=4;            }        }        else        {            count=strlen(number);            if(count == 4)            {                return;            }            count++;            number[0]=0x00;             g_strlcat (number, num, 8);  //保存            if(number[0]==0)            {                Floatnum = gtk_entry_get_text(GTK_ENTRY(entry1));                g_strlcpy(panduan,Floatnum,8);                if(panduan[0]=='-')                {                    g_strlcpy(number1,number,strlen(number));                    g_strlcpy(number,number1,strlen(number1)-1);                    gtk_entry_set_text(GTK_ENTRY(entry1),number);                    gtk_entry_prepend_text (GTK_ENTRY (entry1), "-");                }                }            else            {                Floatnum = gtk_entry_get_text(GTK_ENTRY(entry1));                g_strlcpy(panduan,Floatnum,8);                if(panduan[0]=='-')                {                    gtk_entry_set_text(GTK_ENTRY(entry1),number);                    gtk_entry_prepend_text (GTK_ENTRY (entry1), "-");                }                else                {                    gtk_entry_set_text(GTK_ENTRY(entry1),number);                }            }        }    }}void on_dot_clicked (GtkButton *button,  gpointer data){ //当小数点按下时    gint i = 0;    gchar panduan[8] = {0};    for(i = 0;i<8;i++)    {        if(number[i] == '.')            return;  //如果无小数点则可以    }    const gchar *text_entry;    text_entry = gtk_entry_get_text(GTK_ENTRY(entry1));    g_strlcpy(panduan,text_entry,8);    if (*number == 0) //如果小数点前没有数字则补0    {        count = 2;        g_strlcat (number, "0.", 8);        gtk_entry_set_text (GTK_ENTRY (entry1), number);        if(panduan[0] == '-')        {            gtk_entry_prepend_text (GTK_ENTRY (entry1), "-");        }         }    else    {        count = 2;        g_strlcat (number, ".", 8);        gtk_entry_set_text (GTK_ENTRY (entry1), number);        if(panduan[0] == '-')        {            gtk_entry_prepend_text (GTK_ENTRY (entry1), "-");        }         }}void on_clear_clicked (GtkButton *button, gpointer data){    clear_all ();  //全部清除}void on_symbol_clicked (GtkButton *button, gpointer data){ //当按钮 +,-按下时        const gchar *symbol;    const gchar *fuhao;    fuhao = gtk_entry_get_text(GTK_ENTRY(entry1));	//fuhao = gtk_button_get_label(button);  switch (GPOINTER_TO_INT (data))    {    case 1:  //"+"        if(*fuhao == '-')            gtk_entry_set_text (GTK_ENTRY (entry1), number);        break;    case 2:  //"-"        if(*fuhao != '-')            gtk_entry_prepend_text (GTK_ENTRY (entry1), "-");        break;    }}void on_button_clicked (GtkWidget *entry, gpointer data) //当确定键按下时执行{    const gchar *password = gtk_entry_get_text (GTK_ENTRY (entry1));    //g_print ("%s", password); //在终端显示输入的数字    gtk_entry_set_text(GTK_ENTRY(entry),password);   // g_print ("\n");} /*void on_button_clicked (GtkWidget *widget,  GtkWidget *entry ) //当确定键按下时执行{	     gtk_entry_set_text (GTK_ENTRY (entry), number);  //显示	    text_entry = gtk_entry_get_text (GTK_ENTRY (entry));    printf("Entry contents: %s\n", text_entry);    }     *//*   void on_num_clicked (GtkButton *button, gpointer data)   {   gchar *str;   str = g_strdup_printf("%s%s", gtk_entry_get_text(GTK_ENTRY(data)), gtk_button_get_label(button));   gtk_entry_set_text(GTK_ENTRY(data), str);   g_free(str);   }   */void hide_jianpan(GtkWidget *widget, gpointer data){    //GtkWidget *win = GTK_WIDGET(data);    if (GTK_IS_WIDGET(win))    {        gtk_widget_destroy(win);       // g_print("\tdialog destroy\n\n");       // gdk_color_parse("white", &color);       // gtk_widget_modify_base(widget, GTK_STATE_NORMAL, &color);    }}void jianpan(GtkWidget *entry, gpointer data){    //GtkWidget *win=GTK_WIDGET(data);    int x,y;    if(! (GTK_IS_WIDGET(win)) )    {        GtkWidget *fixed;        GtkWidget *button;        //GtkWidget *table;        GtkWidget *label;        GtkWidget *image;        GdkColor color;        gint i = 0, j = 0;        win = gtk_window_new(GTK_WINDOW_POPUP);                gtk_widget_set_size_request (GTK_WIDGET (win), 300, 350);        gtk_window_set_policy(GTK_WINDOW(win),FALSE,FALSE,FALSE);        gdk_window_get_origin(entry->window,&x,&y);// 获取entry的坐标位置        gtk_window_move(GTK_WINDOW(win),x,y+20);        fixed = gtk_fixed_new();        //table = gtk_table_new (5, 4, TRUE); //创建格状控件,三个参数分别是行数、列数、是否均匀分布        //gtk_widget_set_usize (table, 260, 320); //设置控件大小        //label = gtk_label_new("输入窗口");        //gtk_fixed_put(GTK_FIXED(fixed),label,120,5);        //gtk_container_add(GTK_CONTAINER(win),label);        //gtk_container_add (GTK_CONTAINER (win), table);         entry1 = gtk_entry_new (); //创建单行输入控件        gtk_entry_set_visibility (GTK_ENTRY (entry1), TRUE); //显示输入内容        //gtk_entry_set_max_length(GTK_ENTRY(entry), 8);       // gtk_table_attach_defaults (GTK_TABLE (table), entry1, 0, 4, 0, 1); //将控件放入table        gtk_widget_set_usize (entry1, 298, 35);	        gtk_fixed_put(GTK_FIXED(fixed),entry1,1,33);        image = gtk_image_new_from_file("112.png");        //gtk_table_attach_defaults(GTK_TABLE(table),image,0,4,0,1);        gtk_fixed_put(GTK_FIXED(fixed),image,1,1);        gdk_color_parse("blue", &color);        gtk_widget_modify_bg(label,GTK_STATE_NORMAL, &color);        clear_all();        for(i=0; i<4; i++)        {            for(j=1; j<=4; j++)            {                button=gtk_button_new_with_label(strin[(j-1)*4+i]);		                gtk_widget_set_usize (button, 65, 65);	                gtk_fixed_put(GTK_FIXED(fixed),button,8+i*73,75+(j-1)*70);                if(j==1 && i==3)                    g_signal_connect (G_OBJECT (button), "clicked",                        G_CALLBACK (on_symbol_clicked), (gpointer)1);                if(j==2 && i==3)                    g_signal_connect (G_OBJECT (button), "clicked",                        G_CALLBACK (on_symbol_clicked), (gpointer)2);                if(j==3 && i==3)                    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_back_clicked),entry1);                if(j==4 && i==1)                    g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (on_dot_clicked),entry1);                if(j==4 && i==2)                    g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (on_clear_clicked), entry1);                if(j==4 &&i==3)                {                    g_signal_connect_swapped (G_OBJECT (button), "clicked",                        G_CALLBACK (on_button_clicked), entry);                     gtk_signal_connect_object(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT(win) );                }                if ( ( j<4 && i<3)  || ( j==4 && i==0) )                    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (on_num_clicked),entry1);               // gtk_table_attach(GTK_TABLE(table),button,i,i+1,j,j+1,GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 1, 1);                    }        }        gtk_container_add (GTK_CONTAINER (win), fixed);         gtk_widget_show_all (win);    }}int main( int argc, char *argv[] ){    GtkWidget *window;    GtkWidget *vbox, *hbox;    GtkWidget *entry;    GtkWidget *button;    GtkWidget *check;    gint t;    gtk_init (&argc, &argv);    /* 创建一个新窗口 */    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    gtk_widget_set_size_request (GTK_WIDGET (window), 400, 500);    gtk_window_set_title (GTK_WINDOW (window), "数字键盘输入框");    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);    gtk_window_set_policy(GTK_WINDOW(window),FALSE,FALSE,FALSE);    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);    g_signal_connect_swapped (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_widget_destroy), window);    vbox = gtk_vbox_new (FALSE, 0);    gtk_container_add (GTK_CONTAINER (window), vbox);    gtk_widget_show (vbox);	    for(t=0;t<5;t++)    {        entry = gtk_entry_new ();        gtk_entry_set_max_length (GTK_ENTRY (entry), 8);        gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);	/* */        g_signal_connect(entry,"button_press_event",G_CALLBACK(hide_jianpan),entry1);	        g_signal_connect(entry, "button_press_event", G_CALLBACK (jianpan), entry1);    }        hbox = gtk_hbox_new (FALSE, 0);    gtk_container_add (GTK_CONTAINER (vbox), hbox);    button = gtk_button_new_with_label("button focus");    gtk_box_pack_start(GTK_BOX(vbox), button, 1, 1, 5);    gtk_widget_show(button);    button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);    g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_main_quit), NULL);    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);    gtk_widget_grab_default (button);    gtk_widget_show_all (window);    gtk_main();    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -