GTK+中文社区(gtk.awaysoft.com)

 找回密码
 马上加入

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: Tom

GTK+写的MD5计算工具

[复制链接]

该用户从未签到

发表于 2011-6-2 18:41:55 | 显示全部楼层
写得很成功。但是我的显示不了文件——字体有问题

该用户从未签到

发表于 2011-7-25 23:48:45 | 显示全部楼层
在楼主的基础上,将关闭按钮改为校验按钮,同时增加一个entry用于输入进行文件匹配比对的MD5值,同时将计算的结果直接反馈到entry。
效果如图:

代码如下:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <gtk/gtk.h>
  5. #include <sys/stat.h>
  6. #include <ctype.h>
  7. GtkWidget *choose_button = NULL;
  8. static gchar enter[33];
  9. static gchar calc_r[33];
  10. static void calc_Md5 (GtkWidget *wid, GtkWidget *entry)
  11. {
  12.   GtkWidget *dialog = NULL;
  13.   gchar *filename = NULL;
  14.   const gchar *result = NULL;
  15.   gchar mess[33];
  16.   filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(choose_button));
  17.   if (filename){
  18.     GChecksum * checksum;
  19.     guchar * buffer = NULL;
  20.     FILE *fp = NULL;
  21.     if ((fp = fopen(filename, "rb"))!=NULL){
  22.         /* get file size */
  23.         struct stat filesize;
  24.         stat(filename, &filesize);
  25.         int file_no = filesize.st_size;
  26.         if (file_no != -1){
  27.             /* read buffer */
  28.             buffer = (guchar *)g_malloc(sizeof(guchar)*file_no);
  29.             fread(buffer, file_no, 1, fp);
  30.             /* checksum */
  31.             checksum = g_checksum_new(G_CHECKSUM_MD5);
  32.             g_checksum_update(checksum, (const guchar *)buffer, file_no);
  33.             result = g_checksum_get_string(checksum);
  34.             g_free(buffer);
  35.         }else{
  36.             strcpy ((gchar *)result, "文件打开失败!");
  37.         }
  38.         fclose(fp);
  39.     }else{
  40.         strcpy ((gchar *)result, "文件打开失败!");
  41.     }
  42.     strcpy(mess, result);
  43.     g_free((gchar *)result);
  44.     g_free(filename);
  45.   }else{
  46.     strcpy(mess, "请选择或者拖动一个文件!");
  47.   }
  48.   if(entry)    gtk_entry_set_text(GTK_ENTRY(entry), mess);
  49.   strcpy(calc_r,mess);
  50. }
  51. void enter_callback(GtkWidget *wid, GtkWidget *entry)
  52. {
  53.     const gchar *tenter;
  54.     tenter = gtk_entry_get_text (GTK_ENTRY(entry));
  55.     strcpy(enter,tenter);
  56.     for ( gint i =0; i < 32; i++){
  57.         if (isupper(enter[i]))
  58.             enter[i] = tolower (enter[i]);
  59.     }
  60. }
  61. static void cmp_Md5 (GtkWidget *wid, GtkWindow *win)
  62. {
  63.   GtkWidget *dialog;
  64.   gchar cmp_result[100];
  65.   if(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(choose_button)))
  66.   {
  67.     calc_Md5 (wid, NULL);
  68.     if((strcmp(calc_r, enter)) == 0)    strcpy(cmp_result, "文件匹配!");
  69.     else    {strcpy(cmp_result, "文件不匹配!\\n");
  70.         strcat(cmp_result, "计算值:");
  71.         strcat(cmp_result, calc_r);
  72.         strcat(cmp_result, "\\n输入值:");
  73.         strcat(cmp_result, enter);
  74.     }
  75.   }
  76.   else    strcpy(cmp_result, "请先选择一个文件!");
  77.   dialog = gtk_message_dialog_new(win,
  78.             GTK_DIALOG_MODAL,
  79.             GTK_MESSAGE_INFO,
  80.             GTK_BUTTONS_CLOSE,
  81.             cmp_result);
  82.   gtk_window_set_title(GTK_WINDOW(dialog), "校验结果");
  83.   gtk_dialog_run(GTK_DIALOG(dialog));
  84.   gtk_widget_destroy(dialog);
  85. }
  86. int main (int argc, char *argv[])
  87. {
  88.   GtkWidget *button = NULL;
  89.   GtkWidget *win = NULL;
  90.   GtkWidget *vbox = NULL;
  91.   GtkWidget *hbox = NULL;
  92.   GtkWidget *label = NULL;
  93.   GtkWidget *entry = NULL;
  94.   /* Initialize GTK+ */
  95.   g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
  96.   gtk_init (&argc, &argv);
  97.   g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
  98.   /* Create the main window */
  99.   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  100.   gtk_container_set_border_width (GTK_CONTAINER (win), 8);
  101.   gtk_window_set_title (GTK_WINDOW (win), "MD5 计算");
  102.   gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
  103.   gtk_widget_realize (win);
  104.   gtk_widget_set_size_request(win, 300,150);
  105.   g_signal_connect (win, "destroy", gtk_main_quit, NULL);
  106.   /* Create a vertical box with buttons */
  107.   vbox = gtk_vbox_new (TRUE, 6);
  108.   gtk_container_add (GTK_CONTAINER (win), vbox);
  109.   hbox = gtk_hbox_new (FALSE, 6);
  110.   gtk_box_pack_start(GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
  111.   label = gtk_label_new("文件:");
  112.   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  113.   choose_button = gtk_file_chooser_button_new ("选择一个文件",
  114.                                         GTK_FILE_CHOOSER_ACTION_OPEN);
  115.   gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (choose_button),
  116.                                        "$HOME");
  117.   gtk_box_pack_start (GTK_BOX (hbox), choose_button, TRUE, TRUE, 0);
  118.   entry = gtk_entry_new ();
  119.   gtk_entry_set_max_length(GTK_ENTRY (entry), 32);
  120.   gtk_entry_set_text (GTK_ENTRY (entry), "在这里输入用于校验文件的MD5值");
  121.   gtk_box_pack_start(GTK_BOX (vbox), entry, TRUE, TRUE, 0);
  122.   
  123.   hbox = gtk_hbox_new (TRUE, 6);
  124.   gtk_box_pack_start(GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
  125.   button = gtk_button_new_with_label("计算");
  126.   gtk_box_pack_start(GTK_BOX (hbox), button, TRUE, TRUE, 0);
  127.   g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (calc_Md5), G_OBJECT (entry));
  128.   button = gtk_button_new_with_label("校验");
  129.   g_signal_connect (button, "clicked", G_CALLBACK(enter_callback), entry);
  130.   g_signal_connect_after (button, "clicked", G_CALLBACK(cmp_Md5), (gpointer)win);
  131.   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  132.   /* Enter the main loop */
  133.   gtk_widget_show_all (win);
  134.   gtk_main ();
  135.   return 0;
  136. }
复制代码

编译时,可能需要加上-std=c99指令

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?马上加入

x

该用户从未签到

发表于 2011-9-3 22:47:44 | 显示全部楼层
请问一下,你那个程序用的什么主题,很漂亮啊
*滑块验证:
您需要登录后才可以回帖 登录 | 马上加入

本版积分规则

申请友链|Archiver|小黑屋|手机版|GTK+中文社区 ( 粤ICP备13080851号 )

我要啦免费统计

GMT+8, 2024-4-28 21:25 , Processed in 0.036025 second(s), 6 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表