哇。。。这次是贼难。。贼复杂。。哎
这个具有下拉菜单属性的控件添加下拉菜单内容时,需要在属性
中通过分号来间隔开不同行/菜单的内容。在给List Control更改为报表属性时通过
实现的。
在这个的里边,第一句是设置树形控件的主题/风格属性,root为根节点,root1.2.3分别为其的子节点,然后在各自往下散开,形成一个树形。
0+ InsertItem()方法是用来添加节点的,第一个参数是添加的内容,第二个参数的意思是当前节点的父节点(也就是在其父节点往下添加一个子节点)
第一句代码的意思是设置报表的属性。下边是添加报表的头表。向列表中插入显示列,第一个参数为第几个表项,第二个参数为标题,第三个是对齐方式,这里为左对齐,第四个参数为指定宽度,这里宽度为80;
- 在实现“Add”按钮的时候,我写的代码如下:
std::vector<Student> students;
Student student;
void COOPEx4_sDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true); //用于更新控件
CString text; //获取combo控件选择的菜单文本
HTREEITEM root1_name,root2_name,root3_name; //添加的三个年级的树节点
m_Grade.GetLBText(m_Grade.GetCurSel(), text); //通过.GetCurSel()获取选中项,然后GetLBText()将文本Copy到text
if (text == "Second"&&m_Name!=""){ //如果选中的是二年级且姓名不为空
root2_name = this->m_TreeCon.InsertItem(m_Name, root2); //往树里边添加子节点,其父节点为root2
m_TreeCon.Expand(root, TVE_EXPAND); //展开根节点root
m_TreeCon.Expand(root2, TVE_EXPAND); //展开节点root2
student.grade = (CString)"二年级"; //往学生对象数据内赋值
}
else if (text == "Third"&&m_Name != ""){ //下边同之。。。
root3_name = this->m_TreeCon.InsertItem(m_Name, root3);
m_TreeCon.Expand(root, TVE_EXPAND);
m_TreeCon.Expand(root3, TVE_EXPAND);
student.grade = (CString)"三年级";
}
else if (m_Name != ""){ //这里有个问题,combo控件对于第一个菜单文本好像没法获取,或者默认为第一,无法用来比较,就用了一个这种方式
root1_name = this->m_TreeCon.InsertItem(m_Name, root1);
m_TreeCon.Expand(root, TVE_EXPAND);
m_TreeCon.Expand(root1, TVE_EXPAND);
student.grade = (CString)"一年级";
}
student.ID = m_ID; //赋值
student.name =_Sub1;
student.sub2 = m_Sub2;
student.sub3 = m_Sub3;m_Name;
student.sub1 = m
student.push_back(student);
length++; //定义了一个用来记录学生对象数量的变量(全局)
//打印日志
CString m_time = getTime();
CString str = m_time + (CString)" DATA ADD";
m_Log.AddString(str);
}
5.在实现“Reset”功能时代码如下:
void COOPEx4_sDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
m_ID = "";
m_Name = "";
m_Sub1 = 0;
m_Sub2 = 0;
m_Sub3 = 0;
UpdateData(false);
//打印日志
CString m_time = getTime();
CString str = m_time + (CString)" DATA RESET";
m_Log.AddString(str);
}
-
为树形控件增加Double Click事件。首先需要在类向导中选择
双击后在事件中添加代码如下:
void COOPEx4_sDlg::OnDblclkTree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
int line = 0, row = 0,num=0;//行 列
CString Sub1, Sub2, Sub3,Ary,x,test; //三门成绩,平均数,选中树节点的文本
//num=m_TreeCon.GetSelectedCount();
x = m_TreeCon.GetItemText(m_TreeCon.GetSelectedItem()); //获取选中树节点的文本
//防止crush
if (x!= "年级"){ //防止双击啥都没有的年纪节点会出现crush的现象
for (; num <= length; num++){ //遍历找到与双击节点姓名相同的学生对象(避免姓名重复,没做解决)
if (x == students[num].name)
break;
}
Sub1.Format(_T("%f"), students[num].sub1); //强制类型转换,将成绩的double转化为CString
Sub2.Format(_T("%f"), students[num].sub2);
Sub3.Format(_T("%f"), students[num].sub3);
Ary.Format(_T("%f"), ((students[num].sub1 + students[num].sub2 + students[num].sub3) / 3));
for (int i = 0; i <= line; i++)
{
m_Inquiry.InsertItem(line, (CString)""); //向报表中添加项
for (row; row <= 6; row++)
{
switch (row)
{
case 0:
m_Inquiry.SetItemText(line, row, students[num].name);
break;
case 1:
m_Inquiry.SetItemText(line, row, students[num].ID);
break;
case 2:
m_Inquiry.SetItemText(line, row, students[num].grade);
break;
case 3:
m_Inquiry.SetItemText(line, row, Sub1);
break;
case 4:
m_Inquiry.SetItemText(line, row, Sub2);
break;
case 5:
m_Inquiry.SetItemText(line, row, Sub3);
break;
case 6:
m_Inquiry.SetItemText(line, row, Ary);
break;
default:
break;
}
}
}
*pResult = 0;
}
//打印日志
CString m_time = getTime();
CString str = m_time + (CString)" TREE DOUBLE CLICK";
m_Log.AddString(str);
}
7.在实习打印报表的时候,我自定义了一个getTime()方法用来获取当前系统时间,然后返回结果
CString getTime(){
CTime m_time;
m_time = CTime::GetCurrentTime(); //获取当前时间日期
return m_time.Format(_T("%Y-%m-%d %H:%M:%S %A")); //格式化日期时间
}
在具体打印的时候这么使用:
//打印日志 CString m_time = getTime(); CString str = m_time + (CString)" TREE DOUBLE CLICK"; m_Log.AddString(str);