2012-08-01 59 views
1

我有一些麻煩,把我的彈出菜單放在我想要的GTK(沿着與我的按鈕相同的Y軸,所以它似乎從按鈕下拉)。位置彈出式菜單下面的小工具GTK

當我在win32中編寫類似的東西時,我得到了它的工作,但對於我的生活,我無法得到這個東西來繪製我想要的地方!

我做我的研究,我知道(我認爲)應該工作,這是當我撥打電話到 gtk_menu_popup()

我應該在一個函數指針傳遞一種用於放置彈出式(鏈接到方法規範 - http://developer.gnome.org/gtk/2.24/GtkMenu.html#GtkMenuPositionFunc

但我有點垃圾與函數指針(我有Kernighan和裏奇書旁邊,因爲我說),但我很確定我做對了。

繼承人我嘗試在方法:

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,所以我只是施放它(不知道這是否正確)。

問題是,我不認爲我的方法被調用,因爲它從來沒有打印出幫助:(加上它仍然產生菜單,無論我點擊(可能是因爲它沒有調用方法或任何它應該做的)。

任何幫助/想法將不勝收到:)謝謝:)

+0

正如你可以在[教程]參見(http://developer.gnome.org/gtk/ 2.24/GtkMenu.html#GtkMenuPositionFunc)'GtkMenuPositionFunc'的'push_in'參數是'gboolean *'而不是'gboolean'。它不能解決你的問題,但值得注意。 – 2012-08-01 11:21:35

+0

謝謝:)我甚至看到了!我多次看了它:P – andrewktmeikle 2012-08-01 11:39:03

回答

2

我前面有同樣的問題。我使用了下面的代碼。

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()); 
} 
+0

非常感謝你的回答,如果沒有你的幫助,我永遠都不會得到它:)這真是該死的近乎完美我只是調整了一些東西:)我把我用過的東西在下面:)必須一直在做錯誤的事情/拿我的事件處理:S嘆氣:P 非常感謝:) – andrewktmeikle 2012-08-01 12:52:29

2

好的,非常感謝Pfeiffer的示例代碼。我不得不做一些改變,因爲我得到編譯器錯誤(雖然我有Werror)。

在組poisition方法我最終轉換成一GTK_WIDGET而不是GTK_BUTTON becauses那它是什麼期待

所以我的一套新的位置的方法看起來像:

static void set_position(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { 

    GtkWidget *button = GTK_WIDGET(user_data); 

    gdk_window_get_origin(button->window, x, y); 
    *x += button->allocation.x; 
    *y += (button->allocation.y + (button->allocation.height)); 


} 

正如我不能「T弄清楚如何連接並通過兩個小部件菲佛路過我有這個目前:

static gboolean handler(GtkWidget *widget, gpointer data) { 

    gtk_menu_popup(GTK_MENU(data), NULL, NULL,(GtkMenuPositionFunc)set_position,widget,(guint)widget, gtk_get_current_event_time()); 

    return TRUE; 

} 

也不得不部件轉換爲(guint)otherwi我有一個關於第六個參數的編譯器錯誤:)

我可能會最終將更多的這種方法,但這是我需要得到它的最低工作。

即使用常規方法gtk_signal_connect,它將連接

gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(handler), GTK_OBJECT(menu)); 

那裏按鈕和菜單是我以前使用:)

完全歸功於菲佛的答案,我的GtkButton和GtkMenu實例只是顯示什麼工作對我來說:)

感謝,並希望這可以幫助別人:)

+0

不要忘了接受他的答案,點擊他的帖子左下角的檢查項目 – drahnr 2012-08-02 00:11:13

+0

好電話:)完成並完成:)謝謝:) – andrewktmeikle 2012-08-02 08:20:15