終了処理について
furafura  2014/12/09(Tue) 22:58
リファレンス | GUI→ボタン
を拝見してますと、「終了しますか?」
はい・いいえ
と確認を求めています。

質問ですが、タイトルバーの×ボタンを押した事で、直後に同様の確認をさせて終了させる方法として、好ましいものを教えて頂けると幸いです。

System::SetExitEvent(WindowEvent::CloseButton);
を試してみましたが、
while (System::Update())
で抜けてしまいます。

希望としてはGUIを用いるのが最良なのですが、単なるメッセージボックスでも構いません。
Reputeless  2014/12/11(Thu) 11:05
System::SetExitEvent() は、アプリを自動的に終了させるウィンドウイベントを登録する関数です。
System::SetExitEvent(WindowEvent::CloseButton) とすると、×ボタンが押されたときか、System::Exit() が呼ばれたときにのみ終了するようになります。

デフォルトでは (WindowEvent::CloseButton | WindowEvent::EscapeKey) が設定されているので、
×ボタン、Escape キー、もしくは System::Exit() でアプリケーションが終了します。

×ボタン、Escape キーで自動的に終了させたくない場合は、System::SetExitEvent(WindowEvent::Manual) としたうえで、
プログラムの中で適切に System::Exit() を使います。

直前のフレームで発生したウィンドウイベントは System::GetPreviousEvent() で取得できます。
この関数の戻り値と各ウィンドウイベントフラグの AND をとると、イベント発生の有無を確認できます。

×ボタン、Escape キーが押されたときに終了確認の GUI を表示し、
「はい」が押されたときにのみ終了するサンプルを掲載しました。
http://play-siv3d.hateblo.jp/entry/jp/example/exit



furafura  2014/12/13(Sat) 17:57
返事が遅くなりまして済みません。
System::Update()に頼っていた事を痛感しながら、プログラムの修正中です。
私の求めていた答えそのものでした。
本当にありがとうございます。

念のために追加で質問です。
System::SetExitEvent(WindowEvent::Manual);
を用いた場合に限った質問です。

アプリ終了の確認のサンプルで、
else if (gui.button(L"no").pushed)
{
gui.hide();
}

gui.hide();
を例えば単なる
return;
にするのは構わないでしょうか。
文面を素直に拝見する限り、
問題なさそうに感じたのですが、
あくまでプログラムにおける終了処理に関しては、
System::Exit();
を呼ぶべきでしょうか?

細かい事ですが、
System::Exit();
の後に続く処理があった場合、実行は保証されるのでしょうか?
他の言い方をすると、
System::Exit();
return;
のような事に意味があるのか無いのか教えて下さい。
furafura  2014/12/17(Wed) 10:14
なんと自己判断をしました。間違っているかも知れません。

実際に調べて、
System::Exit();
で即座に終了するのではない事を確認しました。
System::Exit();の後、
while (System::Update())
の段階で抜ける事が分かりました。頼ってばかりで済みませんでした。

私のプログラムでの対応ですが、
サンプルに当てはめた場合、
{
System::Exit();
}
でupdateを通さずに
{
System::Exit();
break; もしくは return;
}
にしました。updateを1度通す必要があるのかまでは分かりませんでした。
(特に指導が無ければ、通すように修正します)

いずれにせよ、System::SetExitEvent(WindowEvent::Manual);
にした場合には、
System::Exit();
をプログラム終了までに必ず1度呼び出すようにしました。
Reputeless  2014/12/17(Wed) 11:29
すみません!最後の質問を見落としていました!
System::Exit() の効果は、現時点では
「次の System::Update()の戻り値を false にする」だけです。
System::Exit() を使わず、break や return でメインループから抜けても問題ありません。

System::Exit() の利点としては
・プログラムの深いところからアプリの終了をエンジンに通知できる
・一度 System::Update() を通るので、一番最後のフレームのスクリーンショットを (Graphics::SaveScreenshot()を呼んでいた場合) 保存できる

の 2 点です。

新しい質問は新しいスレッドを作ってもらえると見落としを防げます。
どしどし気軽に新しいスレッドを立ててください。
furafura  2014/12/17(Wed) 19:08
配慮下さってありがとうございます。
なんか、私の名前ばかり増えて、申し訳ないので…。

いただいた回答を参考にさせていただきます。

- WEB PATIO -