MessageBoxの使い方


Siv3D Advent Calendar 2016 7日目の記事です。

初めに

Siv3Dにはたくさんの機能があります。しかし、あまり使用されない機能も存在します。
そこで、今回はそんな機能のひとつの、MessageBoxを紹介したいと思います。

MessageBoxとは

パソコンを使っていると警告音とともに出てくるあれです。

MessageBoxを使うと、簡単な選択肢を表示したり、エラーを表示したりすることができます。

Siv3DのMessageBox

表示
MessageBox::Show(L"Hello");

これでMessageBoxを表示することができます。

選択の取得

取得
MessageBoxCommand com = MessageBox::Show(L"Hello");

MessageBox::Showの戻り値で、何が選択されたのか取得できます。

条件分岐
#include <Siv3D.hpp>


void Main() {

    const MessageBoxCommand com = MessageBox::Show(L"Hello");

    if (com == MessageBoxCommand::Ok)
    {
        MessageBox::Show(L"Okが押されました");
    }

}


細かな設定

MessageBoxには「タイトル・本文・スタイル・既定のボタン」を設定することができます。

疑似コード
MessageBox::Show(タイトル, 本文, スタイル, 既定のボタン);
一例
MessageBox::Show(L"質問", L"嘘つきですか?", MessageBoxStyle::YesNo, 0);

スタイルを変更することで、表示されるボタンが変わります。
以下の表にスタイルの表示形式をまとめました。

スタイル 表示形式 戻り値
Ok Ok
OkCancel Ok・Cancel
YesNo Yes・No
YesNoCancel Yes・No・Cancel
RetryCancel Retry・Cancel
CancelRetryContinue Cancel・Retry・Continue

スタイルによって戻り値のパターンが変化します。

既定のボタンは、表示されたときに、どのボタンにカーソルを合わせているかを設定します。
例えば、スタイルがCancelRetryContinueの場合
0ならばキャンセルに
1ならば再実行に
2ならば続行に
カーソルが選択されます。

使用例

ここでは、終了確認を行うプログラムを紹介します。

終了確認
#include <Siv3D.hpp>

void Main() {

    System::SetExitEvent(WindowEvent::Manual);

    while (System::Update())
    {
        if ((System::GetPreviousEvent() & WindowEvent::CloseButton)
            || (System::GetPreviousEvent() & WindowEvent::EscapeKey))
        {
            const auto com = MessageBox::Show(L"確認", L"終了しますか?", MessageBoxStyle::YesNo, 1);

            if (com == MessageBoxCommand::Yes)
            {
                System::Exit();
            }
        }
    }

}

注意事項

MessageBoxを表示させると、メインウィンドウが予期せぬ描画になる可能性があります。

予期せぬ描画
#include <Siv3D.hpp>

void Main() {

    while (System::Update())
    {
        Circle(Mouse::Pos(), 50).draw({ 255, 0, 0, 127 });

        MessageBox::Show(L"");
    }
}

このコードを実行すると、はじめだけ真っ白な画面が表示されます。
(おそらく直前の画面が表示されるため?要検証)

また、Windows.hをSiv3D.hppの後に追加すると、MessageBoxがマクロに置き換えられ、使用できなくなります。

マクロによる置き換え
#include <Siv3D.hpp>
#include <Windows.h>

void Main() {

    //MessageBox::Show(L"");使用できない
    MessageBox(nullptr, TEXT("Hello"), TEXT("Title"), MB_OK);//置き換えられる

}

終わりに

MessageBoxの使い方を紹介しました。また、注意事項を2つ紹介しました。

明日は @LPC1768_ さんの記事です.よろしくお願いいたします.