MessageDialog

MessageDialog のプログラムです。

前田稔の超初心者のプログラム入門

事前準備

  1. MessageDialog はダイアログボックスを使って、注意の喚起やデバッグ情報の表示などに使用します。
    Win32API では MessageBox を使っていましたが StoreApp では MessageDialog を使います。
    MessageDialog は別のタスクで実行され、終了を待たずに次のステップに制御が移ります。
    Visual Studio 2019 を立ち上げて[ファイル][新規作成][プロジェクト]を開き、[新しいプロジェクトの作成]を選択します。
    [Blank App(Universal Windows - C++/CX)]を選択して下さい。
    一覧に表示されない場合は、下部の「探しているものが見つからない場合さらにツールと機能をインストールする」を選択します。

  2. 今回は現在時刻を取得する関数と OutputDebugString で出力ウインドウに印字する関数を使います。
    MainPage のコーディングに先立って、これらの関数を MainPage.xaml.cpp に追加します。
    関数を宣言しなくても使えるように using の直後にでも置いて下さい。
    C++ では後位参照が起こらなければ「関数のプロトタイプ宣言」を省略することが出来ます。
    OutputDebugString を使うので #include <windows.h> を追加して下さい。
  3. 現在時刻を取得する GetTime() 関数のソースコードです。
    #include <windows.h>    // OutputDebugString
        ・・・
    // 現在時刻を取得する関数
    Platform::String^ GetTime()
    {
        Windows::Globalization::Calendar^ cal = ref new Windows::Globalization::Calendar();
        auto longTime = ref new Windows::Globalization::DateTimeFormatting::DateTimeFormatter("longtime");
        Windows::Foundation::DateTime time = cal->GetDateTime();
        Platform::String^ result = longTime->Format(time);
        return result;
    }
    
  4. 出力ウインドウに印字する Debug() 関数のソースコードです。
    // 出力ウインドウに印字する関数
    void Debug(Platform::String^ msg)
    {
        Platform::String^ str;
        str = L"\n★" + msg + "\n";
        OutputDebugString(str->Data());
    }
    

MessageDialog の説明

  1. 基本的な MessageDialog の使い方で、現在時刻を表示します。
    第二引数に "Now Time" を渡すと現在時刻の上に大きく表示されます。
    MainPage.xaml.cpp の Constructor を修正して下さい。
    MainPage::MainPage()
    {
        InitializeComponent();
        auto dlg = ref new Windows::UI::Popups::MessageDialog(GetTime(), "Now Time");
        dlg->ShowAsync();
    }
    

  2. MessageDialog に続いて出力ウインドウに現在時刻を印字してみました。
    終了を待たずに Debug() 関数が実行されるので、出力ウインドウには MessageDialog と同じ時刻が印字されることに注目して下さい。
    MainPage::MainPage()
    {
        InitializeComponent();
        auto dlg = ref new Windows::UI::Popups::MessageDialog(GetTime());
        dlg->ShowAsync();
        Debug(GetTime());
    }
    

  3. MessageDialog の終了を待って、出力ウインドウに現在時刻を印字します。
    create_task を使うので using namespace concurrency; を追加して下さい。
    MessageDialog の終了を待って Debug() 関数が実行されるので、出力ウインドウには MessageDialog を閉じた時刻が印字されます。
    using namespace concurrency;
    
    MainPage::MainPage()
    {
        InitializeComponent();
        auto dlg = ref new Windows::UI::Popups::MessageDialog(GetTime(), "Wait");
        create_task(dlg->ShowAsync()).then([this](Windows::UI::Popups::IUICommand^ command)
        {
            Debug(GetTime());
        });
    }
    

  4. MessageDialog でメッセージを選択します。
    "Msg-1", "Msg-2" が選択するメッセージで、どちらかをクリックすると MessageDialog が終了します。
    選択された方のメッセージを Debug() 関数で印字しています。
    using namespace concurrency;
    
    MainPage::MainPage()
    {
        InitializeComponent();
        auto dlg = ref new Windows::UI::Popups::MessageDialog(GetTime(), "Message Select");
        dlg->Commands->Append(ref new Windows::UI::Popups::UICommand("Msg-1", nullptr, PropertyValue::CreateInt32(0)));
        dlg->Commands->Append(ref new Windows::UI::Popups::UICommand("Msg-2", nullptr, PropertyValue::CreateInt32(1)));
        dlg->DefaultCommandIndex = 1;
        create_task(dlg->ShowAsync()).then([this](Windows::UI::Popups::IUICommand ^ command)
        {
            Debug(command->Label);
        });
    }
    
  5. 選択したメッセージで後の処理を変えます。
    今回は "Exit" を選択するとプログラムが終了します。
    MainPage::MainPage()
    {
        InitializeComponent();
        auto dlg = ref new Windows::UI::Popups::MessageDialog(GetTime(), "Message Select");
        dlg->Commands->Append(ref new Windows::UI::Popups::UICommand("Msg-1", nullptr, PropertyValue::CreateInt32(0)));
        dlg->Commands->Append(ref new Windows::UI::Popups::UICommand("Msg-2", nullptr, PropertyValue::CreateInt32(1)));
        dlg->Commands->Append(ref new Windows::UI::Popups::UICommand("Exit", nullptr, PropertyValue::CreateInt32(2)));
        dlg->DefaultCommandIndex = 0;
        create_task(dlg->ShowAsync()).then([this](Windows::UI::Popups::IUICommand ^ command)
            {
                Debug(command->Label);
                if (command->Label == "Exit")   exit(-1);
            });
    }
    

超初心者のプログラム入門(C/C++)