我想从一个文件中读取其内容,然后将读取的内容传给树形控件,最终构成一个树形结构。请问应该怎样实现?
我是这样做的:
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;
}但没有成功,请各位多多指教!谢谢!
我是这样做的:
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;
}但没有成功,请各位多多指教!谢谢!
建议先把文件每一行读到数组里,再对应你的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();
}
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);
}
}
里的功能就是每次读取文本文件的一行内容,加载到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;
}
虽然我没有用到 sj971059(sj971059)提供的方法,但我还是要谢谢他给出了这么详细的代码。
非常感谢各位的解答!