C++通讯录程序
步骤
1.新建基于对话框的MFC程序
2.添加list control、5个button和1个editcontrol
3.为IDC_LIST1 添加m_list变量 IDC_EDIT1添加m_edit变量
4.在C…Dlg的OnInitDialog()函数中添加
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |=LVS_EX_FULLROWSELECT;// 网格线
m_edit.ShowWindow(SW_HIDE);
m_list.ModifyStyle (0,LVS_REPORT);
m_list.InsertColumn(0,_T("序号"),LVCFMT_CENTER,40,NULL);
m_list.InsertColumn(1,_T("姓名"),LVCFMT_CENTER,70,NULL);
m_list.InsertColumn(2,_T("电话"),LVCFMT_CENTER,150,NULL);
m_list.InsertColumn(3,_T("地址"),LVCFMT_CENTER,150,NULL);
m_list.SetExtendedStyle(dwStyle)
5.为5个按钮添加事件处理程序
//导入
try
{
char szFilters[] =
"Text File(*.txt)\0*.txt\0"
"C++ source file(*.h;*,hpp;*.cpp)\0*.h;*.hpp;*.cpp\0"
"All Typle(*.*)\0*.*\0"
"Lua source file(*.lua)\0*.lua\0"
"\0";
CFileDialog OpenDlg(TRUE);
OpenDlg.m_ofn.lpstrTitle = "Open File";
OpenDlg.m_ofn.lpstrFilter = szFilters;
if (IDOK == OpenDlg.DoModal())
{
CFile file;
CFileException e;
//构造文件,同时增加异常处理
if(!file.Open(OpenDlg.GetPathName(), CFile::modeRead,&e))
{
CString strErr;
strErr.Format(_T("File could not be opened %d\n"), e.m_cause);
MessageBox(strErr);
}
ULONGLONG nSize = file.GetLength();
char* pBuf = new char[nSize + 1];
memset(pBuf, 0, sizeof(char) * (nSize + 1));
file.Read(pBuf, nSize);
file.Close();
CString strText(pBuf);
LPCTSTR lpszToken1 = _T("\r\n");
LPCTSTR lpszToken2 = _T("\t ");
int curPos1 = 0;
int curPos2 = 0;
CString strLine(_T(""));
CString strCol(_T(""));
int nRow = 0;
int nCol = 0;
while(_T("") != (strLine = strText.Tokenize(lpszToken1, curPos1)))
{
m_list.InsertItem(nRow, _T(""));
curPos2 = 0;
nCol = 0;
while(_T("") != (strCol = strLine.Tokenize(lpszToken2, curPos2)))
{
m_list.SetItemText(nRow, nCol, strCol);
++nCol;
}
++nRow;
}
delete[] pBuf;
pBuf = NULL;
}
}
catch(CException* e)
{
e->ReportError();
e->Delete();
}
//保存
char szFilters[] =
"Text File(*.txt)\0*.txt\0"
"C++ source file(*.h;*,hpp;*.cpp)\0*.h;*.hpp;*.cpp\0"
"All Typle(*.*)\0*.*\0"
"Lua source file(*.lua)\0*.lua\0"
"\0";
//当过滤器或者默认构造参数赋值较少情况下,
//使用构造函数修改对话框初始状态可能更好,这过滤器较多
CFileDialog FileDlg(FALSE, "txt", _T("Test"));
FileDlg.m_ofn.lpstrTitle = "Save File";
FileDlg.m_ofn.lpstrFilter = szFilters;
if (IDOK == FileDlg.DoModal())
{
CFile file(FileDlg.GetPathName(),CFile::modeCreate|CFile::modeReadWrite);
const int COL_NUM = 4;
//得到表头文字
LVCOLUMNA column;
char szCol[50];
column.pszText=szCol;
column.cchTextMax=50;
column.mask=LVCF_TEXT;
for(int i=0;i<COL_NUM;i++)
{
m_list.GetColumn(i,&column);
file.Write(szCol,strlen(szCol));
file.Write("\t",1);
}
file.Write("\r\n",2);
//得到每一行数据
for(int i=0;i<m_list.GetItemCount();i++)
{
for(int j=0;j<COL_NUM;j++)
{
CString text = m_list.GetItemText(i,j);
text+="\t";
file.Write(text,text.GetLength());
}
file.Write("\r\n",2);
}
file.Close();
}
//删除
if(!m_list.GetItemCount())
{
MessageBox(_T("没有记录可删除"),_T("Error"),MB_ICONERROR|MB_OKCANCEL);
return;
}
int index=0;
index=m_list.GetNextItem(0,LVNI_SELECTED);
if(-1==index)
{
if(IDOK==MessageBox(_T("确定删除"),_T("Information"),MB_OKCANCEL))
{
m_list.DeleteItem(0);
}
}
else
{
if(IDOK==MessageBox(_T("确定删除"),_T("Information"),MB_OKCANCEL))
{
m_list.DeleteItem(index);
}
}
//编辑
if(!m_list.GetItemCount())
{
MessageBox(_T("没有记录可以修改"));
return;
}
CInputdlg dlg;
dlg.m_number=m_list.GetItemText(0,0);
dlg.m_name=m_list.GetItemText(0,1);
dlg.m_phone=m_list.GetItemText(0,2);
dlg.m_adress=m_list.GetItemText(0,3);
int index=0;
index=m_list.GetNextItem(0,LVNI_SELECTED);
if(-1==index)
{
dlg.m_number=m_list.GetItemText(0,0);
dlg.m_name=m_list.GetItemText(0,1);
dlg.m_phone=m_list.GetItemText(0,2);
dlg.m_adress=m_list.GetItemText(0,3);
if(dlg.DoModal())
{
m_list.SetItemText(0,0,dlg.m_number);
m_list.SetItemText(0,1,dlg.m_name);
m_list.SetItemText(0,2,dlg.m_phone);
m_list.SetItemText(0,3,dlg.m_adress);
}
}
else
{
dlg.m_number=m_list.GetItemText(index,0);
dlg.m_name=m_list.GetItemText(index,1);
dlg.m_phone=m_list.GetItemText(index,2);
dlg.m_adress=m_list.GetItemText(index,3);
if(dlg.DoModal())
{
m_list.SetItemText(index,0,dlg.m_number);
m_list.SetItemText(index,1,dlg.m_name);
m_list.SetItemText(index,2,dlg.m_phone);
m_list.SetItemText(index,3,dlg.m_adress);
}
}
//添加
CInputdlg dlg;
if(IDOK==dlg.DoModal())
{
m_list.InsertItem(0,dlg.m_number);
m_list.SetItemText(0,1,dlg.m_name);
m_list.SetItemText(0,2,dlg.m_phone);
m_list.SetItemText(0,3,dlg.m_adress);
}
6.新建一个对话框为其添加CInputdlg类
为CInputdlg类添加WM_SHOWWINDOW消息相应函数
为新建的对话框添加4个静态文本和四个编辑控件
//CInputdlg类头文件
afx_msg void OnOK();
CString m_name;
CString m_phone;
CString m_adress;
CString m_number;
//源文件
void CInputdlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_name);
DDX_Text(pDX, IDC_EDIT2, m_phone);
DDX_Text(pDX, IDC_EDIT3, m_adress);
DDX_Text(pDX, IDC_EDIT4, m_number);
}
void CInputdlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialogEx::OnShowWindow(bShow, nStatus);
// TODO: 在此处添加消息处理程序代码
GetDlgItem(IDC_EDIT4)->SetFocus();
}
void CInputdlg::OnOK()
{
//TODO:在此添加程序代码
UpdateData(TRUE);
GetDlgItem(IDC_EDIT4)->SetFocus();
CDialog::OnOK();
}