- 论坛徽章:
- 5
|
可以通过allocation获取widget在其gdk window中的位置,然后加上这个gdk window在其父window中的位置,再依次加上在父window中的位子,就可以计算出widget在屏幕上的位置,之后lz的问题就解决了吧。
只是需要注意,在gtk 2.18 版本之前可以通过 widget->allocation直接获取,但从 2.18开始一些数据结构都隐藏了,需要 gtk_widget_get_allocation获取。
闲着蛋疼,随便写了个例子:
- #include <gtk/gtk.h>
- static void button_clicked(GtkButton *button, gpointer data);
- int main(int argc, char *argv[])
- {
- GtkWidget *window, *button;
- gtk_init(&argc, &argv);
-
- g_assert(gtk_major_version==2);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_resize(GTK_WINDOW(window), 400, 300);
- button = gtk_button_new_with_label("hello");
- gtk_container_set_border_width(GTK_CONTAINER(window), 100);
- gtk_container_add(GTK_CONTAINER(window), button);
- g_signal_connect(button, "clicked", G_CALLBACK(button_clicked), NULL);
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
- }
- static void
- button_clicked(GtkButton *button, gpointer data)
- {
- GtkAllocation btn_allocation;
- GdkWindow *root, *tmp;
- GdkScreen *screen;
- gint x, y, tx, ty;
- GtkWidget *pop, *toplevel, *label;
- g_print("gtk minor version is %d\n", GTK_MINOR_VERSION);
- #if GTK_MINOR_VERSION < 18
- btn_allocation = GTK_WIDGET(button)->allocation;
- #else
- gtk_widget_get_allocation(GTK_WIDGET(button), &btn_allocation);
- #endif
- toplevel = gtk_widget_get_toplevel(GTK_WIDGET(button));
- screen = gtk_window_get_screen(GTK_WINDOW(toplevel));
- root = gdk_screen_get_root_window(screen);
- tmp = gtk_widget_get_window(GTK_WIDGET(button));
- x = btn_allocation.x;
- y = btn_allocation.y;
- while(tmp!=root)
- {
- gdk_window_get_position(tmp, &tx, &ty);
- x += tx;
- y += ty;
- tmp = gdk_window_get_parent(tmp);
- }
- x += btn_allocation.width/2;
- y += btn_allocation.height;
- pop = gtk_window_new(GTK_WINDOW_POPUP);
- gtk_window_resize(GTK_WINDOW(pop), 200, 200);
- gtk_window_move(GTK_WINDOW(pop), x, y);
- label = gtk_label_new("just bellow that widget!");
- gtk_container_add(GTK_CONTAINER(pop), label);
- gtk_widget_show_all(pop);
- }
复制代码 |
|