私は、いくつかの関数がGTK +ウィンドウを開くSDLプログラムを作成しています。メインウィンドウはSDLウィンドウで、GTK +ウィンドウは主にダイアログボックスです。 main()
関数は通常SDLウィンドウを開き、通常SDLのようなSDLイベントを伴うwhile
ループを持ちます。 SDLイベントの中には、GTK +ウィンドウを開くような関数を呼び出すものがあります。通常、GTK +ウィンドウは開かれており、GTK +プログラムにはmain()
と同じ構造を持っています。SDLウィンドウとGTK +ウィンドウを同じプログラムで結合する
すべてのウィンドウが開いている必要がありますが、問題はGTK +ウィンドウを閉じることです。 GTK +ウィンドウを閉じると、メインのSDLウィンドウを閉じるまで開いています。 GTK +ウィンドウを閉じたときに起こる唯一のことは、閉じた後は何もしないということです。たとえば、最小化してから最大化すると空になります。終了すると、SDLウィンドウもGTK +ウィンドウが存在しない場合のようにイベントに反応します。だから、GTK +ウィンドウが閉じていて、まだ見えているのと同じようなものがあります。 GTK +ウィンドウを開く各関数にg_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(gtk_main_quit),NULL);
行があるので、問題はありません。
GTK +ウィンドウの閉じるボタンをクリックしたときに、GTK +ウィンドウが閉じてもSDLウィンドウが閉じないようにするにはどうすればよいですか?
これは、コードの構造である(GTKウィンドウがダイアログボックスについてはこちらです):
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gtk/gtk.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
#include <dirent.h>
#include <unistd.h>
#ifdef WINDOWS
#include <windows.h>
#endif
void openGtkWindow(){
GtkWidget *aboutWindow = gtk_about_dialog_new();
//Write things in the About window
g_signal_connect(G_OBJECT(aboutWindow),"delete-event",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show(aboutWindow);
gtk_main();
}
int main(int argc,char *argv[]){
gtk_init(&argc,&argv);
SDL_Surface *screen;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
putenv("SDL_VIDEO_CENTERED=center");
SDL_WM_SetCaption("SDL window",NULL);
SDL_WM_SetIcon(IMG_Load("icon.png"),NULL);
screen = SDL_SetVideoMode(600,400,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
//Draw things in the SDL window
SDL_Flip(screen);
int continuer = 1;
while(continuer){
SDL_WaitEvent(&event);
switch(event.type){
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONUP:
if(event.button.button == SDL_BUTTON_LEFT){
if(/*Test if the mouse is inside the About button*/){
openGtkWindow();
}
}
break;
}
}
SDL_Quit();
return 0;
}
( ) 'mame98のように?もしそうなら、(A) 'GtkWindow'を閉じると、デフォルトで完全に破壊されるはずです。(B)' gtk_main_quit() 'へのコールバックは、あなたが最初に手渡さなかったもの'gtk_main()'を適切に制御してください。あなたが言及した症状はGTK +が実際に 'GtkWindow'を実際に破壊するか、少なくとも再描画するのに十分ではない/十分でないように聞こえるかもしれません - ウィンドウマネージャーには"ゴースト "が残っています。 –
コード全体を確認するのに役立ちますか?また、GTKウィンドウを終了した後も同じループに留まりますか?多分あなたは 'gtk_widget_destroy'を呼び出した後にハンドリングイベントを停止するでしょうか? – mame98
ええ、それは私たちが暗闇の中で推測することを避けるでしょう! –