·ChinaUnix首页 ·论坛 ·博客 
Linux首页 | Linux新闻 | Linux文档 | Linux论坛 | Linux下载 | Linux博客 | Linux搜索
新手入门 | 安装启动 | 管理员指南 | 开发手册 | 桌面应用 | 程序开发 | 数据库 | 网络技术| CentOS | Fedora | MySQL | Apache | Ubuntu | Gentoo| OSCON08
  Linux时代 >> 技术文档 >> 程序开发
 
gtk透明背景和不规则按钮
来源: ChinaUnix博客  日期: 2008.03.13 18:46 (共有条评论) 我要评论
 




/*
* Copyright (C) 1998-2006  
panhuachun@hotmail.com
*
* 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;
}



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/33226/showart_495584.html
  发表评论 查看评论(共有条评论) 我要提问
 
 


最新资讯更多>> 
· Wine 1.1.6 发布
· Wikipedia“变心”,力挺Ubuntu
· Shopex收购ecshop,discuz为了..
· 提前下载:OpenOffice.org 3.0..
· 微软Office面临严重挑战?
· 媒体观察:法国收获开源带来的启示
· 微软频繁接触开源 跨越“源”界限
· 挣脱Windows束缚 拥抱Ubuntu L..
· Puppy Linux领导者转向开发UniPup
· 发行版发布:Mandriva Linux 2009
论坛热点更多>> 
· 那些常常见到又叫不出名字的花
· xp 和LINUX 上网下载东西
· 关于秋日里的一场梦。。。。。。
· LILEI和HANMEIMEI的欲望人生..
· 这几道题会做就可直接找LINU..
· Oracle再祭收购大旗,这次红..
· RHCE考试费4200!NND
· 配置DNS主从自动更新同步,无..
· 夜店最火辣的Party girls
· 倒!同事一个比一个住的远
文档更新更多>> 
· kmess1.5.1在红旗6sp1上的安装方法
· OOo3.0 RC2 发布,中文版可用。
· IT从业人员必看的10大论坛
· SSH权威指南
· DNS相关定义介绍
· OpenVPN(zt)
· Linux shell I/O重定向详解
· linux下的烧写环境配置
· tcpdump详细用法
· 转:ARM的嵌入式Linux移植体验之基..
 
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 友情链接 | 免费注册

Copyright © 2001-2008 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们

京ICP证041476号