MFC4 基本对话框的使用(四)树形控件、列表框、列表控件

要求:添加学生信息并显示在树形控件中;双击树形控件的叶子结点,将学生信息显示在List Control 中;在列表框中显示添加、清空、双击操作的操作记录,并添加删除操作记录的功能。

一、界面设计

修改Combo Box的Data属性,每一项以英文分号分隔。

修改LIstControl的view属性,改为report(报表)

修改List Box的Selection属性,如果要求只能单行删除列表框的数据,设置成Single,要求能一次删除多项数据,设置成Multiple

二、添加变量

三、初始化

在Dlg.cpp中的初始化函数OnInitDialog里添加代码,设置树形控件和可视化列表框的外观

	this->m_TreeCon.ModifyStyle(0, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);

	///强制类型转换


	root = this->m_TreeCon.InsertItem((CString)"年级");///根节点
	root1 = this->m_TreeCon.InsertItem((CString)"一年级", root);
	root2 = this->m_TreeCon.InsertItem((CString)"二年级", root);
	root3 = this->m_TreeCon.InsertItem((CString)"三年级", root);
	m_TreeCon.Expand(root, TVE_EXPAND);///展开当前父节点和三个子节点

	m_Inquiry.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE);
	m_Inquiry.InsertColumn(0, (CString)"姓名", LVCFMT_LEFT, 80);///插入第0列,宽度80
	m_Inquiry.InsertColumn(1, (CString)"学号", LVCFMT_LEFT, 90);
	m_Inquiry.InsertColumn(2, (CString)"年级", LVCFMT_LEFT, 80);
	m_Inquiry.InsertColumn(3, (CString)"Sub1", LVCFMT_LEFT, 85);
	m_Inquiry.InsertColumn(4, (CString)"Sub2", LVCFMT_LEFT, 85);
	m_Inquiry.InsertColumn(5, (CString)"Sub3", LVCFMT_LEFT, 85);
	m_Inquiry.InsertColumn(6, (CString)"Average", LVCFMT_LEFT, 85);///平均分

到目前为止,root、root1、root2、root3还没有定义,我们把它们定义为全局变量。

在Dlg.h 中添加定义:

HTREEITEM root, root1, root2, root3;

四、add

要求点击add向树形控件添加节点,向列表框添加操作记录

首先我们需要定义一个新类,将输入的学生信息储存下来,以备后续使用。

在Dlg.cpp中定义新类Student (在add控件代码前就好):

class Student : public CDialogEx
{
    public:
	CString name;
	CString ID;
	CString grade;
	double sub1;
	double sub2;
	double sub3;
	double aver;
}st[100010];

int tot = 0;///计数

双击add按钮,添加操作:

void COOPEx4Dlg::OnBnClickedadd()
{
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(true);///实时更新

	++tot;///学生数++

	CString s;
	m_Grade.GetLBText(m_Grade.GetCurSel(), s);///获取ComboBox中的年级选项

	if (s == "一年级")
	{
		m_TreeCon.InsertItem(m_Name, root1);///在root1下添加叶子节点
		m_TreeCon.Expand(root1, TVE_EXPAND);///将刚添加的这一层展开
		st[tot].grade =(CString)"一年级";///存储
	}
	else if (s == "二年级")
	{
		m_TreeCon.InsertItem(m_Name, root2);
		m_TreeCon.Expand(root2, TVE_EXPAND);
		st[tot].grade = (CString)"二年级";
	}
	else if (s == "三年级")
	{
		m_TreeCon.InsertItem(m_Name, root3);
		m_TreeCon.Expand(root3, TVE_EXPAND);
		st[tot].grade = (CString)"三年级";
	}

        ///存储
	st[tot].ID = m_ID;
	st[tot].name = m_Name;
	st[tot].sub1 = m_Sub1;
	st[tot].sub2 = m_Sub2;
	st[tot].sub3 = m_Sub3;
	st[tot].aver = 1.0*(m_Sub1 + m_Sub2 + m_Sub3) / 3.0;

        //获取系统时间   
	CString str;
	CTime time;
	time = CTime::GetCurrentTime();
	str = time.Format("%X DATA ADD");
	m_Log.AddString(str);///显示在列表框里(下面那个大白框)

	UpdateData(false);
}

五、Reset

要求通过“Reset”按钮,实现向数据输入区的数据初始值重置功能。

即通过点击“ReSet”按钮,使得数据输入区的所有内容恢复到初始状态。

双击Reset,添加操作:

void COOPEx4Dlg::OnBnClickedreset()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);

	m_ID = _T("");
	m_Name = _T("");
	m_Sub1 = 0;
	m_Sub2 = 0;
	m_Sub3 = 0;

	m_Grade.SetCurSel(-1);

	CString str; //获取系统时间   
	CTime time;
	time = CTime::GetCurrentTime();
	str = time.Format("%X DATA RESET");
	m_Log.AddString(str);///将该操作显示在列表框中

	UpdateData(false);
}

七、双击树形控件 显示学生信息

要求:为树形控件增加Double Click事件。通过双击叶子节点,在list Control控件中将选中的节点的详细数据显示出来。

右键树形控件,添加事件处理程序,选择“NM_DBLCLK”,编辑代码

添加代码:

void COOPEx4Dlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	*pResult = 0;

	CString tmp = m_TreeCon.GetItemText(m_TreeCon.GetSelectedItem());///获取当前选中的人名

	for (int i = 1; i <= tot; i++)///遍历查询
	{
		if (st[i].name == tmp)///将该学生的详细信息显示出来
		{
			m_Inquiry.InsertItem(0, st[i].name);///先插入一行,默认从0开始,否则下面不能插入文本
			m_Inquiry.SetItemText(0, 1, st[i].ID);
			m_Inquiry.SetItemText(0, 2, st[i].grade);

			CString str;
			str.Format(_T("%lf"), st[i].sub1);
			m_Inquiry.SetItemText(0, 3, str);

			str.Format(_T("%lf"), st[i].sub2);
			m_Inquiry.SetItemText(0, 4, str);

			str.Format(_T("%lf"), st[i].sub3);
			m_Inquiry.SetItemText(0, 5, str);

			str.Format(_T("%lf"), st[i].aver);
			m_Inquiry.SetItemText(0, 6, str);

			break;
		}

	}

	CString str; //获取系统时间   
	CTime time;
	time = CTime::GetCurrentTime();
	str = time.Format("%X TREE DOUBLE CHICKED");
	m_Log.AddString(str);///向列表框中添加操作记录

	UpdateData(false);
}

八、clear

要求选中一个或多个列表项,单击clear可以删除

双击clear,添加代码

void COOPEx4Dlg::OnBnClickedclear()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);

	int cnt = m_Log.GetSelCount();///当前选中了多少项
	int *id = new int[cnt];///开个数组存这些选中项的地址,首先获取第一项的地址
	memset(id, -1, sizeof(int)*cnt);///清空地址数组

	m_Log.GetSelItems(cnt, id);///获取其他所有地址

	for (int i = cnt-1; i >=0; i--)///遍历这些列表项
	{
		m_Log.DeleteString(id[i]);///将它们删除
	}
	delete[] id;///释放

	UpdateData(false);
}

九、结果图

全部评论

相关推荐

牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 12:10
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务