我想从一个文件中读取其内容,然后将读取的内容传给树形控件,最终构成一个树形结构。请问应该怎样实现?
我是这样做的:
int mybar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CSizingControlBar::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
m_TreeCtrl.Create(WS_VISIBLE | WS_TABSTOP | WS_CHILD | WS_BORDER
| TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES
| TVS_DISABLEDRAGDROP|TVS_EDITLABELS|TVS_TRACKSELECT,
CRect(10, 10, 300, 100), this, ID_TREECTRL);


CFont *font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
m_TreeCtrl.SetFont(font);

HTREEITEM root = m_TreeCtrl.InsertItem("plc",0,0); int numofsubroot = 0;
char buf[32];
HTREEITEM subroot[20];
ifstream in ("plc.prj", ios::in);
assert (in);
while (in.getline (buf, 32, '\n'))  //读取文件内容,并构造树形
{
subroot[numofsubroot] = m_TreeCtrl.InsertItem (buf, 1, 1, root);
numofsubroot ++;
}
m_TreeCtrl.SelectItem(root);
m_TreeCtrl.Expand(root, TVE_EXPAND);
         while (numofsubroot)
{
m_TreeCtrl.Expand (subroot[numofsubroot], TVE_EXPAND);
numofsubroot --;
} return 0;
}但没有成功,请各位多多指教!谢谢!

解决方案 »

  1.   

    CStdioFile类中有个ReadString方法可以实现 不知道楼主能否用得上
    建议先把文件每一行读到数组里,再对应你的TreeCtrl
    代码如下
    {
    CStdioFile file;
    file.Open("text.txt", CFile::modeRead | CFile::typeText);
    CString str;
    CString strTemp;
    while(file.ReadString(strTemp))
    {
    str += strTemp + "\r\n";
    }  
    file.Close();
    }
      

  2.   

    我给你一段代码,前几天刚做过,自己想出来的,呵呵:
    FILE *pTableInfo;
    FILE *pCompInfo;
    char line[100];
    vector<CString> vTableName;
    vector<CString> vCompInfo;
    TV_ITEM item;
    TV_ITEM subitem;
    TV_INSERTSTRUCT ins_str;
    HTREEITEM hChildItem;
    HTREEITEM hRoot;
    //初始化表名称
    if((pTableInfo = fopen(GetFilePath()+"tableinfo.txt", "r")) == NULL)
     exit(0);
    while(!feof(pTableInfo))
    {
      fgets(line,0x100, pTableInfo);
      if(line[strlen(line)-1]==0x0A)
      line[strlen(line)-1]=0;
      vTableName.push_back(line);
    }
    fclose(pTableInfo);
    //初始化公司名称
    if((pCompInfo = fopen(GetFilePath()+"compinfo.txt", "r")) == NULL)
     exit(0);
    while(!feof(pCompInfo))
    {
      fgets(line,0x100, pCompInfo);
      if(line[strlen(line)-1]==0x0A)
      line[strlen(line)-1]=0;
      vCompInfo.push_back(line);
    }
    fclose(pCompInfo);
    //初始化树控件
      for(int i=0; i<vCompInfo.size(); i++)
      {
          item.mask = TVIF_TEXT;
          item.pszText = (char*)(LPCTSTR)vCompInfo.at(i);
          ins_str.hParent = TVI_ROOT;
          ins_str.hInsertAfter = TVI_LAST;
          ins_str.item = item;
          hRoot = m_compTree.InsertItem(&ins_str);
          for(int j=0;j<vTableName.size();j++)
          {
      subitem.mask = TVIF_TEXT;
      subitem.pszText = (char*)(LPCTSTR)vTableName.at(j);
      ins_str.hParent = hRoot;
      ins_str.hInsertAfter = TVI_LAST;
      ins_str.item = subitem;
      hChildItem = m_compTree.InsertItem(&ins_str);
          }
       }
      

  3.   

    注意,头文件里你加一个#include <vector>,我用到了vector,//初始化表名称,和//初始化公司名称
    里的功能就是每次读取文本文件的一行内容,加载到vector对象里.
    公司名称作为父树项的显示内容,表名称作为子树项的显示名称.代码不难理解的.
    程序里用到一个得到应用程序当前路径名的自定义函数GetFilePath(),定义如下:
    /***********************************
    /*返回应用程序当前所在磁盘路径 example: "E:\VC-PRACTISE\TransCheck\"
    ***********************************/
    CString CTransCheckDlg::GetFilePath()
    {
    char szPath[255];
    CString strFileName,strFilePath;
    int pos;
    ::GetModuleFileName(NULL,szPath,255);
    strFileName = szPath;
    pos = strFileName.ReverseFind('\\');
    strFilePath = strFileName.Left(pos+1);
    return strFilePath;
    }
      

  4.   

    我用了 signoft(晴天)的方法,果然可以,谢谢了!!!
    虽然我没有用到 sj971059(sj971059)提供的方法,但我还是要谢谢他给出了这么详细的代码。
    非常感谢各位的解答!