初始化过程
1). 对于地址簿(List Control)的初始化
地址簿对应的变量名为m_ListControl,变量类型为CListCtrl.
(CListCtrl是列表控件类,列表控件的每一行叫做一个item,每一列叫做一个subitem。每一行和每一列都有个ID号,可以确定唯一的单元格。)
该类中具有两个构建列表的方法:
m_pListCtrl->InsertColumn(0,"第一列");
列索引从0开始,InsertColumn函数将在列表中建立一个列,如果数据有三列,就调用三次此函数,索引分别是0,1,2。
m_pListCtrl->InsertItem(0,"第一行");
行索引从0开始,InsertColumn函数将在列表中建立一个行,如果数据有三行,就调用三次此函数,索引分别是0,1,2。
这里我们的初始化代码如下:
m_ListControl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);
m_ListControl.InsertColumn(1, _T("电话号码"), LVCFMT_LEFT, 100);
m_ListControl.InsertColumn(2, _T("群组"), LVCFMT_LEFT, 100);
2).对于群组进行初始化
群组对应的控件变量名为m_ComboGroup,变量类型为CComboBox.
群组对应的值变量名为m_sGroup,变量类型为CString.
这里我们的初始化代码如下:
m_ComboGroup.AddString(_T("朋友"));
m_ComboGroup.AddString(_T("同事"));
m_ComboGroup.AddString(_T("家人"));
m_ComboGroup.AddString(_T("同学"));
m_ComboGroup.AddString(_T("网友"));
m_sGroup = _T("朋友");
_T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式
3).对于文件的初始化
FileName = "";
(涉及到文件,在Experiment3Dlg.h中添加访问对象为pubilc,类型为CString,名称为FileName的变量)
4).UpdateData(FALSE);
(UpdateData(TRUE)的作用是将文本框界面值跟新到控件变量;
UpdateData(FALSE)的作用是将控件变量的值更新到界面中)
为按钮载入、保存、退出、新建、更新、删除添加事件处理程序
按钮 | 类 | 消息类型 | 函数名 |
---|
载入 | CExperiment3Dlg | BN_CLICKED | OnBnClickedButtonload |
保存 | CExperiment3Dlg | BN_CLICKED | OnBnClickedButtonsave |
退出 | CExperiment3Dlg | BN_CLICKED | OnBnClickedButtonexit |
新建 | CExperiment3Dlg | BN_CLICKED | OnBnClickedButtonnew |
更新 | CExperiment3Dlg | BN_CLICKED | OnBnClickedButtonupdata |
删除 | CExperiment3Dlg | BN_CLICKED | OnBnClickedButtondelete |
载入按钮的事件处理程序:
void CExperiment3Dlg::OnBnClickedButtonload()
{
// TODO: 在此添加控件通知处理程序代码
FileDialog.ShowOpen();
FileName = FileDialog.get_FileName();
try
{
book.LoadFile(FileName);
RefreshData(false);
}
catch (exception& e)
{
MessageBox(CString(e.what()),CString("Warning!"));
}
}
为了方便刷新数据,创建一个RefreshData函数:
void CExperiment3Dlg::RefreshData(bool fromDlgToBook)
{
// TODO: 在此处添加实现代码.
if (fromDlgToBook)
{
int Count = m_ListControl.GetItemCount(); //获取列表框的行数
CString sName, sNumber, sGroup;
string name, number, group;
if (Count > 0)
{
book.clear();
for (int index = 0; index < Count; index++)
{
sName = m_ListControl.GetItemText(index, 0);
sNumber = m_ListControl.GetItemText(index, 1);
sGroup = m_ListControl.GetItemText(index, 2);
name = string(CW2A(sName.GetString()));
number = string(CW2A(sNumber.GetString()));
group = string(CW2A(sGroup.GetString()));
book.AddContact(name, number, group);
}
}
?
}
else
{
int Count = book.getCount();
CString sName, sNumber, sGroup;
string name, number, group;
if (Count > 0)
{
m_ListControl.DeleteAllItems();
for (int index = 0; index < Count; index++)
{
book[index].getContact(name, number, group);
sName = CString(name.c_str());
sNumber = CString(number.c_str());
sGroup = CString(group.c_str());
m_ListControl.InsertItem(index, sName);
m_ListControl.SetItemText(index, 1, sNumber);
m_ListControl.SetItemText(index, 2, sGroup);
}
}
}
}
如果传入值为True,就把列表框中的数据更新到我们的vector中,如果传入值为False,就把vector中的数据更新到列表框中。
我们定义的这个函数其实有点类似于MFC自带的UpdateData函数(之前在初始化的时候用过),只不过UpdateData函数实现的是对话框中的数据和控件变量数据之间的更新,而我们这里定义的RefreshData函数,实现的是控件变量和vector容器之间的更新。
Tip: CW2A 将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W 将多字符集(ASCII)转化为宽字符集(Unicode)
为列表添加一个事件处理程序,消息类型为NM_CLICK.表示如果选中地址簿中的一行,可以将该行的数据更新到联系人中给用户看:
void CExperiment3Dlg::OnNMClickListcontrol(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
POSITION pos;
pos = m_ListControl.GetFirstSelectedItemPosition();
int index = m_ListControl.GetNextSelectedItem(pos);
if (index >= 0)
{
string name, number, group;
book[index].getContact(name, number, group);
m_sName = CString(name.c_str());
//m_sNumber
m_sNumber = CString(number.c_str());
m_sGroup = CString(group.c_str());
UpdateData(FALSE);
}
*pResult = 0;
}
保存按钮的事件处理程序:
void CExperiment3Dlg::OnBnClickedButtonsave()
{
// TODO: 在此添加控件通知处理程序代码
if (FileName.IsEmpty())
{
FileDialog.ShowSave();
FileName = FileDialog.get_FileName();
}
try
{
book.SaveFile(FileName);
}
catch (exception& e)
{
MessageBox(CString(e.what()), CString("Warning!"));
}
}
新建按钮的事件处理程序:
void CExperiment3Dlg::OnBnClickedButtonnew()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (!m_sName.IsEmpty())
{
int count = m_ListControl.GetItemCount();
m_ListControl.InsertItem(count, m_sName);
m_ListControl.SetItemText(count, 1, m_sNumber);
m_ListControl.SetItemText(count, 2, m_sGroup);
string name(CW2A(m_sName.GetString()));
string number(CW2A(m_sNumber.GetString()));
string group(CW2A(m_sGroup.GetString()));
book.AddContact(name, number, group);
m_sName = "";
m_sNumber = "";
m_sGroup = "朋友";
UpdateData(FALSE);
m_EditName.SetFocus();
}
}
退出按钮的事件处理程序:
void CExperiment3Dlg::OnBnClickedButtonexit()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
更新按钮的事件处理程序:
void CExperiment3Dlg::OnBnClickedButtonupdate()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
int position(m_ListControl.GetSelectionMark());
book[position].setContact(string(CW2A(m_sName.GetString())), string(CW2A(m_sNumber.GetString())), string(CW2A(m_sGroup.GetString())));
RefreshData(FALSE);
}
删除按钮的事件处理程序:
void CExperiment3Dlg::OnBnClickedButtondelete()
{
// TODO: 在此添加控件通知处理程序代码
int position(m_ListControl.GetSelectionMark());
book.Delete(position);
m_sName = "";
m_sNumber = "";
m_sGroup = "朋友";
UpdateData(FALSE);
RefreshData(FALSE);
}
排序按钮的事件处理程序:
void CExperiment3Dlg::OnBnClickedButtonsort()
{
book.sort();
RefreshData(FALSE);
}