java创建模态窗口,如何在GTK中创建多个但独立的模态对话框?

我有以下代码使用GTK小部件工具包来显示带按钮的窗口 . 单击此按钮将显示模式对话框 . 请注意,对 gtk_dialog_run 的调用将递归地启动主循环的另一个实例,即 on_click 函数将不会返回,直到对话框被解除 .

我想有两个这样的顶级窗口,每个窗口都有一个按钮,能够生成自己的模态对话框 . 显示对话框只会禁用产生它的窗口,同时最多可以有两个活动模式对话框,每个顶级窗口一个 .

在win32中,我可以通过在单独的线程中运行每个顶级窗口来完成此操作 . 但是,似乎 gtk_main 只能从一个线程运行 . 那么如何在GTK中管理多个窗口堆栈(如果可能的话,不会牺牲 gtk_dialog_run 的简单性)?

Update: 代码现在显示两个窗口并将它们添加到各自的窗口组 .

#include

struct modal_stack

{

GtkWindowGroup * group;

GtkWidget * window;

};

static void on_click(GtkWidget *widget, gpointer sptr)

{

modal_stack * s = (modal_stack *)sptr;

GtkWidget * dialog = gtk_file_chooser_dialog_new(

"Open File", 0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL,

GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);

gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(s->window));

gtk_window_group_add_window(s->group, GTK_WINDOW(dialog));

gtk_dialog_run (GTK_DIALOG (dialog));

gtk_window_group_remove_window(s->group, GTK_WINDOW(dialog));

gtk_widget_destroy(dialog);

}

void create_window(modal_stack & s)

{

s.group = gtk_window_group_new();

s.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_widget_set_usize(s.window, 200, 200);

g_signal_connect(G_OBJECT (s.window), "destroy",

G_CALLBACK(gtk_main_quit), NULL);

g_signal_connect(G_OBJECT (s.window), "delete_event",

G_CALLBACK(gtk_main_quit), NULL);

GtkWidget * button = gtk_button_new ();

gtk_button_set_label(GTK_BUTTON(button), "show dialog");

g_signal_connect(G_OBJECT (button), "clicked",

G_CALLBACK(on_click), (gpointer) &s);

gtk_widget_show(button);

gtk_container_add(GTK_CONTAINER (s.window), button);

gtk_widget_show(s.window);

gtk_window_group_add_window(s.group, GTK_WINDOW(s.window));

}

int main(int argc, char *argv[])

{

gtk_init (&argc, &argv);

modal_stack wnd1, wnd2;

create_window(wnd1);

create_window(wnd2);

gtk_main();

}

在使用wxWidgets创建窗口嵌入到GTK创建独立顶级窗口时,你可以使用`wxGTKPlugin`类来实现。下面是一个简单的示例代码: ```cpp #include <wx/wx.h> #include <wx/gtk/embed.h> class MyEmbeddedWindow : public wxFrame { public: MyEmbeddedWindow(wxWindow* parent) : wxFrame(parent, wxID_ANY, "嵌入窗口示例") { // 在这里添加子窗口的内容和布局 wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(new wxButton(this, wxID_ANY, "按钮"), 0, wxALIGN_CENTER); SetSizer(sizer); } }; class MyParentWindow : public wxFrame { public: MyParentWindow() : wxFrame(NULL, wxID_ANY, "父窗口示例") { // 在这里创建窗口和布局 GtkPlug* plug = gtk_plug_new(0); GtkWidget* plugWidget = GTK_WIDGET(plug); GtkWidget* parentWidget = GetHandle(); gtk_container_add(GTK_CONTAINER(parentWidget), plugWidget); MyEmbeddedWindow* embeddedWindow = new MyEmbeddedWindow(plugWidget); embeddedWindow->Show(); } }; class MyApp : public wxApp { public: virtual bool OnInit() { MyParentWindow* mainWindow = new MyParentWindow(); mainWindow->Show(); return true; } }; wxIMPLEMENT_APP(MyApp); ``` 在上面的示例,我们使用了`GtkPlug`类型的对象来实现嵌入。首先,我们创建了一个`GtkPlug`对象并将其添加到GTK创建的顶级窗口。然后,我们将`GtkPlug`对象的句柄传递给wxWidgets创建的子窗口,从而实现了窗口的嵌入。 通过这种方式,你可以在GTK创建独立顶级窗口嵌入使用wxWidgets创建的子窗口。请注意,这里使用了GTK的特定函数和类型,所以需要包含相应的头文件,并确保程序正确链接到GTK库。另外,这只是一个简单的示例,实际应用可能需要更多的处理和布局操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值