×で終了した時の処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
チルチル

×で終了した時の処理

#1

投稿記事 by チルチル » 16年前

DXライブラリのウィンドウを「×」とか「Alt+F4」で閉じた場合は
どのような手順で終了されているのでしょうか?

私はDxLib_End();の前にデータをセーブする処理を行っているのですが
上のような方法で終了したら、DxLib_End();を通ってくれないのでしょうかね・・
そうだとするとかなり問題なんですが・・

yu

Re:×で終了した時の処理

#2

投稿記事 by yu » 16年前

ProcessMessage で×が押されたとき等の処理をしていると思いますので (多分ですが...
(ウィンドウプロシージャのメッセージ処理?)

この関数が -1 を返した時、メインループを抜けて即セーブすればよいと思います

悩むより一度自分でやってみることをお勧めします ^^

チルチル

Re:×で終了した時の処理

#3

投稿記事 by チルチル » 16年前

ProcessMessageが-1を返した時と言う事は
終了するまでに数フレーム猶予があるんでしょうか?

yu

Re:×で終了した時の処理

#4

投稿記事 by yu » 16年前

フレームと言いますか
WinMain関数 が return するまでの間、ですかね
ですが、なるべく早めに終了させなければならないそうです

http://homepage2.nifty.com/natupaji/DxL ... .html#R1N3

ねこ

Re:×で終了した時の処理

#5

投稿記事 by ねこ » 16年前

SendMessageって関数について調べたら理解しやすいかもしれないですよ。

チルチル

Re:×で終了した時の処理

#6

投稿記事 by チルチル » 16年前

SendMessageについてはよくわかりませんでしたが
と言う事はProcessMessageが-1になった時に強制的にWinMain関数まで戻ってreturnするのでしょうか?

ねこ

Re:×で終了した時の処理

#7

投稿記事 by ねこ » 16年前

電話で例えるならProcessMessageは留守録を見る行為、SendMessageは着信だとしたら
留守録を見て着信が来てたら終わる。留守録を見ないと着信があったか分からない。

つまりProcessMessage関数実行時に「何か終了命令あった?」って逐次聞いてるわけです。
WinMainに干渉するわけじゃないです。

チルチル

Re:×で終了した時の処理

#8

投稿記事 by チルチル » 16年前

あ~なるほどそういう事ですか
しかしProcessMessageはループのある場所では大体呼んでいますから
ProcessMessageごと関数で囲んで置き換えるしかないんでしょうかね・・
でもProcessMessage実行時に終了命令があるか確認するとしても
戻り値を返すと言う事はProcessMessage内で終了されているわけでは無さそうですね・・
いったいどこで終了されているのでしょうか?

御津凪

Re:×で終了した時の処理

#9

投稿記事 by 御津凪 » 16年前

中でやっていることの話をすると、Windows API のメッセージループの話になってしまいますが、
このメッセージループの処理で、「×で閉じた」というメッセージが送信され、
DXライブラリでは、これを受信したとき、「終了させるタイミング」と判断し、終了の意味を示す値を返しているだけです。
返しているだけなので、内部では終了処理自体してません。

終了処理をするのは、自ら書いたコード(DxLib_End を呼び出すなど)で行います。

ねこ

Re:×で終了した時の処理

#10

投稿記事 by ねこ » 16年前

主題を見逃してましたが、チルチルさんのしようとしてる事は多分無理です。

明示的でない終了のタイミングでのファイルのやりとりは中断される可能性もありますし、書き込むメモリが正常な保証もありません。
差分ファイルも作ってないならドラクエで言えば「ぼうけんのしょはきえてしまいました」って事になります。

セーブ自体の設計を再考してみてはどうでしょうか?

yu

Re:×で終了した時の処理

#11

投稿記事 by yu » 16年前

>> ねこ様
>> 明示的でない終了のタイミングでのファイルのやりとりは中断される可能性もありますし、
>> 書き込むメモリが正常な保証もありません。

そうなのですか...
自分は結構危険なことをしていたのですね;
うまくいったので良しとしていました...
ありがとうございます

>> チルチル様

適切ではないことを言ってすみませんでした orz

チルチル

Re:×で終了した時の処理

#12

投稿記事 by チルチル » 16年前

う~ん、では毎フレームセーブするか
クリアした時にでも記録する事にしてみます
しかし明示的でないタイミングの処理が無理なら
たまにゲームなんかで×を押すと「終了しますか?」
みたいなウィンドウが出ますけど、アレはまた別の何かなんでしょうか?
そういえば龍神録は×を押しても終了しませんがアレもまた別の何かなんでしょうか?

yu

Re:×で終了した時の処理

#13

投稿記事 by yu » 16年前

>> チルチル様

Windowsプログラミングを少しかじれば、
そこら辺のことは見えてくるかと思います
(まだWinAPIの勉強を始めて1週間しか経過していない自分が言うのもあれですが....)

つまり
御津凪様が仰られたように
終了は自身が書いたコードで行われます
ですので
×ボタンが押された → メッセージボックス表示 → 戻り値がtrueなら終了
という感じにもできるかと思います
よくある「終了しますか?」はMessageBox()で簡単にできます


>> そういえば龍神録は×を押しても終了しませんがアレもまた別の何かなんでしょうか?

これはDXライブラリ側で関数が用意されています

SetWindowUserCloseEnableFlag( int Flag );

チルチル

Re:×で終了した時の処理

#14

投稿記事 by チルチル » 16年前

なるほどこんな関数もあったんですね
APIなどは今の実力では無理そうなので
そのうち勉強してみます

とりあえず終了時以外にセーブポイントを追加してみます
どうもありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る