GTK执行MessageBox

我实际上一直在尝试使用GTK来实现Win32的MessageBox。 该应用程序使用SDL / OpenGL,因此这不是GTK应用程序。

我在MessageBox函数中处理初始化(gtk_init)类型的事物,因为它遵循:

int MessageBox(HWND hwnd, const char* text, const char* caption, UINT type)
{
    GtkWidget *window = NULL;
    GtkWidget *dialog = NULL;

    gtk_init(&gtkArgc, &gtkArgv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
    // gcallback calls gtk_main_quit()
    gtk_init_add((GtkFunction)gcallback, NULL);

    if (type & MB_YESNO) {
        dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, text);
    } else {
        dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, text);
    }

    gtk_window_set_title(GTK_WINDOW(dialog), caption);
    gint result = gtk_dialog_run(GTK_DIALOG(dialog));

    gtk_main();

    gtk_widget_destroy(dialog);

    if (type & MB_YESNO) {
        switch (result) {
        default:
        case GTK_RESPONSE_DELETE_EVENT:
        case GTK_RESPONSE_NO:
            return IDNO;
            break;
        case GTK_RESPONSE_YES:
            return IDYES;
            break;
        }
    }

    return IDOK;
} 

目前,我并不建议经验丰富的GTK设计师,而且我也意识到我可能做的事情非常不正确。

尽管如此,我的麻烦是最后一个对话框出现了这个功能,直到程序离开为止。 有什么建议吗?

0
2019-05-03 23:09:08
资源 分享
答案: 2

几点:

您正在开发(也没有使用)一个不需要的顶层窗口,称为window。 您只需删除这些行:

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);

此外,流通似乎不太合适。 gtk_main()开始GTK主循环,阻塞直到某些东西离开它。 gtk_dialog_run()另外开始一个主循环,但它会在单击开关之前离开。

我认为你可以删除gtk_init_add()gtk_main()电话,并且只管理返回值。 此外,gtk_widget_destroy()调用是不需要的,因为当gtk_dialog_run()返回时,对话框窗口立即被损坏。

0
2019-05-09 08:32:37
资源

嗯。。好。 我肯定会推荐类似于此的代码,之后:

typedef struct {
    int type;
    int result;
} DialogData;

static gboolean
display_dialog(gpointer user_data)
{
    DialogData *dialog_data = user_data;
    GtkWidget *dialog;

    if (dialog_data->type & MB_YESNO)
        dialog = gtk_message_dialog_new(...);
    else
        dialog = gtk_message_dialog_new(...);

    // Set title, etc.

    dialog_data->result = gtk_dialog_run(...);

    gtk_main_quit();  // Quits the main loop run in MessageBox()

    return FALSE;
}

int MessageBox(...)
{
    DialogData dialog_data;

    dialog_data.type = type;

    gtk_idle_add(display_dialog, &dialog_data);

    gtk_main();

    // Do stuff based on dialog_data.result
}

该结构是由于您需要传播一对信息。 gtk_idle_add()调用包括一个在主循环运行时仍然运行的方法,并且display_dialog()调用的FALSE返回值表明它刚刚运行。 在我们从对话框中得到结果后,我们放弃了主循环。 这将在您的主要MessageBox()方法中创建gtk_main()以返回,并且您还可以从那里访问由此产生的gtk_main()

希望这个帮助!

0
2019-05-08 15:04:15
资源