Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309329
  • 博文数量: 20
  • 博客积分: 3011
  • 博客等级: 中校
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-12 10:01
文章分类

全部博文(20)

文章存档

2008年(20)

我的朋友

分类: LINUX

2008-03-13 18:46:37

 
/*
 * Copyright (C) 1998-2006 
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 */
#include
GtkWidget *window1;
GdkPixmap *pixmap;
static gboolean button_press_callback (GtkWidget      *event_box,
                         GdkEventButton *event,
                         gpointer        data)
{
    g_print ("Event box pressed at coordinates %f,%f\n",
            event->x, event->y);
     gtk_widget_show_all (window1);
    return TRUE;
}
static gboolean  button_release_callback (GtkWidget      *event_box,
                         GdkEventButton *event,
                         gpointer        data)
{
    g_print ("Event box released at coordinates %f,%f\n",
            event->x, event->y);
    gtk_widget_hide (window1);
    return TRUE;
}
 
GdkPixmap *load_pixmap (GtkWidget *widget,gchar *filename)
{
GdkPixbuf *pixbuf=NULL;
GdkPixmap *pixmap=NULL;
GdkBitmap *window_shape_bitmap;
pixbuf = gdk_pixbuf_new_from_file (filename,NULL);
pixmap = gdk_pixmap_new (widget->window,gdk_pixbuf_get_width(pixbuf),gdk_pixbuf_get_height(pixbuf),-1);
 
gdk_pixbuf_render_to_drawable (pixbuf,pixmap,
   widget->style->fg_gc[GTK_STATE_NORMAL],
   0,0,0,0,
   gdk_pixbuf_get_width(pixbuf),
   gdk_pixbuf_get_height(pixbuf),
   GDK_RGB_DITHER_NORMAL,0,0);
g_object_unref (pixbuf);
return pixmap;
}
 

int main( int   argc,         char *argv[] )
{
  /* GtkWidget is the storage type for widgets */
  gchar *xpm_file = "caomei.xpm";
  GtkWidget *window;
   //GtkWidget *window1;
  GtkWidget *fixed,*fixed1;
  GtkWidget *event_box, *pixmap_widget ;
  GdkPixmap *bg;
 GdkBitmap *gdk_pixmap_mask;
 GdkPixmap *gdk_pixmap;
  GtkStyle *style;
  GdkGC *gc;
  GdkColormap *colormap;
  GdkBitmap *window_shape_bitmap;
  GdkColor black;
  GdkColor white;
 
  gtk_init (&argc, &argv);   
  style = gtk_widget_get_default_style ();
 
 window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
 gtk_window_set_title (GTK_WINDOW(window),"test"); 
 gtk_widget_set_events (window,GDK_SCROLL_MASK);
 gtk_widget_set_app_paintable(window,TRUE);
 gtk_window_set_position (GTK_WINDOW(window),GTK_WIN_POS_CENTER_ALWAYS);
 gtk_widget_set_size_request (window,500,400);
  gtk_widget_realize (window);
   g_signal_connect (G_OBJECT (window), "destroy",
      G_CALLBACK (gtk_main_quit), NULL);
 //window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
 window1 = gtk_window_new (GTK_WINDOW_POPUP);
 gtk_window_set_title (GTK_WINDOW(window1),"test"); 
 gtk_widget_set_events (window1,GDK_SCROLL_MASK);
 gtk_widget_set_app_paintable(window1,TRUE);
 gtk_window_set_position (GTK_WINDOW(window1),GTK_WIN_POS_CENTER_ALWAYS);
 gtk_widget_set_size_request (window1,500,400);
  gtk_widget_realize (window1);
   g_signal_connect (G_OBJECT (window1), "destroy",
      G_CALLBACK (gtk_main_quit), NULL);

 
 fixed = gtk_fixed_new();
 gtk_container_add (GTK_CONTAINER(window),fixed);
 gtk_widget_show (fixed);
 fixed1 = gtk_fixed_new();
 gtk_container_add (GTK_CONTAINER(window1),fixed1);
 gtk_widget_show (fixed1);
 //setup the background
 bg = load_pixmap (fixed,"123.jpg");
 gdk_window_set_back_pixmap (fixed->window,bg,FALSE);
 event_box=gtk_event_box_new();
 gtk_event_box_set_visible_window(event_box,FALSE);
      gtk_fixed_put (GTK_FIXED (fixed), event_box, 100,100);
     g_signal_connect (G_OBJECT (event_box),
            "button_press_event",
            G_CALLBACK (button_press_callback),
            "./1.png");
      g_signal_connect (G_OBJECT (event_box),
          "button_release_event",
            G_CALLBACK (button_release_callback),
          "./m.png");
    pixmap_widget = gtk_image_new_from_file("m.png");
    //gtk_container_add (GTK_CONTAINER (event_box), pixmap_widget);
 
 //************为window创建window_shape_bitmap******************************
       colormap = gdk_colormap_get_system ();
      gdk_color_black (colormap, & black);
      gdk_color_white (colormap, & white);
     window_shape_bitmap = (GdkBitmap *) gdk_pixmap_new (NULL, 500, 400, 1);
      gc = gdk_gc_new (window_shape_bitmap);
    gdk_gc_set_foreground (gc, & black);
    gdk_gc_set_background (gc, & white);
    gdk_draw_rectangle (window_shape_bitmap, gc, TRUE, 0, 0,500, 400);
      gdk_gc_set_foreground (gc, & white);
      gdk_gc_set_background (gc, & black);
     // 在window_shape_bitmap中画一个填充的圆
     gdk_draw_arc (window_shape_bitmap, gc,TRUE,
                  70, 70, 200,200, 0, 360*64);
 
     // 在window_shape_bitmap中画一个填充的圆
       gdk_draw_arc (window_shape_bitmap, gc,TRUE,
                 250, 90, 150,150, 0, 360*64);
    gtk_widget_shape_combine_mask (window, window_shape_bitmap, 0, 0);
   gtk_container_add (GTK_CONTAINER (event_box), pixmap_widget); 
     //gtk_widget_shape_combine_mask (event_box, window_shape_bitmap, 0, 0);
     //  eventbox在这儿为什么不行呢?  
 //***************************************************************************
 
 //****利用已经有的图片形状为window  gdk_pixmap_mask *******************
     gdk_pixmap = gdk_pixmap_create_from_xpm (event_box->window, &gdk_pixmap_mask,
            &style->bg[GTK_STATE_NORMAL],
            xpm_file);// "./m.png");
     pixmap = gtk_image_new_from_pixmap (gdk_pixmap, gdk_pixmap_mask);
     gtk_widget_show (pixmap);

     gtk_fixed_put (GTK_FIXED (fixed1), pixmap, 100,100);
     //gtk_widget_shape_combine_mask (window, gdk_pixmap_mask, 100, 100);
    gtk_widget_shape_combine_mask (window1, gdk_pixmap_mask, 100,100);
 //***************************************************************************
  
   gtk_widget_show_all (window);
  //gtk_widget_show_all (window1);
   gtk_main();
   return TRUE;
}
 
阅读(3284) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

tarn2008-07-11 13:54:36

Could you please provide me your testing image files?.xpm, jpg, png. Thanks much. kevn.tarn@gmail.com