Tree View のデータを保存する

TreeView に表示したデータを、再起でたどってファイルに保存します。

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

プロジェクトの設定

  1. Tree View に家族構成を表示するプログラムは Tree View を表示する を参照して下さい。
  2. commctrl.h をインクルードして下さい。
    #pragma comment(lib,"comctl32.lib") で、リンカに対して comctl32.lib を組み込むように指示します。
    Tree は Tree View のハンドルです。
    tv は Tree View の項目を取得するための構造体です。
        /******************************************************/
        /*★ Tree View の Data を再帰で出力する     前田 稔 ★*/
        /******************************************************/
        #define     TITLE       "Tree View Text Out"
        #include    <windows.h>
        #include    <commctrl.h>
        #include    "resource.h"
        #pragma     comment(lib,"comctl32.lib")
    
        char    Data[][16]=
        {   "1 鈴木", "2 慎吾", "2 和子", "3 あゆみ", "3 優子", "4 まい", 
            "1 田中", "2 ヘンリー", "2 景子",
            "1 佐藤", "2 孝雄", "2 エリザベス", "3 ジョン", "0 "
        };
    
        HWND        Tree;
        TV_ITEM     tv;
        HANDLE      hFile;
        DWORD       dwBytes;
        char        buf[256];
        
  3. WM_CLOSE: で DialogBox を閉じる前に w.txt に保存してみました。
            case WM_CLOSE:
                MessageBox(NULL,"Tree View を w.txt に保存します","Tree View Save",MB_OK);
                File_Save();
                EndDialog(hDlg, TRUE); 
                return TRUE;
                break;
        
  4. 出力ファイル(w.txt)に TreeView のデータを保存する File_Save() 関数です。
    出力ファイルをオープンして、最初にタイトル文字を出力します。
    tv.mask に TVIF_TEXT を設定して、TreeView の TEXT を取得します。
    buf は TEXT を格納する領域で 256 はその最大長です。
    TreeView_GetRoot() TreeView の先頭アイテムを取得して準備完了です。
    TV_Save(item) が TreeView を再起でたどってファイルに書き出す関数です。
    書き出しが終わるとファイルをクローズして終了です。
        //★ Tree View を w.txt に保存
        void  File_Save()
        {   HTREEITEM   item;
    
            hFile = CreateFile("w.txt",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
            if (hFile==INVALID_HANDLE_VALUE)
            {   MessageBox(NULL,"w.txt","WRITE Open Error",MB_OK);
                return;
            }
            WriteFile(hFile,"Terr View Output Text\r\n",23,&dwBytes,NULL);
            tv.mask= TVIF_TEXT;
            tv.pszText= buf;
            tv.cchTextMax= 256;
            item= TreeView_GetRoot(Tree);
            TV_Save(item);
            CloseHandle(hFile);
        }
        
  5. TreeView を再起でたどってファイルに書き出す関数です。
    TreeView_GetItem() で TEXT を buf[] に取得してファイルに書き出します。
    "\r\n" は項目ごとに改行するためです。
    TreeView_GetChild() で現在のアイテムの子項目を検索します。
    TreeView_GetNextSibling() で兄弟項目を検索します。
    ソースコードは短いのですが、論理の流れは複雑です。
    論理の流れを追って、Tree View に登録されている全ての項目が書き出されることを確かめて下さい。
        //★ Tree View を再起で保存
        int  TV_Save(HTREEITEM item)
        {   HTREEITEM   child;
    
            if (item==NULL)    return -1;
            tv.hItem= item;
            TreeView_GetItem(Tree,&tv);
            WriteFile(hFile,buf,strlen(buf),&dwBytes,NULL);
            WriteFile(hFile,"\r\n",2,&dwBytes,NULL);
            child= TreeView_GetChild(Tree,item);
            TV_Save(child);
            child= TreeView_GetNextSibling(Tree,item);
            TV_Save(child);
            return 0;
        }
        

【演習】

論理の流れを追って、TreeView に登録されている全ての項目が書き出されることを確かめて下さい。
階層番号を持つデータを TreeView に登録したときと考え方は同じなのですが。 (^_^;)
char    Data[][16]=
{   "1 大阪", "2 雅夫", "2 祐子", "3 雅美子", "3 由香理", "4 あゆみ", 
    "1 兵庫", "2 英明", "2 美樹",
    "1 京都", "2 紀夫", "2 美佐子", "3 まい", "0 "
};

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