gpt4 book ai didi

c - MessageBox 的 GTK 实现

转载 作者:IT老高 更新时间:2023-10-28 12:40:18 25 4
gpt4 key购买 nike

我一直在尝试使用 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 程序员,而且我意识到我可能做错了什么。

但是,我的问题是最后一个对话框弹出了这个函数,直到进程退出。有什么想法吗?

最佳答案

嗯,好的。我建议这样的代码,然后:

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 返回值> call 意味着它只运行一次。从对话框中得到结果后,我们退出主循环。这将导致您的主 MessageBox() 方法中的 gtk_main() 返回,您将能够从那里访问结果。

关于c - MessageBox 的 GTK 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com