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);
}