2011-12-03 6 views
0

を明らかにフレーム全体のアプリで!SDLトグルフルスクリーンは、ウィンドウ表示とバックするフルスクリーンでのSDLアプリケーションを切り替えるときに私は問題を持っているフレーム

注:「フレーム」とは、タイトルバーのアプリケーション名、最小化、復元、閉じるボタンのウィンドウウィンドウを意味します。

私がフルスクリーンモードまたはウィンドウモードで直接起動するとすべてうまく動作します。トグルが機能しないということだけです。 SDL_NOFRAMEをウィンドウモードとフルスクリーンモードの両方で使用すると、期待通りに機能しますが、これは私が望むものではありません。

編集:この関数の ドキュメントはここに読み取ることができます:フルスクリーンから行く http://www.libsdl.org/cgi/docwiki.cgi/SDL_SetVideoMode

- >ウィンドウ表示 - >フルスクリーン、エラーが上記のようです。 Windowed-> Fullscreenから 結果が少し異なり、フレームの代わりに黒いバーが表示されます...

答えて

1

使用しているSDLのバージョンはどれですか?私はそれがSDL-1.2.14だったと仮定し、そのバージョンで、次の試してみました:

#include "SDL.h" 

int main(int argc, char *argv[]) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 

    SDL_Surface *screen; 
#if 1 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); 
    SDL_Delay(2000); 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_FULLSCREEN); 
    SDL_Delay(5000); 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); 
    SDL_Delay(5000); 
#else 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_FULLSCREEN); 
    SDL_Delay(2000); 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL); 
    SDL_Delay(5000); 
    screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL | SDL_FULLSCREEN); 
    SDL_Delay(5000); 
#endif 

    SDL_Quit(); 
    return 0; 
} 

コードが戻ってフルスクリーンとするwindowdから行くか、反対の方法は、周りのプリプロセッサフ​​ラグが設定に応じて。

全画面モードでウィンドウフレームを取得しないで、SDL_FULLSCREENを省略した場合はウィンドウフレームを取得しません。変数に戻り値SDL_SetVideoModeを代入すると、変数が変更される可能性があります。フルスクリーンのウィンドウに切り替えると、ウィンドウモードになっている間に表示される画面の内容が表示されることがあります。全画面モードでは、画面の左上にあるSDL_appウィンドウが表示されました。自分のものだけが表示されていることを確認するには、画面をクリアする必要があります。

SDL_WM_ToggleFullscreen機能もあります。 Windowsでは動作しませんが、ドキュメンテーションへのリンクには、ウィンドウの切り替え/フルスクリーンの切り替え方法の例が含まれています。 SDLのドキュメントからのコード例は次のようになります。

/* Anyone may copy and alter this fragment of pseudo-code and use it however they wish */ 
#include "SDL.h" /* The only library needed to do this */ 

Uint32 flags = SDL_SWSURFACE; /* Start with whatever flags you prefer */ 
SDL_Surface *screen = SDL_SetVideoMode(640, 480, 32, flags); /* Start with whatever settings you prefer */ 

/* -- Portable Fullscreen Toggling -- 
As of SDL 1.2.10, if width and height are both 0, SDL_SetVideoMode will use the 
width and height of the current video mode (or the desktop mode, if no mode has been set). 
Use 0 for Height, Width, and Color Depth to keep the current values. */ 

flags = screen->flags; /* Save the current flags in case toggling fails */ 
screen = SDL_SetVideoMode(0, 0, 0, screen->flags^SDL_FULLSCREEN); /*Toggles FullScreen Mode */ 
if(screen == NULL) screen = SDL_SetVideoMode(0, 0, 0, flags); /* If toggle FullScreen failed, then switch back */ 
if(screen == NULL) exit(1); /* If you can't switch back for some reason, then epic fail */ 

例をウィンドウモードを切り替えながらSDL_OPENGLフラグが使用されているときに何が起こるかは言及しません。 OpenGLのコンテキストが破壊され再作成される恐れがあるので、ウィンドウモードを切り替えるときにOpenGLを再初期化してすべてのテクスチャとジオメトリを再ロードする必要があります。

編集:

GLuint list = glGenLists(1); 
glNewList(list, GL_COMPILE); 
glBegin(GL_LINES); 
glVertex2f(0.0f, 0.0f); 
glVertex2f(1.0f, 1.0f); 
glEnd(); 
glEndList(); 

表示リストを作成し、

でそれを呼び出す:

私はOpenGLのコンテキストが表示モードを切り替える後に破棄されることを、確認することができました

glClear(GL_COLOR_BUFFER_BIT); 
glCallList(list); 

は働いた。SDL_SetVideoModeの後に同じリストを呼び出すと、何も描画されませんでした。

+0

こんにちはトレンキー、返信いただきありがとうございます。私は実際にSDL 1.2.14を使用しています。サイズ変更後にOpenGLコンテキストを再初期化し、すべてのテクスチャ/ジオメトリを再ロードしています。私はglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)もクリアしています。すべてのフレーム、右だけで私のものだけ表示する必要があります! – aCuria

+0

これは少し不思議ですが、最初の3つのパラメータがnullであるようにsetvideomodeへの呼び出しを変更すると、動作するようです! – aCuria

関連する問題