Store Guide

Store Application(Windows 10, Windows 8) のプログラムガイドです。
ストアアプリの C++ が従来の .NET Framework のものではなく、新しい WinRT(C++/CX) という API を利用しています。

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

Store Programing Guide Index

文字コードの説明

  1. Windows の文字コードには Shift_JIS(ANSI) 文字セットと Unicode 文字セットがあります。
    昔は必ず Shift_JIS(ANSI) を使ったものですが、最近では Unicode が主流になってきました。
    Unicode にも 8 bit, 16 bit, 32 bit, etc が存在します。
    8bit Unicode も MultiByte(8 Bit or 16 Bit Charcter Set) に含まれると思うのですが、一般的に MultiByte と言えば Shift_JIS を指すようです。
    Shift_JIS では、英数字や一部の記号を8ビットで、ひらかなや漢字などを16ビットで表現します。
  2. 普通 Unicode と言えば utf-16 を指すようですが、ソースプログラムファイルには utf-8 が使われています。
    Unicode には BOM が格納されているものと、格納されていないものがあります。
    BOM(byte order mark)とはテキストファイルの先頭に格納される文字コードを示すIDです。
    BOM が格納されていると Encoding で間違った設定をしても、文字化けすることなく正しく読むことができます。
    Shift_JIS には当然ながら BOM は格納されていません。
    文字コード BOM 説明
    utf-16 FFFE 先頭2バイトが BOM です
    utf-8 EFBBBF先頭3バイトが BOM です
    utf-8(BOM無し) BOM は格納されていません
  3. 1行の終わりを示す改行コードの説明です。
    改行コードには \r(carriage return) と \n(line field) が使われます。
    \r は復帰(タイプライターでは左端に戻す)で、\n は改行(タイプライターでは次の行に送る)です。
    タイプライターを使っていた時代には \r と \n を組み合わせて1行の終わりとしていました。
    パソコンでは \r や \n が単独で使われることは無く、どちらか一個で用が足ります。
    現在ではOSや TEXT FILE の文字コードにより違いがあり、何が使われるかは一概に決められません。
    一般的には Shift_JIS や utf-8 でタイプされた TEXT FILE には \r(CR)+\n(LF) が用いられるようです。
    プログラムで印字する文字列には \n が使われるようです。
    "Print String\n" または "Print String\r\n"

String Guid

  1. 文字列(char の配列)で最も悩まされるのは、文字列の長さの問題です。
    必要以上に大きな領域を確保するのも気が引けますし、領域をオーバーしてアクセスすると何が起こるか解りません。
    特にサイズが確定しないメモリ領域をダイナミックにアロケートするときには、何時も悩まされます。
    この問題を一挙に解決してくれるのが String(string) です。
    ストリングは C++ や C# や STL や C++ Maneged や Windows8(10) や MFC で独自のストリング機能がサポートされていて、それぞれ書き方や機能が異なるのが混乱の原因です。
    そこで Store Application に適した String(string) をまとめてみました。
  2. Windows Store で提供されている C++ のストリングは非力であまり役に立ちません。 (^_^;)
    文字を個別に参照するときや、文字列を切り分けるときは苦労します。
    Win8 String
    Week Class
    #include <windows.h>    // OutputDebugString
    
        String^ str;
        int     v1 = 12;
        int     v2 = 345;
        str = "v1:" + v1.ToString() + "  v2:" + v2.ToString();
        OutputDebugString(str->Data());
    
  3. C++ で機能が充実していて、使いやすいのは STL の stirng(wstirng) です。
    文字列の中の特定の文字を参照するときや、文字列を切り分けるときは STL のストリングを使います。
    STL の string を使う(wstring を使う)
    Win10 OBJ Model
    #include <string>       // STL の String を使う
    using namespace std;
    
        wstring s;
        s = L"12, 3.45, {67}, { ab }; XYZ\r\n";
        OutputDebugString(s.data());
    
        // Token を切り出す
        wstring Word;
        int    Size, Col, wk;
        Size = s.length() - 1;
    
        for (Col = 0; Col<Size;)
        {
            wk = s.find_first_not_of(L" ,;{}", Col);
            Debug(L"Left=", wk);
            Col = wk;
            wk = s.find_first_of(L" ,;}\r\n", Col);
            Debug(L"Right=", wk);
            if (wk == Col)  break;
            Word = Word.assign(s, Col, wk - Col);
            OutputDebugString(Word.data());
            OutputDebugString(L"\r\n");
            Col = wk + 1;
        }
    
  4. Windows Store で提供されている C# の string 機能です。
    C++ の String^ は非力ですが、C# の string は強力です。
    string⇔char[]
    Calender
    string str = "2019/02/21";
    string[] ymd;
    ymd= str.Split(new char[] {'/', '-'});
    
    for(int i=0; i<m_ymd.GetLength(0); i++)
    {
        Debug.WriteLine("i={0}、ymd[i]={1}", i,m_ymd[i]);
    }
    

配列(Array)

  1. Windows Store で提供されている C++ の Array は非力であまり役に立ちません。 (^_^;)
    VC-2019 DebugString
    Win8 String
    #include <windows.h>
        int i, wk;
        Platform::Array<int>^ ary = ref new Array<int>(5);
        for (i = 0; i < 5; i++)     ary[i] = i;
        for (i = 0; i < 5; i++)
        {   wk = ary[i];
            OutputDebugString(wk.ToString()->Data());
        }
    
  2. C++ で機能が充実していて、使いやすいのは STL の vector です。
    vector を使うときは <vector> を #include して下さい。
    STL vector
    Calender
    #include <vector>
        std::vector<int> v;
    
        v.push_back(1);
        v.push_back(23);
        v.push_back(456);
    
  3. Windows Store で提供されている C# の ArrayList は強力です。
    ArrayList は List 型の配列で、要素の「追加/挿入/削除」が簡単に出来るようになっています。
    ArrayList を使うときは System.Collections; を指定して下さい。
    Array List
    using System.Collections;
        ArrayList   array;
    
        array = new ArrayList();
        for(i=0; i<10; i++)     array.Add(i);
        foreach(int DAT in array)
        {
            Debug.WriteLine("value={0} ", DAT);
        }
    

Program Debug Note

    デバッグガイド

  1. Debug Tool に依存しすぎると、無駄な時間ばかり浪費してろくなことはありません。
    デバッグに必要な情報を表示するソースコードをプログラムに組み込みましょう。
    ①MessageBox などを利用する。
    ②WriteLine などで出力ウインドウに書き出す。
    ③タイトルバーに表示する。

    MessageBox を使う

    MessageBox() はどこからでも手軽に利用することが出来るので、デバッグのときに重宝します。
  2. ストアアプリ(C++)では MessageDialog を使います。
    Windows8 Blank App
        Windows::UI::Popups::MessageDialog^ dlg =
            ref new Windows::UI::Popups::MessageDialog("Test Message");
        dlg->ShowAsync();
    
  3. ストアアプリ(C#)の書き方です。
    Button Click
    async private void Button_Click(object sender, RoutedEventArgs e)
    {
        Windows.UI.Popups.MessageDialog dlg =
            new Windows.UI.Popups.MessageDialog("Hello World");
        await dlg.ShowAsync();
    }
    

    出力ウインドウに書き出す

  4. 応答するのが面倒なら Visual Studio の出力ウインドウを使う方法がお勧めです。
    メッセージは Debug モードで実行した時に出力ウインドウに表示されます。
    Debug モードで実行が終わった後で「出力」タブをクリックして下さい。
    普通に実行した場合は全く影響が無く、デバッグ情報の収集に適しています。
    OutputDebugString() は、Windows10/C++ でも Windows10/DirectX でも使用可能です。
  5. ストアアプリ(C++)では OutputDebugString を使います。
    <windows.h> をインクルードして下さい。
    #include <windows.h>
        OutputDebugString(L"★Test Debug Message\n");
    
        int num = 123;
        OutputDebugString(num.ToString()->Data());
    
    void Debug(Platform::String^ msg, int v)
    {   Platform::String^ str = msg + v.ToString() + "\r\n";
        OutputDebugString(str->Data());
    }
    
  6. ストアアプリ(C#)では Debug.Write を使います。
    using System.Diagnostics; を宣言して下さい。
    using System.Diagnostics;   //Debug.Write を使うとき
        Debug.Write("\n*** Debug Message ***\n");
    
        int num = 123;
        Debug.WriteLine("NUM:" + num);
    

    タイトルバーに表示する

  7. Title Bar を利用して Debug 情報を確認する方法も便利です。
    時々刻々と変化する情報を常時確認することが出来ます。
  8. ストアアプリ(C#)で Title Bar に表示するプログラム Title Bar です。
    using Windows.UI.ViewManagement;
    
        public MainPage()
        {
            public MainPage()
            {
                this.InitializeComponent();
                var view = ApplicationView.GetForCurrentView();
                view.Title = "現在の時刻:" + DateTime.Now.ToString();
            }
        }
    
  9. ストアアプリ(C++)でも使えますが Title Bar C++ の場合はちょっと面倒です。
        <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Border x:Name="TitleBar" BorderBrush="Black" Background="DarkBlue" BorderThickness="1">
                <TextBlock x:Name="TitleName" Text="My Application" Foreground="White" Style="{ThemeResource BodyTextBlockStyle}" />
            </Border>
        </Grid>
    
    MainPage::MainPage()
    {
        Windows::ApplicationModel::Core::CoreApplication::GetCurrentView()->TitleBar->ExtendViewIntoTitleBar = true;
        InitializeComponent();
        Windows::Globalization::Calendar^ cal = ref new Windows::Globalization::Calendar();
        auto longTime = ref new Windows::Globalization::DateTimeFormatting::DateTimeFormatter("longtime");
        DateTime time = cal->GetDateTime();
        TitleName->Text = longTime->Format(time);
    }
    

Program Guid 古いページの Windows & DirectX のプログラムガイドです。