Tree View を表示する

DialogBox に TreeView を貼り付けて表示します。
TreeView の扱い方は ListView に似ていますが、階層構造を表示する分だけ難しくなります。
TreeView の手始めに簡単な家族構成を表示して見ましょう。

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

プロジェクトの設定

  1. 新規プロジェクトで(TreeView)を作成します。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    DialogBox 全体に TreeView を貼り付けて、キャプションとIDを次のように設定して下さい。
    BOX キャプション ID
    DialogBox Dialog Tree View IDD_DIALOG1
    TreeView IDC_TREE1
  3. スタイルの表示から次の項目をチェックして下さい。
    キャプション 説明
    Has Buttons ボタンあり
    Has Lines 線を表示
    Lines At Root 最上位にも線を表示
    Border 境界線
    説明の画像
  4. commctrl.h をインクルードして下さい。
    #pragma comment(lib,"comctl32.lib") で、リンカに対して comctl32.lib を組み込むように指示します。
    これは [プロジェクト] [プロパティ] [リンカ] [入力] からライブラリを追加することと同じです。
        #include    <commctrl.h>
        #pragma     comment(lib,"comctl32.lib")
        
  5. WinMain() では DialogBox を表示するだけです。
    WM_INITDIALOG: でアプリケーションの初期化を行います。
    InitCommonControls() で初期化して、SetInitialData() で TreeView にデータを登録します。
    この辺は ListView と同じです。
        case WM_INITDIALOG:
            InitCommonControls();
            SetInitialData(GetDlgItem(hDlg,IDC_TREE1));
            break;
        
  6. TreeView に登録するコードです。
    再起やループを使わないで、一項目ずつ登録してみました。
    TV_INSERTSTRUCT に登録に必要な情報を設定して TreeView_InsertItem() で登録します。
    hParent が ITEM を登録する Tree の親で、pszText が登録する TEXTDATA です。
    TreeView_InsertItem() の戻り値として登録した Tree のハンドルが返されます。
    実行結果の画面とソースコードを見比べれば、コードの意味が理解できるでしょう。
        void    SetInitialData(HWND hTree)
        {   HTREEITEM       hParent1, hParent2, hParent3, hChild1, hChild2;
            TV_INSERTSTRUCT tv;
    
            memset((char *)&tv, '\0', sizeof(tv));
            tv.hInsertAfter = TVI_LAST;
            tv.item.mask = TVIF_TEXT;
            tv.hParent = TVI_ROOT;
            tv.item.pszText = "鈴木";
            hParent1 = TreeView_InsertItem(hTree,&tv);
    
            tv.item.pszText = "田中";
            hParent2 = TreeView_InsertItem(hTree,&tv);
    
            tv.item.pszText = "佐藤";
            hParent3 = TreeView_InsertItem(hTree,&tv);
    
            tv.hParent = hParent1;
            tv.item.pszText = "慎吾";
            hChild1 = TreeView_InsertItem(hTree,&tv);
            tv.item.pszText = "和子";
            hChild2 = TreeView_InsertItem(hTree,&tv);
            tv.hParent = hChild1;
            tv.item.pszText = "あゆみ";
            TreeView_InsertItem(hTree,&tv);
            tv.hParent = hChild1;
            tv.item.pszText = "優子";
            TreeView_InsertItem(hTree,&tv);
    
            tv.hParent = hParent2;
            tv.item.pszText = "ヘンリー";
            TreeView_InsertItem(hTree,&tv);
    
            tv.hParent = hParent3;
            tv.item.pszText = "エリザベス";
            TreeView_InsertItem(hTree,&tv);
            return;
        }
        
  7. TreeView から TEXT を取得する方法は Tree View のデータを保存する を参照して下さい。
    C#でも同様のプログラムを作成しています。
    超初心者のプログラム入門(C#)から TreeView に階層で登録 を参照して下さい。

【演習】

TreeView にデータを登録する汎用性のある関数を作成しましょう。
汎用性を持たせるには、Tree 構造の形が違っても登録できなければなりません。
Data の構造を表現するのに階層番号を持たすのが良いでしょう。
例えば次のように定義します。
char    Data[][16]=
{   "1 大阪", "2 雅夫", "2 祐子", "3 雅美子", "3 由香理", "4 あゆみ", 
    "1 兵庫", "2 英明", "2 美樹",
    "1 京都", "2 紀夫", "2 美佐子", "3 まい", "0 "
};

このデータは単純なループでは登録できません。
このような時に威力を発揮するのが、再帰処理です。
ちょっと難しいかも知れませんが、再帰処理を習う良い機会です。
汎用性のある登録関数を作成してみましょう。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
一件ずつ登録する
再起で登録する

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