问几个GTK编程的问题

软件和网站开发以及相关技术探讨
回复
danielking
帖子: 79
注册时间: 2006-11-15 10:04

问几个GTK编程的问题

#1

帖子 danielking » 2008-04-09 11:34

1文档中那些GtkWidget的Style Properties怎么设置?
好像只能设置Properties, 我找不到设置Style Properties的方法

2关于statusicon的弹出菜单
我是用这样的语句弹出的
gtk_menu_popup(menu, NULL, NULL,
gtk_status_icon_position_menu, status_icon, -1, gtk_get_current_event_time());
在windows下有些奇怪(看附件)
第一是弹出的位置好像有点奇怪, 一般菜单的一个角在鼠标指针上, 是靠鼠标坐标来定位置的, 而我这个好像是按照屏幕边缘来定位置
第二是弹出后会出现上下滚动的箭头, 把鼠标放上去后才能显示出所有的item
这个使用同样的gtk runtime, pidgin的就没有这两个问题
而且同样的代码, 在linux中显示也正常

3关于glade_xml_signal_autoconnect
看说明如果回调函数放在主程序中, 就需要让主程序能导出符号, 像动态链接库一样, gcc可以用-export-dynamic, 我还没有试过在linux下怎么样, 在windows下mingw gcc4.3试过, 好像没用, vc的编译器好像没有这个功能. 不知道谁用过这个.
附件
刚刚点出来的样子
刚刚点出来的样子
Snap1.png (863 Bytes) 查看 2141 次
位置, 以屏幕边缘来定的
位置, 以屏幕边缘来定的
Snap2.png (3.59 KiB) 查看 2142 次
pidgin的, 刚刚点出来不会出现滚动箭头, 也不会以屏幕边缘来定位置
pidgin的, 刚刚点出来不会出现滚动箭头, 也不会以屏幕边缘来定位置
Snap3.png (2.8 KiB) 查看 2141 次
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2008-04-09 12:08

glade_xml_signal_autoconnect
没用。在特定情况下才可以。只是这情况搞不清。
Style Properties
就是signal。glade的设置,和版本有关,比如自动生成代码。

这说不清的。建议找一个现成的,带glade文件的例子。一看就知道了。随便下一个源码。
● 鸣学
danielking
帖子: 79
注册时间: 2006-11-15 10:04

#3

帖子 danielking » 2008-04-09 14:05

我的菜单是动态生成的, gtk_menu_new出来的, 怎么设style property?
danielking
帖子: 79
注册时间: 2006-11-15 10:04

#4

帖子 danielking » 2008-04-09 15:45

发现了, style property好像都是只读的.
danielking
帖子: 79
注册时间: 2006-11-15 10:04

#5

帖子 danielking » 2008-04-09 16:51

我在菜单里添加了好多个项目, 就是把菜单加高了, 貌似找到一点问题
如果把任务栏放到了桌面的顶端, 就正常了
如果任务栏在下面, 菜单的主窗口大小是对的, 鼠标移到滚动箭头上, 下面的item会滑上来, 滑动结束后滚动箭头消失

也就是说, 菜单主窗口位置和大小没有问题, 但是菜单里的项目的位置都是按照菜单左上角位置==鼠标指针位置来定的, 所以出现了滚动箭头.
这不知道是不是gtk_status_icon_position_menu的bug
danielking
帖子: 79
注册时间: 2006-11-15 10:04

#6

帖子 danielking » 2008-04-09 20:32

看来这个问题早就有了
http://bugzilla.gnome.org/show_bug.cgi?id=406062

一直没有解决..
louis315
帖子: 86
注册时间: 2005-10-20 9:19

#7

帖子 louis315 » 2008-04-10 10:17

关于glade_xml_signal_autoconnect,我没用glade,不过GtkBuilder也有类似的函数。

在windows里,默认不会导出函数,所以要添加 __declspec(dllexport),在exe项目中也一样添加这个符号.

如果用c++,则要加 extend "C"。

举个例子,在puss项目里:

1. 在头文件里定义了(SIGNAL_CALLBACK):

代码: 全选

#ifdef  __cplusplus
#	define __EXTERN_C extern "C"
#else
#	define __EXTERN_C
#endif

#ifdef G_OS_WIN32
#	define	PUSS_EXPORT		__EXTERN_C __declspec(dllexport)
#else
#	define	PUSS_EXPORT		__EXTERN_C
#endif


#define	SIGNAL_CALLBACK	PUSS_EXPORT
使用时:

代码: 全选


// 定义signal回调函数
// 
SIGNAL_CALLBACK void file_menu_new( GtkAction* action ) {
	puss_doc_new();
}

// 加载xml文件时:
GtkBuilder* builder = xxx;

gtk_builder_connect_signals(builder, tag);

[/code]
回复