列表控件显示的内容除了在OnInitDialog里设置外,能不能在自定义的函数中实现?

qq_41674120 2018-04-20 03:19:33
用MFC做一个界面,用到了列表控件,因为要让列表的内容根据不同的选择而有所变化,所以想要自己定义一个函数而不是在OnInitDialog函数中直接加,但是现在发现如果不在OnInitDialog函数中加,整个列表控件的内容是空的,如图1所示。只有当在OnInitDialog函数中直接加时,列表控件才有内容,如图2所示。但是,此时列表控件虽然有内容,却并不能实现让列表的内容根据不同的选择而有所变化,该怎么解决呢?

图1

图2
...全文
1534 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
schlafenhamster 2018-05-25
  • 打赏
  • 举报
回复
用 笔记本 写一个 TreePath.txt 内容 如下: R R\C1 R\C1\G1 R\C1\G2 R\C2 R\C2\G1 R\C2\G2 R\C2\G2\X1 读文件

// in ".h"
//	CString m_TreePath;
//	HTREEITEM m_hTiFound;
void CTreeCtrlDlg::OnButton1() 
{// read Tree Path
	m_TreeCtrl.DeleteAllItems();
//
	CStdioFile f;
	f.Open("TreePath.txt",CFile::modeRead);
	CString tmp;
	while(f.ReadString(tmp))
	{
		if(tmp.IsEmpty()) continue;
		int at=tmp.ReverseFind('\\');
		if(at==-1)
		{
			if(m_TreeCtrl.GetRootItem())
			{// has a root !
				AfxMessageBox(tmp + " can't be a Second root item,only one root item allowed!");
			}
			else
			{
				HTREEITEM hroot=m_TreeCtrl.InsertItem(tmp,6,0,TVI_ROOT);
				//afxDump << m_TreeCtrl.GetItemText(hroot) << "\n";
			}
			continue;
		}
		else
		{
			CString tmpPath=tmp.Left(at);
			at++;
			CString tmpInsert=tmp.Right(tmp.GetLength()-at);
			m_hTiFound=0;
			FindTreeItem(0,tmpPath);
			if(m_hTiFound)
			{
				m_TreeCtrl.InsertItem(tmpInsert,6,0,m_hTiFound);
			}
			else
			{
				AfxMessageBox(tmpPath + " Tree path not found !");
			}
		}
	}
	f.Close();
}
写 文件

//
void  CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent,CStdioFile &file)
{
	HTREEITEM hChild;
	CString str;
// enter all child
	if(hParent==0)	hChild=m_TreeCtrl.GetRootItem();
	else			hChild=m_TreeCtrl.GetChildItem(hParent);
//
	while (hChild)
	{// need path
		GetTreePath(hChild);
		m_TreePath += "\n";
		if(file) file.WriteString((LPCSTR)m_TreePath);
		if(m_TreeCtrl.ItemHasChildren(hChild)) WalkTreeCtrl(hChild,file);
		hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
	}
}
////////////////////////////////
void CTreeCtrlDlg::OnButton2() 
{// save tree path to txt
	CStdioFile f;
	f.Open("TreePath1.txt",CFile::modeCreate | CFile::modeWrite);
	WalkTreeCtrl(0,f);
	f.Close();
}

qq_41674120 2018-05-25
  • 打赏
  • 举报
回复
引用 42 楼 schlafenhamster 的回复:
你的那个 txt 格式 是 累赘 的,不 直接。
那应该怎么写呢?我的意思是在不改动代码的前提下,能够修改树形控件的结构,通过修改配置文件的方法
schlafenhamster 2018-05-24
  • 打赏
  • 举报
回复
你的那个 txt 格式 是 累赘 的,不 直接。
schlafenhamster 2018-05-24
  • 打赏
  • 举报
回复
"只需要改变txt文本文件就能实现" 按上面的 格式 写 Txt 文件, 保存时 使用 给你的 void CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent) (即 16 楼的 代码)
schlafenhamster 2018-05-24
  • 打赏
  • 举报
回复

//
void  CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent)
{
	HTREEITEM hChild;
	CString str;
// enter all child
	if(hParent==0)	hChild=m_TreeCtrl.GetRootItem();
	else			hChild=m_TreeCtrl.GetChildItem(hParent);
//
	while (hChild)
	{
#if 1  // need path
		GetTreePath(hChild);
		afxDump << m_TreePath << "\n";//  在这里把 path 写入 TXT文件 !
#else  // no path
		str=m_TreeCtrl.GetItemText(hChild);
		// output 
//		afxDump << str << "\n";
#endif
		if(m_TreeCtrl.ItemHasChildren(hChild)) WalkTreeCtrl(hChild);
		hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
	}
}
qq_41674120 2018-05-24
  • 打赏
  • 举报
回复
“CStringArray aStr; aStr.Add("R"); aStr.Add("R\\C1"); aStr.Add("R\\C2"); aStr.Add("R\\C1\\G1"); aStr.Add("R\\C1\\G2"); aStr.Add("R\\C2\\G2");” 这个怎么和我的txt文本文件结合使用呢? 就是当我想要改变树的分支情况时,只需要改变txt文本文件就能实现,不用改动代码?
qq_41674120 2018-05-24
  • 打赏
  • 举报
回复
引用 37 楼 qq_41674120 的回复:
[quote=引用 36 楼 schlafenhamster 的回复:]
// in ".h" 在 CTreeCtrlDlg 头文件中 定义。
// CString m_TreePath;
// HTREEITEM m_hTiFound;

m_TreePath 即路径
m_hTiFound Tree Item Found


aStr.Add("R\\C1"); 会被分成 2部分
m_TreePath=“R”;
所以 FindTreeItem 找文字为 “R”的 m_hTiFound ,如果 找到 则 插入 “C1”
要插入的 是 “C1”

这样 定义的 txt 只要 保证 路径 存在 就可 插入, 后插入 的 项 在 txt 中的 位置 比较随意 。

按你这个怎么只有一个R出来,没有C1,C2。。。呢?麻烦啦!
[/quote]
哈哈哈,忘了加“m_TreeCtrl.ModifyStyle(NULL,TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);”这个!
qq_41674120 2018-05-24
  • 打赏
  • 举报
回复
引用 36 楼 schlafenhamster 的回复:
// in ".h" 在 CTreeCtrlDlg 头文件中 定义。
// CString m_TreePath;
// HTREEITEM m_hTiFound;

m_TreePath 即路径
m_hTiFound Tree Item Found


aStr.Add("R\\C1"); 会被分成 2部分
m_TreePath=“R”;
所以 FindTreeItem 找文字为 “R”的 m_hTiFound ,如果 找到 则 插入 “C1”
要插入的 是 “C1”

这样 定义的 txt 只要 保证 路径 存在 就可 插入, 后插入 的 项 在 txt 中的 位置 比较随意 。

按你这个怎么只有一个R出来,没有C1,C2。。。呢?麻烦啦!
schlafenhamster 2018-05-23
  • 打赏
  • 举报
回复
补 一个

//
void CTreeCtrlDlg::GetTreePath(HTREEITEM hItem)
{
	CString Path;
	CString tmp;
    while (hItem)
	{
		tmp=m_TreeCtrl.GetItemText(hItem);
		Path=tmp+"\\"+Path;
// get parent
		hItem=m_TreeCtrl.GetParentItem(hItem);
	}
// delete last '\'
	if(Path.Right(1)=="\\") Path=Path.Left(Path.GetLength()-1);
// output Path
//	afxDump << Path << "\n";
	m_TreePath=Path;
	return;
}
schlafenhamster 2018-05-23
  • 打赏
  • 举报
回复
C=child G=grandSon
schlafenhamster 2018-05-23
  • 打赏
  • 举报
回复
给你 写了一个

// in ".h"
//	CString m_TreePath;
//	HTREEITEM m_hTiFound;
void CTreeCtrlDlg::OnButton1() 
{
	m_TreeCtrl.DeleteAllItems();
//
	CStringArray aStr;
	aStr.Add("R");
	aStr.Add("R\\C1");
	aStr.Add("R\\C2");
	aStr.Add("R\\C1\\G1");
	aStr.Add("R\\C1\\G2");
	aStr.Add("R\\C2\\G2");
//
	for(int i=0;i<aStr.GetSize();i++)
	{// 
		CString tmp=aStr[i];
		int at=tmp.ReverseFind('\\');
		if(at==-1)
		{
			m_TreeCtrl.InsertItem(tmp,6,0,TVI_ROOT);
			continue;
		}
		else
		{
			CString tmpPath=tmp.Left(at);
			at++;
			CString tmpInsert=tmp.Right(tmp.GetLength()-at);
			m_hTiFound=0;
			FindTreeItem(0,tmpPath);
			if(m_hTiFound)
			{
				m_TreeCtrl.InsertItem(tmpInsert,6,0,m_hTiFound);
			}
			else
			{
				AfxMessageBox("Tree path not found !");
			}
		}
	}
}
// not return anything !
void CTreeCtrlDlg::FindTreeItem(HTREEITEM hParent,CString &SearchPath)
{
	HTREEITEM hChild;
// enter all child
	if(hParent==0)	hChild=m_TreeCtrl.GetRootItem();
	else			hChild=m_TreeCtrl.GetChildItem(hParent);
//
	while (hChild)
	{
		GetTreePath(hChild);
		if(SearchPath==m_TreePath)
		{
			m_hTiFound=hChild;// global !
			break;
		}
		if(m_TreeCtrl.ItemHasChildren(hChild)) FindTreeItem(hChild,SearchPath);
		hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
	}
}
qq_41674120 2018-05-23
  • 打赏
  • 举报
回复
引用 30 楼 schlafenhamster 的回复:
其实就是 用 path 找到 那个 要 插入 的 hTreeItem
可以说得详细一点儿吗?或者是给我给一段代码看看,谢谢啦!
schlafenhamster 2018-05-23
  • 打赏
  • 举报
回复
// in ".h" 在 CTreeCtrlDlg 头文件中 定义。 // CString m_TreePath; // HTREEITEM m_hTiFound; m_TreePath 即路径 m_hTiFound Tree Item Found 如 aStr.Add("R\\C1"); 会被分成 2部分 m_TreePath=“R”; 所以 FindTreeItem 找文字为 “R”的 m_hTiFound ,如果 找到 则 插入 “C1” 要插入的 是 “C1” 这样 定义的 txt 只要 保证 路径 存在 就可 插入, 后插入 的 项 在 txt 中的 位置 比较随意 。
qq_41674120 2018-05-23
  • 打赏
  • 举报
回复
引用 32 楼 schlafenhamster 的回复:
给你 写了一个

// in ".h"
//	CString m_TreePath;
//	HTREEITEM m_hTiFound;
void CTreeCtrlDlg::OnButton1() 
{
	m_TreeCtrl.DeleteAllItems();
//
	CStringArray aStr;
	aStr.Add("R");
	aStr.Add("R\\C1");
	aStr.Add("R\\C2");
	aStr.Add("R\\C1\\G1");
	aStr.Add("R\\C1\\G2");
	aStr.Add("R\\C2\\G2");
//
	for(int i=0;i<aStr.GetSize();i++)
	{// 
		CString tmp=aStr[i];
		int at=tmp.ReverseFind('\\');
		if(at==-1)
		{
			m_TreeCtrl.InsertItem(tmp,6,0,TVI_ROOT);
			continue;
		}
		else
		{
			CString tmpPath=tmp.Left(at);
			at++;
			CString tmpInsert=tmp.Right(tmp.GetLength()-at);
			m_hTiFound=0;
			FindTreeItem(0,tmpPath);
			if(m_hTiFound)
			{
				m_TreeCtrl.InsertItem(tmpInsert,6,0,m_hTiFound);
			}
			else
			{
				AfxMessageBox("Tree path not found !");
			}
		}
	}
}
// not return anything !
void CTreeCtrlDlg::FindTreeItem(HTREEITEM hParent,CString &SearchPath)
{
	HTREEITEM hChild;
// enter all child
	if(hParent==0)	hChild=m_TreeCtrl.GetRootItem();
	else			hChild=m_TreeCtrl.GetChildItem(hParent);
//
	while (hChild)
	{
		GetTreePath(hChild);
		if(SearchPath==m_TreePath)
		{
			m_hTiFound=hChild;// global !
			break;
		}
		if(m_TreeCtrl.ItemHasChildren(hChild)) FindTreeItem(hChild,SearchPath);
		hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
	}
}
请问一下,m_TreePath和m_hTiFound代表什么,在哪定义?
qq_41674120 2018-05-22
  • 打赏
  • 举报
回复
Root 0 0 A 1 0 B1 2 1 B2 3 1 B3 4 1 C1 5 2 C2 6 2 C4 7 3 C6 8 3 C7 9 4 C8 10 4
qq_41674120 2018-05-22
  • 打赏
  • 举报
回复
0 Root A 1 A B1 1 A B2 1 A B3 2 B1 C1 2 B1 C2 2 B2 C4 2 B2 C6 2 B3 C7 2 B3 C8
qq_41674120 2018-05-22
  • 打赏
  • 举报
回复
1 A 0 2 B1 1 3 B2 1 4 B3 1 5 C1 2 6 C2 2 7 C4 3 8 C6 3 9 C7 4 10 C8 4
加载更多回复(26)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧