免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8749 | 回复: 6
打印 上一主题 下一主题

GTK下如何编程实现带透明图片的按钮? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-20 14:39 |只看该作者 |倒序浏览
我刚学GTK编程,想把一张PNG图片变成一个按钮。

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

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

GTK_PNG_BUTTON.JPG (29.43 KB, 下载次数: 136)

程序运行图

程序运行图

论坛徽章:
0
2 [报告]
发表于 2007-10-14 00:53 |只看该作者
我想起码需要libpng的支持。具体不了解。

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

论坛徽章:
0
4 [报告]
发表于 2007-11-08 15:02 |只看该作者
gtk 貌似不支持半透明的,都是rgb加alpha通道的,
你可以搜索 gnome支持半透明菜单 .以前遇到过,
不过好像很麻烦的,

论坛徽章:
0
5 [报告]
发表于 2007-11-09 00:28 |只看该作者

回复 #1 AllenYao 的帖子

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

评分

参与人数 1可用积分 +3 收起 理由
whyglinux + 3 我很赞同

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2007-11-09 04:16 |只看该作者

回复 #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);

}

论坛徽章:
0
7 [报告]
发表于 2007-11-11 14:25 |只看该作者
原帖由 moyihua 于 2007-11-9 00:28 发表
可以这样的:
在你用“A是PNG图片加eventbox”的基础上
显示前加一句 gtk_widget_shape_combine_mask()
就可以了。


对,应该这样实现比较简单。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP