问题讨论:程序 C/C++ Java GUI编程 ASP Php Shell Perl Web开发 软件工程 三大件 机箱 存储设备 光存储 音频设备 视频设备 外设 购机
asp php java C CGI .net vb delphi unix|linux sql Word Excel WPS OutLook Powerpoint Dreamweaver FPage/Golive CSS/HTML DOM/JS
热门词:流程图 excel 入侵检测 vss Windows 安全漏洞 QQ空间 事件编程 MFC

 程序设计交流 > GUI编程 

GTK下如何编程实现带透明图片的按钮?

[2007-11-14 17:48:20] [来源: 百家电脑学院] [我要投稿]

2007-9-20 14:39AllenYao
GTK下如何编程实现带透明图片的按钮?

我刚学GTK编程,想把一张PNG图片变成一个按钮。

我首先生成了一个窗体,并且贴了一张背景图。然后又在窗体上面添加了一张小的PNG图片,想把它做成按钮,不知道做能才背景显示出来。虽然可以使用eventbox让图片接收事件,但是加了eventbox之后,图片的背景就变成灰色了,本来这个PNG图片背景是透明的。如下图所示,“1”是在按钮上按PNG图片,“A”是PNG图片加eventbox,都达不到背景透明的效果。

[ 本帖最后由 AllenYao 于 2007-9-20 14:49 编辑 ]

2007-10-14 00:53pilgrim_kevin
我想起码需要libpng的支持。具体不了解。

2007-10-16 00:16whyglinux
一种可行的实现方式是这样的:直接在背景上透明显示图片,划定围绕图片周围的一片矩形(或者其它形状)区域为“按钮”范围。所有的事件不是由按钮本身处理,而是交给背景所在的窗口处理。比如,模拟按钮的动作(如鼠标经过时的强调显示、按钮按下时的状态改变、输入焦点处理等)都需要通过其父窗口的事件处理自己来实现。

2007-11-8 15:02doonething
gtk 貌似不支持半透明的,都是rgb加alpha通道的,
你可以搜索 gnome支持半透明菜单 .以前遇到过,
不过好像很麻烦的,

2007-11-9 00:28moyihua
回复 #1 AllenYao 的帖子

可以这样的:
在你用“A是PNG图片加eventbox”的基础上
显示前加一句 gtk_widget_shape_combine_mask()
就可以了。

2007-11-9 04:16moyihua
回复 #1 AllenYao 的帖子

我在red hat linux 9 gtk+1.2下实现了:
用LZ提到的第二中方法:PNG图片加eventbox

但记住要刷新一次,就行了:
先把原来的数据删除,再填上去,就可以透明了。
//////刷新方法如下
GdkPixmap * gdk_pixmap1 = NULL;
GdkBitmap * mask1;
GtkWidget * pixmap1 =NULL;
GtkWidget *eventbox1;

void chang_button()
{
        GtkWidget *oldImage;
        GtkWidget *newImage;
        GdkBitmap * newMask;
//备份一下原来的       
        oldImage=GTK_WIDGET(gtk_container_children(GTK_CONTAINER(eventbox1))->data);

newImage=oldImage;
        gtk_object_ref( GTK_OBJECT(oldImage) );
//删除
        gtk_container_remove(GTK_CONTAINER(eventbox1), oldImage);
//从新加入
        gtk_container_add(GTK_CONTAINER(eventbox1), newImage);
//去边框
        gtk_widget_shape_combine_mask( eventbox1, mask1, 0, 0 );
//显示
        gtk_widget_show(newImage);

}

2007-11-11 14:25whyglinux
原帖由 moyihua 于 2007-11-9 00:28 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7569197&ptid=993752][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
可以这样的:
在你用“A是PNG图片加eventbox”的基础上
显示前加一句 gtk_widget_shape_combine_mask()
就可以了。



对,应该这样实现比较简单。

本文来自:百家学院 (http://www.9php.com),更多请参考以上网站.

·看过 GTK下如何编程实现带透明图片的按钮? 文章的还看过:

·百家学院 | 最新评论·

评论内容:不能少于5个字,请自觉遵守互联网相关政策法规。

用户名: 验证码: 验证码,看不清楚?请点击刷新验证码