我在 GTK 中将弹出菜单放置在我想要的位置时遇到一些问题(沿着与按钮相同的 y 轴,因此它似乎是从按钮下拉的)。
当我在 win32 中编写类似的东西时,我得到了它的工作,但在我的一生中,我无法让这个东西画在我想要的地方!
我已经完成了我的研究,我知道什么(我认为)应该起作用,那就是当我调用 gtk_menu_popup()
我应该将它传递到一个函数指针中,指向放置弹出窗口的方法(链接到方法规范 - http://developer.gnome.org/gtk/2.24/GtkMenu.html#GtkMenuPositionFunc)
但是我对函数指针有点垃圾(我说话时旁边有 Kernighan 和 Ritchie 的书),但我很确定我做得对。
这是我尝试的方法:
void set_position(GtkMenu *menu,gint *x,gint *y,gboolean push_in,gpointer user_data)
{
printf("Help!\n";
GtkWidget *originButton = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(menu),"button");
gdk_window_get_position(originButton->window,x,y);
//now I realise this will place it at the top of the widget but thats acceptable for now, I just want the method to be called!
}
我通过这样做从按钮处理程序调用它:
static gboolean handler (GtkWidget *widget,GdkEvent *event)
{
GdkEventButton *bevent = (GdkEventButton *) event;
gtk_menu_popup(GTK_MENU(widget),NULL,NULL,set_position,bevent->button,bevent->button,bevent->time);
}
但是当我编译它时,它说它不是 GtkMenuPositionFunc,所以我只是转换它(但不知道这是否正确)。
问题是我不认为我的方法被调用,因为它永远不会打印出帮助:(而且无论我点击什么地方它仍然会生成菜单(可能是因为它没有调用该方法或它应该做的任何事情)。
任何帮助/想法都会受到极大的欢迎:)谢谢:)
最佳答案
我之前也遇到过同样的问题。我使用了以下代码。
static void
set_position(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data)
{
GtkWidget *button = GTK_BUTTON(user_data);
gdk_window_get_origin(button->window, x, y);
*x += button->allocation.x;
*y += (button->allocation.y + (button->allocation.height));
}
static void
handler(GtkWidget *menu, GtkWidget *button)
{
GtkRequisition requisition;
gtk_widget_size_request(menu, &requisition);
if (button->allocation.width > requisition.width)
gtk_widget_set_size_request(menu, button->allocation.width, -1);
gtk_menu_popup(GTK_MENU (menu),
NULL, NULL,
(GtkMenuPositionFunc) set_position, button,
0, gtk_get_current_event_time());
}
关于c - 将弹出菜单放置在小部件 GTK 下方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11756767/