MFC——第四次上机

哇。。。这次是贼难。。贼复杂。。哎

在给控件们添加属性时,有一个问题碰到了,就是给
image.png

这个具有下拉菜单属性的控件添加下拉菜单内容时,需要在属性
image.png

中通过分号来间隔开不同行/菜单的内容。在给List Control更改为报表属性时通过


image.png

实现的。

2.
image.png

在这个的里边,第一句是设置树形控件的主题/风格属性,root为根节点,root1.2.3分别为其的子节点,然后在各自往下散开,形成一个树形。
0+ InsertItem()方法是用来添加节点的,第一个参数是添加的内容,第二个参数的意思是当前节点的父节点(也就是在其父节点往下添加一个子节点)

3.
image.png

第一句代码的意思是设置报表的属性。下边是添加报表的头表。向列表中插入显示列,第一个参数为第几个表项,第二个参数为标题,第三个是对齐方式,这里为左对齐,第四个参数为指定宽度,这里宽度为80;
  1. 在实现“Add”按钮的时候,我写的代码如下:
std::vector 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);
}
  1. 为树形控件增加Double Click事件。首先需要在类向导中选择


    image.png

    双击后在事件中添加代码如下:

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

你可能感兴趣的:(MFC——第四次上机)