gtk+如何实现弹出式窗口

发布于 2022-08-31 22:10:26 字数 321 浏览 13 评论 5

本帖最后由 shaohao 于 2010-11-24 23:57 编辑

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

烟若柳尘 2022-09-12 03:16:33

同问~

心病无药医 2022-09-09 20:46:49

谢谢。

你好,陌生人 2022-09-05 07:07:12
  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

懷念過去 2022-09-04 13:48:13

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

满地尘埃落定 2022-09-02 12:00:33

可以通过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 %dn", 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. }

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文