Auto2D Picker

Hello, XAML!
C:\TMP\test.txt  Message

Picker で選択したテキストファイルを入力します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

Picker TEST

  1. 自動生成した Direct2DApp1 にボタンを貼り付けて Picker のテストをします。
    Direct 2D のプロジェクトを自動生成する方法は Direct 2D のプロジェクト を参照して下さい。
  2. DirectXPage.xaml にボタンを貼り付けます。
    ボタンのイベントハンドラ(Button_Click)から Picker でテキストファイルを選択します。
    テキストファイルから入力したメッセージを OutputDebugSTring() で確認します。
    void Direct2DApp1::DirectXPage::Button_Click(
        Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
        auto open = ref new FileOpenPicker();
        open->SuggestedStartLocation = PickerLocationId::Desktop;
        open->FileTypeFilter->Clear();
        open->FileTypeFilter->Append(".txt");
        
        create_task(open->PickSingleFileAsync()).then([this](StorageFile^ file)
        {
            return FileIO::ReadTextAsync(file);
        }).then([this](task<String^> previousTask) 
        {
            try
            {
                String^ str = previousTask.get();
                OutputDebugString(str->Data());
            }
            catch (...)
            {
                OutputDebugString(L"file not found");
            }
        });
    }
    
  3. DirectXPage.xaml.cpp に include と using を追加します。
    #include <ppltasks.h>
    using namespace Windows::Storage::Pickers;
    using namespace Windows::Storage;
    using namespace Windows::Storage::Streams;
    using namespace concurrency;
    
  4. 事前に C:\TMP\test.txt を作成しておいて下さい。
    ファイルに格納するメッセージです。(内容は問いません)
    C:\TMP\test.txt  Message
    
  5. コンパイル&実行をして下さい。
    ボタンをクリックして FileOpenPicker で C:\TMP\test.txt を選択します。
    出力画面に OutputDebugString() から "C:\TMP\test.txt Message" が印字されます。
    C/C++ でも同様のプログラム TEXT Picker を作成しています。

Layout 関数

  1. このプログラムは、先のプログラムの続きです。
    m_textLayout(テキストイメージのサーフェース)を設定する関数を作成します。
    SimpleTextRenderer.cpp の適当な場所に CreateTextImage() 関数を追加して下さい。
    // m_textLayout を作成
    void SimpleTextRenderer::CreateTextImage(Platform::String^ text)
    {
        DX::ThrowIfFailed(
            m_dwriteFactory->CreateTextLayout(
                text->Data(),
                text->Length(),
                m_textFormat.Get(),
                700, // maxWidth。
                1000, // maxHeight。
                &m_textLayout
                )
            );
    
        DX::ThrowIfFailed(
            m_textLayout->GetMetrics(&m_textMetrics)
            );
    }
    
  2. SimpleTextRenderer.cpp の CreateDeviceResources() から CreateTextImage() を呼び出します。
    void SimpleTextRenderer::CreateDeviceResources()
    {
        DirectXBase::CreateDeviceResources();
    
        DX::ThrowIfFailed(
            m_d2dContext->CreateSolidColorBrush(
                ColorF(ColorF::Black),
                &m_blackBrush
                )
            );
    
        Platform::String^ text = "Hello, DirectX!";
        CreateTextImage(text);
    }
    
  3. SimpleTextRenderer.h に CreateTextImage() 関数の宣言を追加します。
        void SimpleTextRenderer::CreateTextImage(Platform::String^ text);
    
  4. 先のプログラムと同様に、ボタンをクリックして C:\TMP\test.txt を選択します。
    出力画面で OutputDebugString() の印字を確認して下さい。

入力テキストを表示

  1. このプログラムは、先のプログラムの続きです。
    C:\TMP\test.txt から入力したテキスト(C:\TMP\test.txt Message)を画面に表示します。
    DirectXPage.xaml.cpp のボタンクリックのイベントハンドラを修正します。
    m_renderer->CreateTextImage(str); で str を格納したサーフェースを作成します。
    m_renderer->Render(); でサーフェースを表示します。
    void Direct2DApp1::DirectXPage::Button_Click(
        Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
        auto open = ref new FileOpenPicker();
        open->SuggestedStartLocation = PickerLocationId::Desktop;
        open->FileTypeFilter->Clear();
        open->FileTypeFilter->Append(".txt");
        
        create_task(open->PickSingleFileAsync()).then([this](StorageFile^ file)
        {
            return FileIO::ReadTextAsync(file);
        }).then([this](task<String^> previousTask) 
        {
            try
            {
                String^ str = previousTask.get();
                OutputDebugString(str->Data());
                m_renderer->CreateTextImage(str);
                m_renderer->Render();
            }
            catch (...)
            {
                OutputDebugString(L"Text File not found");
            }
        });
    }
    
  2. SimpleTextRenderer.cpp の Render() 関数の最後の部分を修正して下さい。
    void SimpleTextRenderer::Render()
    {
        ・・・
        if (m_renderNeeded) m_renderNeeded = false;
        else    Present();
    }
    
  3. ボタンをクリックして C:\TMP\test.txt を選択します。
    ファイルから入力したテキスト "C:\TMP\test.txt Message" が画面に表示されます。
    Image File の Picker は Image Picker を参照して下さい。

超初心者のプログラム入門(DirectX Store)