QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1766|回复: 6

gtk的回调函数的返回值由谁接收?

[复制链接]
发表于 2005-5-24 09:17:20 | 显示全部楼层 |阅读模式
在使用Gtk库编程时,希望回调函数能返回一个值以指示哪一个按键被“Clicked”,但不知道这个返回值传递给了谁?是控件还是其他相关处理程序???
等待中.....

先谢!!
发表于 2005-5-24 09:42:54 | 显示全部楼层
回调函数总是和控件联系在一起的,所以你说的这个问题不存在。
回复

使用道具 举报

发表于 2005-5-24 09:55:24 | 显示全部楼层
可以阿 关联的时候可以多对一 你可以在关联的时候把那个参数设置上自己定义的一些什么
然后函数里就可以靠这个区分了
回复

使用道具 举报

 楼主| 发表于 2005-5-24 11:43:11 | 显示全部楼层
THX,sagaeon & wsm
   我想,把问题进一步具体话或许更容易表述些。
   详细表述如下:我在某个子程序(也可能是某个控件的某个信号的回调函数)中创建了一个“Dialog”,该Dialog中有两个按钮--“取消”和“确定”,分别设定了它们(两按钮)的“Clicked”信号和相应的处理函数,处理函数非常简单,“确定”的回调函数中 使用return1;“取消”的回调函数中使用 return 0。
   我希望能在原来(创建“Dialog”)的子程序中使用两个按钮的处理函数的返回值。
应该怎么设置?怎么做?
   THX。。。
回复

使用道具 举报

发表于 2005-5-24 13:18:47 | 显示全部楼层
笨办法,用全局变量
[code:1]
//main.c
#include <gtk/gtk.h>
#include <glib.h>
#include "msgdialog.h"
#include <libintl.h>
void on_button_clicked(GtkWidget *widget,gpointer data)
{
        int ret;
        ret=my_message_dialog_ok_cancel(dgettext("","\n\n\n\nÄãºÃ\n\n\n\n"),dgettext("","ÄãºÃ"));
        printf("ret=%d\n",ret);
}
//test
main()
{
    GtkWidget *win;
    GtkWidget *button;
    gtk_set_locale();
    gtk_init(NULL,NULL);
    win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    button=gtk_button_new_with_label("test");
    gtk_container_add(GTK_CONTAINER(win),button);
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
                    GTK_SIGNAL_FUNC (on_button_clicked),
                    NULL);
    gtk_signal_connect (GTK_OBJECT (win), "destroy",
                    GTK_SIGNAL_FUNC (gtk_main_quit),
                    NULL);
    gtk_widget_show_all(win);
    gtk_main();
}
[/code:1]

[code:1]
// msgdialog.c
//
#include <gtk/gtk.h>
#include <glib.h>
#include "msgdialog.h"
#define MY_MSGDLG_BUTTON_OK 0
#define MY_MSGDLG_BUTTON_OK_AND_CANCEL 1
gint dlg_ret;
GtkWidget *dialog;
static void on_ok_button_clicked(GtkWidget *widget,gpointer data);
static void on_cancel_button_clicked(GtkWidget *widget,gpointer data);
static void on_dialog_destroy(GtkWidget *widget,gpointer data);

static gint my_message_dialog(gchar *content,gchar *title,gint button)//button = MY_MSGDLG_BUTTON_OK or MY_MSGDLG_BUTTON_OK_AND_CANCEL
{
    GtkWidget *dialog_vbox;
    GtkWidget *label;
    GtkWidget *dialog_action_area;
    GtkWidget *hbuttonbox;
    GtkWidget *ok_button;
    GtkWidget *cancel_button;

    gtk_set_locale();
    gtk_init(NULL,NULL);
    dialog = gtk_dialog_new ();
    gtk_object_set_data (GTK_OBJECT (dialog), "dialog", dialog);
    gtk_window_set_title (GTK_WINDOW (dialog), (title));
    gtk_window_set_policy (GTK_WINDOW (dialog), TRUE, TRUE, FALSE);

    dialog_vbox = GTK_DIALOG (dialog)->vbox;
    gtk_object_set_data (GTK_OBJECT (dialog), "dialog_vbox", dialog_vbox);
    gtk_widget_show (dialog_vbox);

    label = gtk_label_new ((content));
    gtk_widget_ref (label);
    gtk_object_set_data_full (GTK_OBJECT (dialog), "label", label,
            (GtkDestroyNotify) gtk_widget_unref);
    gtk_widget_show (label);
    gtk_box_pack_start (GTK_BOX (dialog_vbox), label, FALSE, FALSE, 0);

    dialog_action_area = GTK_DIALOG (dialog)->action_area;
    gtk_object_set_data (GTK_OBJECT (dialog), "dialog_action_area", dialog_action_area);
    gtk_widget_show (dialog_action_area);
    gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area), 10);

    hbuttonbox = gtk_hbutton_box_new ();
    gtk_widget_ref (hbuttonbox);
    gtk_object_set_data_full (GTK_OBJECT (dialog), "hbuttonbox", hbuttonbox,
            (GtkDestroyNotify) gtk_widget_unref);
    gtk_widget_show (hbuttonbox);
    gtk_box_pack_start (GTK_BOX (dialog_action_area), hbuttonbox, TRUE, TRUE, 0);

    ok_button = gtk_button_new_with_label (("OK"));
    gtk_widget_ref (ok_button);
    gtk_object_set_data_full (GTK_OBJECT (dialog), "ok_button", ok_button,
            (GtkDestroyNotify) gtk_widget_unref);
    gtk_widget_show (ok_button);
    gtk_container_add (GTK_CONTAINER (hbuttonbox), ok_button);
    GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
    gtk_signal_connect (GTK_OBJECT (ok_button), "clicked",
            GTK_SIGNAL_FUNC (on_ok_button_clicked),
            NULL);


     gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
             GTK_SIGNAL_FUNC (on_dialog_destroy),
             NULL);
    if(button==MY_MSGDLG_BUTTON_OK_AND_CANCEL)
    {
        cancel_button = gtk_button_new_with_label (("Cancel"));
        gtk_widget_ref (cancel_button);
        gtk_object_set_data_full (GTK_OBJECT (dialog), "cancel_button", cancel_button,
                (GtkDestroyNotify) gtk_widget_unref);
        gtk_widget_show (cancel_button);
        gtk_container_add (GTK_CONTAINER (hbuttonbox), cancel_button);
        GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
        gtk_signal_connect (GTK_OBJECT (cancel_button), "clicked",
                GTK_SIGNAL_FUNC (on_cancel_button_clicked),
                NULL);
    }
   gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER);
   gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
   gtk_widget_show_all(dialog);
   gtk_main();
   if(dlg_ret!=0 && dlg_ret!=1)
       dlg_ret=1;
   return dlg_ret;

}
static void on_ok_button_clicked(GtkWidget *widget,gpointer data)
{
    dlg_ret=MY_MSGDLG_OK;
    gtk_widget_destroy(dialog);
}
static void on_cancel_button_clicked(GtkWidget *widget,gpointer data)
{
    dlg_ret=MY_MSGDLG_CANCEL;
    gtk_widget_destroy(dialog);
}
static void on_dialog_destroy(GtkWidget *widget,gpointer data)
{
    gtk_main_quit();
}
gint my_message_dialog_ok(gchar *content,gchar *title)
{
        return my_message_dialog(content,title,MY_MSGDLG_BUTTON_OK);
}

gint my_message_dialog_ok_cancel(gchar *content,gchar *title)
{
        return my_message_dialog(content,title,MY_MSGDLG_BUTTON_OK_AND_CANCEL);
}

[/code:1]

[code:1]
// msgdialog.h
#include <glib.h>
#define MY_MSGDLG_OK 0
#define MY_MSGDLG_CANCEL 1

gint my_message_dialog_ok(gchar *content,gchar *title);
gint my_message_dialog_ok_cancel(gchar *content,gchar *title);
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2005-5-24 16:07:23 | 显示全部楼层
THX mozilla(这个名字怎么这么熟悉?。。。)

  不过,能否再简化些?
回复

使用道具 举报

发表于 2005-5-24 17:39:56 | 显示全部楼层
自己简化啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 00:18 , Processed in 0.054018 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表