ページ 11

メッセージボックスについて

Posted: 2010年6月13日(日) 13:13
by kai
よくDXライブラリを使った皆さまのゲームで使われてる
メッセージボックスのこのプログラムですが

void message_box(){
int flag;
flag=MessageBox(
NULL,
TEXT("フルスクリーンモードで起動しますか?"),
TEXT("スクリーン設定"),
MB_YESNO | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
}

実行すると右上に×のマークが表示されますよね?
このプログラムでは×マークを押しても何の変化もないのですが、
×マークを押したら、メッセージボックスを消す(ゲームを終了させる)
ようにしたいのですが、どうしたらいいのでしょうか?
分かる方がいましたら、どういったプログラムを追加、修正すると可能なのか教えてください・・
よろしくお願いします。

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 13:29
by シエル
下記のMessageBoxの第四引数をMB_YESNOCANCELに変更。
この状態で×ボタンを押すとキャンセルボタンが押されたことになるので、
flagがIDCANCELのときだけ終了処理を書けばいい。

flag=MessageBox( NULL, TEXT("フルスクリーンモードで起動しますか?"), TEXT("スクリーン設定"),
MB_YESNOCANCEL | MB_ICONQUESTION );
if(flag==IDNO)
ChangeWindowMode( TRUE );
else if(flag==IDCANCEL)
//ここに終了処理を書く


メッセージボックスにキャンセルボタンが出てしまいますが、消し方は分かりません。

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 13:59
by kai
>シエルさん
う~ん・・
言われた通り試してみましたが

void message_box(){
//int flag;
//flag=MessageBox(
// NULL,
// TEXT("フルスクリーンモードで起動しますか?"),
// TEXT("スクリーン設定"),
// MB_YESNO | MB_ICONQUESTION );
//if(flag==IDNO){
// ChangeWindowMode( TRUE );
//}
int flag;
flag=MessageBox(
NULL,
TEXT("フルスクリーンモードで起動しますか?"),
TEXT("スクリーン設定"),
MB_YESNOCANCEL | MB_ICONQUESTION );
if(flag==IDNO){
ChangeWindowMode( TRUE );
}
else if(flag==IDCANCEL){
DxLib_End(); //DXライブラリ終了処理
}
}

キャンセルボタンはいらないですね・・
ついでにキャンセルボタンを押した場合はフルスクリーン。
×ボタンを押しても終了するどころか
フルスクリーン画面になり、ゲームがスタートしてしまいました。

他にご存知の方、その辺のプログラムに詳しい方がいましたら教えてください。
よろしくお願いします 画像

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 14:12
by シエル
おかしいですね。
ボタンの動作は間違いないはずなんですけど。。
この関数以外の場所で、
「いいえ」ボタンを押す以外はすべてフルスクリーン起動
するようになってませんか?

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 14:24
by シエル
ゲームがスタートしてしまうのも、
else if(flag==IDCANCEL)の処理で、起動しないようにしないとスタートしてしまいますよ。

メッセージボックスのボタンも、自作のダイアログボックスを作るなりするしか
ないと思います。。

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 15:19
by kai
>この関数以外の場所で、
>「いいえ」ボタンを押す以外はすべてフルスクリーン起動
>するようになってませんか?
いえ、調べてみましたが特にそういった操作はしてませんでした。

>else if(flag==IDCANCEL)の処理で、起動しないようにしないとスタートしてしまいますよ。
と、いうと具体的にはどうしたら良いのでしょうか?
よろしければ教えてください。

>メッセージボックスのボタンも、自作のダイアログボックスを作るなりするしか
>ないと思います。。
すると、シエルさんがおっしゃる結論としてはMB_YESNOを使った場合、
×ボタンを押したときの操作方法は設定出来ないということでしょうか?
それならば諦めるしかないですね・・・残念です。
MB_YESNOCANCELでキャンセルを押したとき、または×ボタンを押したときに
終了する方法はないでしょうか?分かる方がいましたら教えてください。

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 16:13
by シエル
>いえ、調べてみましたが特にそういった操作はしてませんでした。
>と、いうと具体的にはどうしたら良いのでしょうか?
>よろしければ教えてください。

この関数を呼び出しているメインのソースコードを貼って下さい。答えようがありません。

>すると、シエルさんがおっしゃる結論としてはMB_YESNOを使った場合、
>×ボタンを押したときの操作方法は設定出来ないということでしょうか?
>それならば諦めるしかないですね・・・残念です。
>MB_YESNOCANCELでキャンセルを押したとき、または×ボタンを押したときに
>終了する方法はないでしょうか?分かる方がいましたら教えてください。

MB_YESNOを指定した場合は右上の×ボタンがグレーアウトして押せなかったはずだと思います。
ですので、MB_YESNOを指定した場合は右上の×ボタンを使った操作は行えないと私は思っています。

そこで代替案として、MB_YESNOCANCELを指定する方法や、自作ダイアログボックスを作成する
方法を提案しているわけです。
後者の方はちょっと難しいですが。。。

まあ私もまだ初心者のレベルなので他の人の意見も参考にして下さい。

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 23:33
by kai
>この関数を呼び出しているメインのソースコードを貼って下さい。答えようがありません。

こんな感じでしょうか

//メッセージボックスのウィンドウを利用する
void message_box(){
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){



message_box();

if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1; //初期化と裏画面化

while(ProcessLoop()==0){ //メインループ

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 23:52
by 白い時空
あの、message_box()で、IDCANCELのときにDxLib_End関数を呼んでいますが、これではプログラムは終了しません。
IDCANCELのとき、WinMainでreturn 0をすればいいはずです。

Re:メッセージボックスについて

Posted: 2010年6月13日(日) 23:58
by シエル
DxLib_Initを呼んだ後に終了する場合であれば、DxLib_Endを呼ぶ必要がありますが、
このメッセージボックス関数を呼んでる場所は、DxLib_Initをまだ呼び出していないので、
DxLib_Endを呼ぶ必要はありません。

白い時空さんがおっしゃってるように、return 0;を書いて終了させればいいだけです。 画像

Re:メッセージボックスについて

Posted: 2010年6月14日(月) 00:08
by kai
あの

void message_box(){
int flag;
flag=MessageBox(
NULL,
TEXT("フルスクリーンモードで起動しますか?"),
TEXT("スクリーン設定"),
MB_YESNOCANCEL | MB_ICONQUESTION );
if(flag==IDNO){
ChangeWindowMode( TRUE );
}
else if(flag==IDCANCEL){
return 0;
}
}
これだとエラーが出るのですが・・

Re:メッセージボックスについて

Posted: 2010年6月14日(月) 00:14
by シエル
言い方が悪かったかも知れません。
WinMain関数内でreturn 0;を呼び出してください。

void message_box()関数内で、return 0;を呼び出してもその関数の戻り値で0
を返しているだけになります。

なので、void message_box()関数の戻り値として、flagの値を戻すようにし、
WinMain関数内で、その戻り値の値を判定し、return 0;を呼び出すようにしてください。

Re:メッセージボックスについて

Posted: 2010年6月14日(月) 00:19
by シエル
message_box関数はこんな感じ。

int message_box(){
int flag;
flag=MessageBox(
NULL,
TEXT("フルスクリーンモードで起動しますか?"),
TEXT("スクリーン設定"),
MB_YESNOCANCEL | MB_ICONQUESTION );
if(flag==IDNO){
ChangeWindowMode( TRUE );
}
else if(flag==IDCANCEL){
return flag;
}

return 0;
}


で、WinMain内ではこんな感じに呼び出す。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){


//メッセージボックス関数はこう呼び出す。
if(IDCANCEL==message_box()){
return 0;
}

if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1; //初期化と裏画面化

while(ProcessLoop()==0){ //メインループ

Re:メッセージボックスについて

Posted: 2010年6月14日(月) 00:22
by kai
おお出来ました!
ありがとうございます。
助かりました! 画像