在按钮小部件下调整GtkMenu时出现问题

时间:2009-11-09 06:47:02

标签: gtk

我使用以下代码添加了GtkMenu:

// Add popup menu.
gtk_menu_popup( GTK_MENU (widget), NULL, NULL, set_position, NULL,                 
                bevent->button, bevent->time);

为了在我的按钮下调整这个GtkMenu,我使用了这个功能:

void set_position (GtkMenu *menu, gint *px, gint *py, gboolean *push_in, gpointer data)
{
    gint w, h;
    GtkBuilder *builder = GetBuilderPointer();
    GtkWidget *button = GTK_WIDGET( gtk_builder_get_object( builder, "button_presence"));

    gdk_window_get_size (button->window, &w, &h);
    gdk_window_get_origin (button->window, px, py);
    *py = h;

    printf("\n\n w[%d] h[%d] px[%d] py[%d]\n\n", w, h, *px, *py );
    *push_in = TRUE;
}


但弹出窗口显示在整个窗口的末尾而不是按钮的末尾...

printf的输出:
w [350] h [400] px [341] py [607]

为什么没有正确地给出x,y和高度,按钮宽度会出现什么问题? 注意:此处使用的按钮小部件是一个自定义复合小部件,其中包含(GtkHBox +(GtkImage + GtkLabel))。

我尝试过使用普通标签按钮的相同代码,但仍会显示GtkMenu 在根窗口下不在按钮下。

为什么会发生这种情况......我继续坚持这个......

thnaks,
PP

1 个答案:

答案 0 :(得分:1)

好的,让我回答一下......如果有人面临同样的问题,他/她可以参考这个......

在GtkButton(自定义复合按钮)下调整GtkMenu ..使用以下设置位置回调函数...

static void
pos_func( GtkMenu   *menu,
          gint      *x,
          gint      *y,
          gboolean  *push,
          GtkWidget *widget )
{
    GtkRequisition req;

    gtk_widget_size_request( widget, &req );
    gdk_window_get_origin( gtk_widget_get_window( widget ), x, y );
    *x += widget->allocation.x;
    *y += widget->allocation.y + req.height;

    *push = TRUE;
}

这将在GtkButton Widget下设置GtkMenu的位置!