トップページ > 過去ログ > 記事閲覧
フルスクリーンで起動にてMessageBox()を呼び出すと
名前:匿名希望 日時: 2012/11/01 22:59

#include "DxLib.h" int test() { ClearDrawScreen(); SetDrawScreen( DX_SCREEN_BACK ); while( (ProcessMessage() == 0) && (CheckHitKey( KEY_INPUT_ESCAPE ) == 0) ){ ClearDrawScreen(); if( (CheckHitKey( KEY_INPUT_Z ) != 0) ){ if( IDYES == MessageBox(NULL, "終了しますか?", "終了確認", MB_YESNO | MB_ICONQUESTION) ){ break; } } DrawPixel( 320, 240, GetColor(255,255,255) ); ScreenFlip(); } return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ){ return -1; } else{ test(); } DxLib_End(); return 0; } test.exeの 0x4b686407でハンドルされていない例外が発生しました:0xC0000005: 場所 0x4b686407 を読み込み中にアクセス違反が発生しました。 フルスクリーンモード時にてMessageBox()関数を呼び出しますと上記のメッセージが表示され停止するという状況になりました。 ウインドウモード上では問題なく動作し、MessageBox()の各引数の変更、SetUseGDIFlag()の使用や 必要最小限にソースを削るなど行いましたが同じ結果となりました。 過去ログにありました解決策の一つとして自前で作り回避する方法もありますが、便利な関数の一つである事と、 自分のソースの書き方に問題があるのでは?という事も含め質問させていただきたいと思います。 それではよろしくお願いいたします。 環境 Windows XP VC++ 2008 Express Edition

Page: 1 |

Re: フルスクリーンで起動にてMessageBox()を呼び出すと ( No.1 )
名前:Will 日時:2012/11/02 09:22

フルスクリーンモードとは、画面をひとつのウィンドウに専有させることを前提に 描画能力を優先的に割り当てる機能ですので、メッセージボックスにかぎらず 複数のウィンドウを表示させるようなことはするべきではありません。 「フルスクリーンを使用したいのであれば、メッセージボックスは使わない」 「メッセージボックスを使いたいのであれば、フルスクリーンにしない」 のいずれかです。 # 一応 # 例外になる原因はMessageBoxの第一引数をNULLとしているためだと思います。 DXライブラリのウィンドウハンドルをセットすれば表示はかなり変になりますが一応使えた記憶が。
Re: フルスクリーンで起動にてMessageBox()を呼び出すと ( No.2 )
名前:匿名希望改め匿名(解決) 日時:2012/11/03 01:46

なるほど…MessageBoxの表示は管理外の別描画表示と考えますと 画面を独占した状態では割り込まれる為、エラー・停止となる訳ですね。 この事は考えもありませんでした。 なお、ご指摘にありましたMessageBox1番目の引数に裏関数(?) GetMainWindowHandole()にて試してみましたが結果は同じでした。 ですが原因が解り大きな収穫でした。Will様、詳しい解説ありがとうございます。

Page: 1 |