-1

我是 Visual Studio MFC 的新手。我迫切需要创建一个小型应用程序。我需要帮助我坚持这个问题我有一个包含以下数据的文本文件。A-A1,A2 其中 A 是根节点,A1 A2 是子节点。我的要求是我需要创建一个 SDI MFC 应用程序。我需要像当我转到 File->Open->"xxx.txt"(包含上述数据)时,它必须以 A |_ A1 |_ A2 (TREE VIEW) 之类的格式显示。我经历了许多教程,比如它需要被标记化等。我真的很困惑,比如如何继续等等。我只使用基于 dailog 并且我是 SDI 的新手。任何帮助表示赞赏。提前致谢。

4

2 回答 2

0

从我可以从评论中收集到的问题以及 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 从视图访问文档中的数据以显示它。有时,在视图中包含实时数据可能是有意义的,但这不是通常的做法。在这种情况下,将其改为基于对话框的应用程序甚至可能是有意义的。

于 2013-03-27T08:41:15.377 回答
0

基本上我曾在基于 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 类。我现在对标记器和树控制部分很清楚,但现在我很困惑为什么我根本没有在客户端窗口中得到任何东西:(

于 2013-03-28T05:35:36.007 回答