c - 将弹出菜单放置在小部件 GTK 下方

标签 c button gtk popupmenu

我在 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/

相关文章:

c - 网络编程常用的函数/代码片段有哪些?

c - C 中的全局数组声明?

c - 函数 'enterChar' [-Wimplicit-function-declaration] 的隐式声明

javascript - 提交按钮无法正常工作

android - 在 android Activity 中切换按钮可见性

c++ - vfork()../nptl/sysdeps/unix/sysv/linux/raise.c : No such file or directory

c# - MVVM - IsEnabled 无法与绑定(bind) bool 值一起正常工作

linux - Virtual Box 和 Windows 7 主机的 Gvim 重绘问题

c - 是否可以在 GTK 中对用户隐藏 .glade 文件?

Python + Glade + PyGObject。如何一次获取两个文本字段的值?