C 结合SDL窗口和GTK+;同一程序中的windows

C 结合SDL窗口和GTK+;同一程序中的windows,c,gtk,sdl,C,Gtk,Sdl,我正在创建和SDL程序,其中一些函数打开GTK+窗口。主窗口是SDL窗口,GTK+窗口主要是对话框。main()。某些SDL事件调用打开GTK+窗口(如GTK+窗口)的函数,这些函数通常是打开的,并且与GTK+程序中的main()具有相同的结构 所有窗口都应该打开,问题在于关闭GTK+窗口。当我关闭GTK+窗口时,它将保持打开状态,直到我关闭主SDL窗口。当我关闭GTK+窗口时发生的唯一一件事是,它在关闭后不再做任何事情,因此,例如,如果我最小化它,然后再次将其最大化,它将变为空。当我关闭它时,

我正在创建和SDL程序,其中一些函数打开GTK+窗口。主窗口是SDL窗口,GTK+窗口主要是对话框。
main()。某些SDL事件调用打开GTK+窗口(如GTK+窗口)的函数,这些函数通常是打开的,并且与GTK+程序中的
main()
具有相同的结构

所有窗口都应该打开,问题在于关闭GTK+窗口。当我关闭GTK+窗口时,它将保持打开状态,直到我关闭主SDL窗口。当我关闭GTK+窗口时发生的唯一一件事是,它在关闭后不再做任何事情,因此,例如,如果我最小化它,然后再次将其最大化,它将变为空。当我关闭它时,SDL窗口也会对事件做出应有的反应,就像GTK+窗口不存在一样。因此,一切就像GTK+窗口关闭一样,只是它仍然可见。我有一个
g_信号连接(g_对象(窗口),“删除事件”,g_回调(gtk_main_quit),NULL)行,所以这不是问题所在

当我单击GTK+窗口中的关闭按钮时,如何使GTK+窗口关闭而不是SDL窗口

这是代码的结构(GTK窗口是一个关于对话框):

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#ifdef窗口
#包括
#恩迪夫
void openGtkWindow(){
GtkWidget*aboutWindow=gtk_关于对话框_新建();
//在“关于”窗口中写东西
g_信号连接(g_对象(aboutWindow),“删除事件”,g_回调(gtk_main_quit),NULL);
gtk_widget_show(关于TWindow);
gtk_main();
}
int main(int argc,char*argv[]){
gtk_init(&argc,&argv);
SDL_表面*屏幕;
SDL_事件;
SDL_Init(SDL_Init_视频);
putenv(“SDL_视频中心=中心”);
SDL_WM_SetCaption(“SDL窗口”,空);
SDL_WM_SetIcon(IMG_Load(“icon.png”),NULL;
屏幕=SDL_设置视频模式(600400,32,SDL_表面| SDL_双面);
//在SDL窗口中绘制对象
SDL_翻转(屏幕);
int continuer=1;
while(continuer){
SDL_WaitEvent(&event);
开关(事件类型){
案例SDL_退出:
continuer=0;
打破
外壳SDL_鼠标按钮打开:
if(event.button.button==SDL_按钮左){
如果(/*测试鼠标是否位于“关于”按钮内*/){
openGtkWindow();
}
}
打破
}
}
SDL_退出();
返回0;
}

我认为您需要在while循环中处理GTK事件(我假设您不调用
GTK\u main
并且您保持在自定义
while
循环中)

您可以使用类似的方法来实现这一点:

while (running)
{
    while (gtk_events_pending()) // are there GTK events to handle
        gtk_main_iteration();    //   - If so, handle them

    // Your SDL Code
}

事实上,这是通常的处理方式。但是如果OP的窗口显示出来,人们会认为他们已经给了GTK+的主循环时间来做事情。。。对吗?也许他们在做一系列的
迭代
s以显示窗口,但不处理任何后续事件,包括
删除事件
。在这种情况下,这里展示的模式就是解决方案。否则,正如您所说,需要更多的代码。很高兴看到您喜欢我在另一个线程中对GTK+的建议:)您是否通过手动运行所有必要的
GTK\u main\u迭代()来处理所有GTK+事件,如mame98所示?如果是这样,那么(A)关闭
GtkWindow
在默认情况下会导致它被完全销毁,并且(B)对
gtk_main_quit()
的回调不能做任何事情(有用),因为您没有首先将控制权交给任何
gtk_main()
正确的。您提到的症状听起来确实像GTK+本身没有得到任何/足够的信息来实际销毁或至少重新绘制
GtkWindow
——因此窗口管理器留下了一个“幽灵”。查看整个代码会很有帮助。另外,在终止GTK窗口后,您是否仍处于相同的循环中?也许你在调用
gtk\u widget\u destroy
后停止了处理事件?是的,这将避免我们不得不在黑暗中猜测@mame98我添加了代码的结构。当您使用gtk对话框时,请尝试gtk_Dialog_run。。
while (running)
{
    while (gtk_events_pending()) // are there GTK events to handle
        gtk_main_iteration();    //   - If so, handle them

    // Your SDL Code
}