免费注册 查看新帖 |

Chinaunix

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

gtk+如何实现弹出式窗口 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-24 23:55 |只看该作者 |倒序浏览
本帖最后由 shaohao 于 2010-11-24 23:57 编辑

我想设计一个图像按钮。
当按钮点击下以后,在按钮的下方显示一个iconview(好像这样的话,这个iconview只能放置在一个新的window里面了). 选择icon以后,按钮的图像自动更新。

本来想用popupmenu,也可以,但是发现我不知道如何让弹出的菜单(或窗口)正好放置在按钮的下方。
比如弹出式菜单,好像只能显示在触发点击操作的鼠标的位置上。
如何才能正好显示在某个控件的旁边(下方)

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
2 [报告]
发表于 2010-11-28 21:35 |只看该作者
可以通过allocation获取widget在其gdk window中的位置,然后加上这个gdk window在其父window中的位置,再依次加上在父window中的位子,就可以计算出widget在屏幕上的位置,之后lz的问题就解决了吧。
只是需要注意,在gtk 2.18 版本之前可以通过 widget->allocation直接获取,但从 2.18开始一些数据结构都隐藏了,需要 gtk_widget_get_allocation获取。
闲着蛋疼,随便写了个例子:

  1. #include <gtk/gtk.h>

  2. static void button_clicked(GtkButton *button, gpointer data);

  3. int main(int argc, char *argv[])
  4. {
  5.     GtkWidget *window, *button;

  6.     gtk_init(&argc, &argv);
  7.    
  8.     g_assert(gtk_major_version==2);

  9.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  10.     gtk_window_resize(GTK_WINDOW(window), 400, 300);
  11.     button = gtk_button_new_with_label("hello");
  12.     gtk_container_set_border_width(GTK_CONTAINER(window), 100);
  13.     gtk_container_add(GTK_CONTAINER(window), button);

  14.     g_signal_connect(button, "clicked", G_CALLBACK(button_clicked), NULL);

  15.     gtk_widget_show_all(window);

  16.     gtk_main();

  17.     return 0;
  18. }

  19. static void
  20. button_clicked(GtkButton *button, gpointer data)
  21. {
  22.     GtkAllocation btn_allocation;
  23.     GdkWindow *root, *tmp;
  24.     GdkScreen *screen;
  25.     gint x, y, tx, ty;
  26.     GtkWidget *pop, *toplevel, *label;
  27.     g_print("gtk minor version is %d\n", GTK_MINOR_VERSION);
  28. #if GTK_MINOR_VERSION < 18
  29.     btn_allocation = GTK_WIDGET(button)->allocation;
  30. #else
  31.     gtk_widget_get_allocation(GTK_WIDGET(button), &btn_allocation);
  32. #endif
  33.     toplevel = gtk_widget_get_toplevel(GTK_WIDGET(button));
  34.     screen = gtk_window_get_screen(GTK_WINDOW(toplevel));
  35.     root = gdk_screen_get_root_window(screen);
  36.     tmp = gtk_widget_get_window(GTK_WIDGET(button));

  37.     x = btn_allocation.x;
  38.     y = btn_allocation.y;
  39.     while(tmp!=root)
  40.     {
  41.        gdk_window_get_position(tmp, &tx, &ty);
  42.        x += tx;
  43.        y += ty;
  44.        tmp = gdk_window_get_parent(tmp);
  45.     }

  46.     x += btn_allocation.width/2;
  47.     y += btn_allocation.height;

  48.     pop = gtk_window_new(GTK_WINDOW_POPUP);
  49.     gtk_window_resize(GTK_WINDOW(pop), 200, 200);
  50.     gtk_window_move(GTK_WINDOW(pop), x, y);

  51.     label = gtk_label_new("just bellow that widget!");
  52.     gtk_container_add(GTK_CONTAINER(pop), label);

  53.     gtk_widget_show_all(pop);
  54. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2011-05-09 15:35 |只看该作者
回复 2# nketc


    我看到你的程序里面有这行代码:

#if GTK_MINOR_VERSION < 18

这个宏GTK_MINOR_VERSION 是干什么用的?
#define GTK_MAJOR_VERSION                                (2)
#define GTK_MINOR_VERSION                                (16)
#define GTK_MICRO_VERSION                                (6)
#define GTK_BINARY_AGE                                        (1606)
#define GTK_INTERFACE_AGE                                (6)

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
4 [报告]
发表于 2011-05-09 17:52 |只看该作者

  1. #if GTK_MINOR_VERSION < 18
  2.      btn_allocation = GTK_WIDGET(button)->allocation;
  3. #else
  4.      gtk_widget_get_allocation(GTK_WIDGET(button), &btn_allocation);
  5. #endif
复制代码
gtk 2.18以下的版本没有 gtk_widget_get_allocation这个函数。而gtk 2.18以上的版本中 GtkWidget数据结构中 allocation成员隐藏了,不能通过 GTK_WIDGET(widget)->allocation的方式访问。

上面代码的意思是判断以下当前使用的gtk的版本,而采取不不同的方法获取 widget的allocation

论坛徽章:
0
5 [报告]
发表于 2011-05-10 15:17 |只看该作者
谢谢。

论坛徽章:
0
6 [报告]
发表于 2011-09-01 07:53 |只看该作者
同问~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP