CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

在Linux的XWindows 中显示一个.gif图片(2)

楼主dlgy(小猪快跑)2005-11-01 16:52:54 在 Linux/Unix社区 / 程序开发区 提问

to:   yyy790601,太谢谢你啦,:)   那个帖子已经结帖了。  
  图片显示问题搞定拉,用vbox可以显示。  
  但是,图片太小只能居中显示,如何让图片拉伸从而充满整个屏幕呢??就像windows的桌面背景一样可以控制。  
   
  代码如下:  
   
  int   main(   int       argc,     char   *argv[]   )  
  {  
          GtkWidget   *window;  
          GtkWidget   *image;  
          GtkWidget   *event_box;  
   
          //gy   add  
          GtkWidget   *vbox;  
   
          GdkPixbufAnimation   *anim_pixbuf;  
   
          gtk_init   (&argc,   &argv);  
   
          anim_pixbuf   =   gdk_pixbuf_animation_new_from_file("bubu.gif",   NULL);  
          image   =   gtk_image_new_from_animation(anim_pixbuf);  
   
          //gtk_init   (&argc,   &argv);  
   
          window   =   gtk_window_new   (GTK_WINDOW_POPUP);  
          gtk_window_set_default_size(window,800,600);  
          event_box=gtk_event_box_new();  
   
          //gy   add  
          vbox   =   gtk_vbox_new   (FALSE,   0);  
   
          gtk_container_add(GTK_CONTAINER(window),vbox);  
          gtk_widget_set_events   (vbox,   GDK_BUTTON_PRESS_MASK);  
          g_signal_connect   (G_OBJECT   (vbox),   "button_press_event",  
                                                G_CALLBACK   (run),   NULL);  
          gtk_container_set_border_width   (GTK_CONTAINER   (window),   0);  
   
   
          //image   =   gtk_image_new_from_file   ("bubu.gif");  
   
          //modified  
          gtk_container_add   (GTK_CONTAINER   (vbox),   image);  
   
          gtk_widget_show_all   (window);  
   
          gtk_main   ();  
   
          return   0;  
  }  
   
  问题点数:100、回复次数:10Top

1 楼dlgy(小猪快跑)回复于 2005-11-02 09:41:40 得分 0

自己顶~Top

2 楼yyy790601(发呆的鱼)回复于 2005-11-02 12:47:51 得分 100

这两天我试了下,也没解决这个问题。不过还没使用调整对象。  
   
  而且如果把图片放大,效果肯定不好,推荐用一个800×600的图片算了,汗。。。。Top

3 楼dlgy(小猪快跑)回复于 2005-11-02 13:24:20 得分 0

哈哈,谢谢啦,我也这么想的,干脆换一个800×600的好了,不知道客户能不能同意,以后再说。  
  记得你上次提到“实际使用中,开个子进程运行这个屏幕锁定程序,另外一个进程如果检测到光驱插入正确,向这个子进程发送信号,此子进程在接收到指定信号后退出就行了。”  
  我用一个主程序可以吗,在main里面开辟一个子进程,调用一个函数(锁定显示器),我试着做了一下,可以显示出图片,但是如何得到信号后,再杀死它,然后返回主进程阿?现在的代码(main函数和显示图片函数)如下:  
   
   
   
  int   main(int   argc,   char   *argv[]){  
          int   loop_time   =   0;  
          char   license_filename[BUFFER_SIZE]   =   "";  
          char   license_text[BUFFER_SIZE]   =   "";  
          bool   unlock_flag   =   false;  
          bool   unlocked_flag   =   true;  
          //add   by   gy  
          pid_t   pid_saved;  
          int   sig   =   100;  
   
          if(   argc   !=   2   ||   argv[1][0]   !=   '/'   ){  
                    printf("Usage:             %s   (absolute   path)property_filename\n",argv[0]);  
                    printf("For   exaple:   %s   /etc/kbctld.conf\n",argv[0]);  
                    exit(1);  
          }  
   
          daemon_init(argv[0],   LOG_USER);  
   
          strcpy(PROPERTY_FILENAME,argv[1]);  
   
          if(   keyboard_locked()   ){  
                  unlocked_flag   =   false;  
                  syslog(LOG_INFO,   "keyboard   has   been   locked.......\n");  
   
                  //display_pic(argc,   argv);  
                  //create   a   fork  
  ////////////////////////////////  
                  pid_t   pid;  
                  pid   =   fork();  
                  if   (!pid)   {  
                          //printf("this   is   child   ");  
                          display_pic(argc,   argv);  
                  }  
  /////////////////////////////  
          }  
          else{  
                  syslog(LOG_INFO,   "keyboard   hasn't   been   locked.......\n");  
          }  
   
          while(   true   ){  
                  loop_time   =   get_loop_time();  
                  get_license_filename(license_filename);  
                  get_license_text(license_text);  
   
                  if(   have_text(license_filename,   license_text)   ){  
                          unlock_flag   =   true;  
                          syslog(LOG_INFO,   "Unlock_flag......\n");  
                  }  
   
                  if(   unlock_flag   &&   !unlocked_flag   ){  
                          unlock_keyboard();  
                          unlocked_flag   =   true;  
                          syslog(LOG_INFO,   "Keyboard   is   unlocked......\n");  
   
                  }  
                  else   if(   !unlock_flag   &&   unlocked_flag   ){  
                          lock_keyboard();  
                          unlocked_flag   =   false;  
                          syslog(LOG_INFO,   "Keyboard   is   locked......\n");  
   
   
          //////////////////////////////  
          pid_t   pid;  
                          pid   =   fork();  
                          if   (!pid)   {  
                                  display_pic(argc,   argv);  
                          }  
          ////////////////////////////  
   
                  }  
                  unlock_flag   =   false;  
                  sleep(loop_time);  
          }  
   
          return   0;  
  }  
   
  //display_pic()如下:  
  int   display_pic(int   argc,   char   *argv[])  
  {  
          GtkWidget   *window;  
          GtkWidget   *image;  
          GtkWidget   *vbox;  
          GdkPixbufAnimation   *anim_pixbuf;  
          char   pic_name[BUFFER_SIZE]   =   "";  
   
          gtk_init   (&argc,   &argv);  
   
          get_property(PROPERTY_FILENAME,PROPERTY_KBLOCK_PIC_NAME,   pic_name);  
          anim_pixbuf   =   gdk_pixbuf_animation_new_from_file(pic_name,   NULL);  
          image   =   gtk_image_new_from_animation(anim_pixbuf);  
   
          window   =   gtk_window_new   (GTK_WINDOW_POPUP);  
          gtk_window_set_default_size(window,800,600);  
          vbox   =   gtk_vbox_new   (FALSE,   0);  
   
          gtk_container_add(GTK_CONTAINER(window),vbox);  
          gtk_container_set_border_width   (GTK_CONTAINER   (window),   0);  
   
          gtk_container_add   (GTK_CONTAINER   (vbox),   image);  
          gtk_widget_show_all   (window);  
   
          gtk_main   ();  
          return   0;  
  }  
   
   
   
   
  我试着   kill(pid_saved,   sig)   和   signal(sig,   thr_exit());   一些信号函数和进程函数,但都无法实现这个功能,实在是做不出来了,可能是我对进程了解的太少了,但是现在学又有些来不及,经理让这周末就拿出来,能帮帮我吗?最好能给出代码,万分感谢!!!!  
  Top

4 楼yyy790601(发呆的鱼)回复于 2005-11-02 13:47:10 得分 0

在判断光驱正常运行后,父进程向子进程发送SIGCHLD信号就能杀死子进程了。  
   
  /*  
    *kill   the   child   progress  
    */  
  int   killprocess(pid_t   pid)  
  {  
  int   ret;  
  if(pid   <   getppid())  
  return   -1;  
  ret   =   kill(pid,SIGCHLD);  
   
  return   ret;  
  }Top

5 楼dlgy(小猪快跑)回复于 2005-11-02 15:07:50 得分 0

int   killprocess(pid_t   pid)  
  {  
  int   ret;  
  if(pid   <   getppid())  
  return   -1;  
  ret   =   kill(pid,SIGCHLD);  
   
  return   ret;  
  }  
   
  这个函数的参数int   killprocess(pid_t   pid),     pid应该是主进程的吗?  
  我在:  
          while(   true   ){  
                  loop_time   =   get_loop_time();  
                  get_license_filename(license_filename);  
                  get_license_text(license_text);  
   
                  if(   have_text(license_filename,   license_text)   ){  
                          unlock_flag   =   true;  
                          syslog(LOG_INFO,   "Unlock_flag......\n");  
                  }  
   
                  if(   unlock_flag   &&   !unlocked_flag   ){  
                          unlock_keyboard();  
                          unlocked_flag   =   true;  
                          syslog(LOG_INFO,   "Keyboard   is   unlocked......\n");  
                           
                        //////////////////调用killprocess/////////  
                        killprocess(getpid());  
                        ////////////////////////  
   
                  }  
   
   
  这么写不好用阿?Top

6 楼yyy790601(发呆的鱼)回复于 2005-11-02 19:26:13 得分 0

你把主进程杀了做什么,pid是子进程id,也就是显示图象的进程。Top

7 楼dlgy(小猪快跑)回复于 2005-11-02 19:27:50 得分 0

to   :   yyy790601,   谢谢你啦。搞定了!  
  把kill()的参数改成SIGKILL就可以拉。代码如下:  
   
  int   main(int   argc,   char   *argv[]){  
          int   loop_time   =   0;  
          char   license_filename[BUFFER_SIZE]   =   "";  
          char   license_text[BUFFER_SIZE]   =   "";  
          bool   unlock_flag   =   false;  
          bool   unlocked_flag   =   true;  
          //add   by   gy  
          pid_t   pid_saved;  
          pid_t   pid_main;  
          //int   sig   =   100;  
          pid_main   =   getpid();  
          if(   argc   !=   2   ||   argv[1][0]   !=   '/'   ){  
                    printf("Usage:             %s   (absolute   path)property_filename\n",argv[0]);  
                    printf("For   exaple:   %s   /etc/kbctld.conf\n",argv[0]);  
                    exit(1);  
          }  
   
          daemon_init(argv[0],   LOG_USER);  
   
          strcpy(PROPERTY_FILENAME,argv[1]);  
   
          if(   keyboard_locked()   ){  
                  unlocked_flag   =   false;  
                  syslog(LOG_INFO,   "keyboard   has   been   locked.......\n");  
                  //add   by   gy  
                  //display_pic(argc,   argv);  
                  //create   a   fork  
                  pid_t   pid;  
                  pid   =   fork();  
                  //syslog(LOG_INFO,   pid);  
                  if   (!pid)   {  
                          //printf("this   is   child   ");  
                          display_pic(argc,   argv);  
                  }  
                  //if   (pid==100)   {  
                      //     _exit();  
                  //}  
                  //syslog(LOG_INFO,   "access   thr_exit1().........\n");  
                  //signal(sig,   thr_exit());  
          }  
          else{  
                  syslog(LOG_INFO,   "keyboard   hasn't   been   locked.......\n");  
                  //exit(0);  
                  //syslog(LOG_INFO,   "000000access   thr_exit1().........\n");  
                  //signal(sig,   thr_exit());  
          }  
   
          while(   true   ){  
                  loop_time   =   get_loop_time();  
                  get_license_filename(license_filename);  
                  get_license_text(license_text);  
   
                  if(   have_text(license_filename,   license_text)   ){  
                          unlock_flag   =   true;  
                          syslog(LOG_INFO,   "Unlock_flag......\n");  
                  }  
   
                  if(   unlock_flag   &&   !unlocked_flag   ){  
                          unlock_keyboard();  
                          unlocked_flag   =   true;  
                          syslog(LOG_INFO,   "Keyboard   is   unlocked:%d:%d......\n",pid_main,   pid_saved);  
   
                          killprocess(pid_saved);  
                          //undo   the   pic  
                          //int   sig   =   100;  
                          //int   ret_val   =   kill(pid_saved,   sig);  
                          syslog(LOG_INFO,   "access   kill().........\n");  
                          //if   (kill(pid_saved,   sig)   !=   0)   {  
                              //     syslog(LOG_INFO,   "return   signal   error......\n");  
                        //   }  
                          //syslog(LOG_INFO,   "from   kill().........\n");  
                  }  
                  else   if(   !unlock_flag   &&   unlocked_flag   ){  
                          lock_keyboard();  
                          unlocked_flag   =   false;  
                          syslog(LOG_INFO,   "Keyboard   is   locked......\n");  
                          //add   by   gy  
                          //display_pic(argc,   argv);  
                          pid_t   pid;  
                          pid   =   fork();  
                          pid_saved   =   pid;  
                          //syslog(LOG_INFO,   pid);  
  //                         syslog(LOG_INFO,   "111access   thr_exit2().........\n");  
  //                         signal(sig,   thr_exit());  
   
                          if   (!pid)   {  
                                  //printf("this   is   child   ");  
                                  display_pic(argc,   argv);  
                          }  
                          //syslog(LOG_INFO,   "access   thr_exit2().........\n");  
                          //signal(sig,   thr_exit());  
                  }  
                  unlock_flag   =   false;  
                  sleep(loop_time);  
          }  
   
          return   0;  
  }  
   
   
  int   killprocess(pid_t   pid)  
  {  
          syslog(LOG_INFO,   "in   killprocess()..........................\n");  
          int   ret;  
          if(pid   <   getppid()){  
                        syslog(LOG_INFO,   "in   killprocess():%d:%d..\n",pid,getppid());  
                        return   -1;  
          }  
          ret   =   kill(pid,   SIGKILL);  
          return   ret;  
  }  
  Top

8 楼yyy790601(发呆的鱼)回复于 2005-11-02 19:42:02 得分 0

恭喜了哦。解决问题挺快的,下午不能上网,也帮不了什么。  
  代码我也保存一下,说不定什么时候也用的着。Top

9 楼dlgy(小猪快跑)回复于 2005-11-02 19:55:05 得分 0

你把主进程杀了做什么,pid是子进程id,也就是显示图象的进程。  
   
  恩,我改过来了,嘿嘿。  
  谢谢你,yyy790601。我一直在搞java   web开发,也是这周才接触linux   c编程,这次多亏你的帮助,才能完成。  
  不介意的话加我的msn吧,dlgy352@hotmail.com   很高兴能和你成为朋友。Top

10 楼yyy790601(发呆的鱼)回复于 2005-11-02 20:06:32 得分 0

以前我也是想学java的,导师叫我学linux,就搞linux了。  
  msn不用,一般用qq,6163120。Top

相关问题

  • 在Linux的XWindows 中显示一个.gif图片
  • GIF动画图片
  • 怎样显示gif图片
  • 保存gif图片问题
  • 在VB中添加.gif图片
  • 怎样显示jpg,gif图片?
  • 如何读取gif图片的大小?
  • 请问WebBrowser如何调用Gif图片?
  • 修改gif图片的问题
  • 如何在OpenPicDialog中预览Gif图片?

关键词

  • 函数
  • 信号
  • gtk
  • vbox
  • 进程
  • 图片
  • argv
  • pixbuf
  • gtkwidget
  • 显示

得分解答快速导航

  • 帖主:dlgy
  • yyy790601

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo