本软件提供信息的输入以及图像的保存,不提供信息的保存的功能。
1.界面
其中,员工列表为Listbox Control空间,信息显示为List控件,右上方的图片显示为Picture控件。
2.List控件的各列的输入方式:
在OnInitDialog函数中添加如下代码:
m_list.InsertColumn(0,_T("姓名"),LVCFMT_LEFT, 80);
m_list.InsertColumn(1,_T("性别"),LVCFMT_LEFT, 80);
m_list.InsertColumn(2,_T("部门"),LVCFMT_LEFT, 80);
m_list.InsertColumn(3,_T("电话"),LVCFMT_LEFT, 80);
m_list.InsertColumn(4,_T("实习生"),LVCFMT_LEFT, 80);
m_list.InsertColumn(5,_T("照片地址"),LVCFMT_LEFT, 80);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
其中,m_list是List控件的变量。
3.性别选择的radio按钮,在判断哪个被选择时,要使用Grounp的概念,基于0。
4.部门选择的Combo-box控件,在判断是哪个部门被选择时,使用如下函数:
int index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
返回值为被选中列在表中的位置,基于0。
5.实习生的选择为复选框,控件的状态只有两种,0或1。
6.在List空间中插入不同的列:
((CListBox*)GetDlgItem(IDC_EMPLIST))->AddString(r.Name);//在List Box控件中增加员工的姓名。
int nCount=m_list.GetItemCount();//为了能够使每一个插入都在上次插入的后面,首先获取现在所拥有的行数。
m_list.InsertItem(nCount,r.Name);//想List控件中插入姓名,性别等记录。
m_list.SetItemText(nCount,1,r.Gender);
m_list.SetItemText(nCount,2,r.Depart);
m_list.SetItemText(nCount,3,r.Phone);
m_list.SetItemText(nCount,4,r.IsIntern);
m_list.SetItemText(nCount,5,r.Photo);
}
7.删除信息时,使用的List控件的返回值:
int nIdx1=m_list.GetSelectionMark();
if(nIdx1==-1)
{
AfxMessageBox(_T("请选中某一行!"));
}
else
m_list.DeleteItem(nIdx1);
emplist.DeleteString(nIdx1);
8.全部删除信息时,
m_list.DeleteAllItems();
emplist.ResetContent();
9.当在List空间中点击某一行时,将会显示出此员工的信息:
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(false);
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(false);//首先将性别的选中都取消
int nIdx2=emplist.GetCurSel();//获取选择的是哪一个员工
SetDlgItemText(IDC_EDIT1,m_list.GetItemText(nIdx2,0));//在IDC_EDIT1中显示出员工的姓名,保存在List控件的第一列中。使用List控件的GetItemText方法。
if(m_list.GetItemText(nIdx2,1)=="男")
{
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//将性别选择窗口处选中。
}
else
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(TRUE);
SetDlgItemText(IDC_COMBO1,m_list.GetItemText(nIdx2,2));
SetDlgItemText(IDC_EDIT2,m_list.GetItemText(nIdx2,3));
if(m_list.GetItemText(nIdx2,4)=="是")
{
((CButton *)GetDlgItem(IDC_CHECK1))->SetCheck(TRUE);//实习生选择的复选框处的处理。
}
else
((CButton *)GetDlgItem(IDC_CHECK1))->SetCheck(false);
10.点击上传图片时,调用对话框来选择路径,保存在PathName变量中,因为要在其他方法中使用,因此将其保存为全局变量。
CFileDialog fileDlg(TRUE);//建立打开对话框,如果参数为FALSE则为建立另存为对话框
fileDlg.m_ofn.lpstrTitle="打开";//设置对话框的标题
fileDlg.m_ofn.lpstrFilter="(*.bmp)\0*.bmp\0(*.jpg)\0*.jpg\0All Files(*.*)\0*.*\0\0";//设置对话框的过滤器。其中(*.bmp)为显示在对话框中的内容,*.bmp将相应后缀/////名的文件显示在对话框中
if(IDOK==fileDlg.DoModal())//如果在新建的对话框中选择的是确定按钮
{
PathName=fileDlg.GetPathName();//获取选择的文件的路径名
}
11.显示图片
CWnd *pWnd=GetDlgItem(IDC_PIC);//获取PICTURE控件窗口的句柄
CRect rect;
pWnd->GetClientRect(&rect);//获取PICTURE控件所在的矩形区域
CDC *pDC=pWnd->GetDC();
IStream *pStm;//创建一个流
CFileStatus fstatus;//创建文件状态变量
CFile file;
LONG cb; //存储图片字节数
IPicture *pPic;//IPicture接口可以显示jpg格式图像
if(file.Open(PathName,CFile::modeRead)&&file.GetStatus(PathName,fstatus)&&((cb=fstatus.m_size)!=-1))//判断图片是否打开成功
{
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);//分配全局存储空间 Handle to a global memory block.cb为图片文件的大小cb=fstatus.m_size,分配为图片文件大小//的内存
LPVOID pvData=NULL;//分配A 32-bit pointer to an unspecified type.
if(hGlobal!=NULL)
{
if((pvData=GlobalLock(hGlobal))!=NULL)//锁定分配内存块,返回的是内存的首地址。
{
file.Read(pvData,cb);//把文件读入内存缓冲区,
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);//创建流
}
}
}
//装载图像文件
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID *)&pPic)))
{
LONG hmWidth;
LONG hmHeight;
//获取图片的真实宽度
pPic->get_Width(&hmWidth);
//获取图片的真实高度
pPic->get_Height(&hmHeight);
pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL);//显示图片
pPic->Release();//释放控件资源
}
}