我是 Visual Studio MFC 的新手。我迫切需要创建一个小型应用程序。我需要帮助我坚持这个问题我有一个包含以下数据的文本文件。A-A1,A2 其中 A 是根节点,A1 A2 是子节点。我的要求是我需要创建一个 SDI MFC 应用程序。我需要像当我转到 File->Open->"xxx.txt"(包含上述数据)时,它必须以 A |_ A1 |_ A2 (TREE VIEW) 之类的格式显示。我经历了许多教程,比如它需要被标记化等。我真的很困惑,比如如何继续等等。我只使用基于 dailog 并且我是 SDI 的新手。任何帮助表示赞赏。提前致谢。
2 回答
从我可以从评论中收集到的问题以及 Codeproject 中链接的相同问题,我将尝试提供一些帮助,但鉴于问题的普遍性,答案可能也不会很具体。
首先,如果你想有一个树视图显示,你需要你的视图类是一个 CTreeView。CTreeView 是具有嵌入式CTreeCtrl的 CView 。CEditView 是带有嵌入式 CEdit 的 CView,因此显示文本(如文本编辑器或类似的东西)很有用。普通的 CView 不支持任何特殊类型的内容,因此您必须自己“绘制”它。
现在,要在视图中显示某些内容,您必须告诉它显示它。仅仅读取文件是不行的。你必须积极地展示它。通常,您会将文件中的数据读取到某种结构中,然后从那里显示出来。或者您可以将数据直接存储在树中,这取决于。无论如何,你需要学习使用 CTreeView/CTreeCtrl。基本上,使用CTreeCtrl::InsertItem添加元素。
至于标记化,我不确定我是否理解你的格式,但我想我会为根节点和子节点使用不同的分隔符。所以如果你有 ROOT-Child1,Child2,我会做类似的事情:
int pos = 0;
CString strRoot = strLine.Tokenize(_T("-"), pos);
// do something with strRoot, like store it or display it in the tree
while (pos != -1)
{
CString strChild;
strChild = strLine.Tokenize(_T(","), pos);
// do something with strChild, like store it or display it in the tree
}
最后,在使用 Doc/View 架构时,要走的路是将数据与其显示分开。因此,您通常会将数据保存在文档中,并在那里执行所有打开/保存操作,然后使用 GetDocument 从视图访问文档中的数据以显示它。有时,在视图中包含实时数据可能是有意义的,但这不是通常的做法。在这种情况下,将其改为基于对话框的应用程序甚至可能是有意义的。
基本上我曾在基于 dailog 的应用程序中使用 CTreeCtrl,但这是我第一次在 SDI 中工作。我真的很感谢你为我提供了这样的解决方案。我开发了一小段代码看看
void CFileView::OnFileOpen()
{
// TODO: Add your command handler code here
CString pathname,strLine;
CStdioFile File;
if(File.Open(pathname, CFile::modeRead)) // Open to read
{
while(File.ReadString(strLine)) // Read file
{
int Position = 0;
CString Token;
Token = strLine.Tokenize(_T("-:,"), Position);
HTREEITEM hRoot = m_wndFileView.InsertItem(Token, 0, 0);
while(Token!="")
{
Token = strLine.Tokenize(_T("-:,"), Position);
HTREEITEM hSrc = m_wndFileView.InsertItem(Token, 0, 0, hRoot);
}
}
}
}
就像我的观点是我是否将我的代码放在正确的函数中?即我们打开文件的地方。因为在客户端窗口中我没有得到任何东西,而是一个空白窗口。SDI 基于 CTreeView 类。我现在对标记器和树控制部分很清楚,但现在我很困惑为什么我根本没有在客户端窗口中得到任何东西:(