📄 persondatadlg.cpp
字号:
// PersonDataDlg.cpp : implementation file
//
#include "stdafx.h"
#include "PersonData.h"
#include "PersonDataDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPersonDataDlg dialog
CPersonDataDlg::CPersonDataDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPersonDataDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPersonDataDlg)
m_szBirth = _T("");
m_szEMail = _T("");
m_szHome = _T("");
m_szHomePhone = _T("");
m_szMobilePhone = _T("");
m_szName = _T("");
m_szOffice = _T("");
m_szOfficePhone = _T("");
m_szSex = _T("");
m_szTitle = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CPersonDataDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPersonDataDlg)
DDX_Control(pDX, IDC_PERSONLIST, m_PersonList);
DDX_Text(pDX, IDC_BIRTH, m_szBirth);
DDV_MaxChars(pDX, m_szBirth, 30);
DDX_Text(pDX, IDC_EMAIL, m_szEMail);
DDV_MaxChars(pDX, m_szEMail, 100);
DDX_Text(pDX, IDC_HOME, m_szHome);
DDV_MaxChars(pDX, m_szHome, 200);
DDX_Text(pDX, IDC_HOMEPHONE, m_szHomePhone);
DDV_MaxChars(pDX, m_szHomePhone, 20);
DDX_Text(pDX, IDC_MOBILEPHONE, m_szMobilePhone);
DDV_MaxChars(pDX, m_szMobilePhone, 30);
DDX_Text(pDX, IDC_NAME, m_szName);
DDV_MaxChars(pDX, m_szName, 50);
DDX_Text(pDX, IDC_OFFICE, m_szOffice);
DDV_MaxChars(pDX, m_szOffice, 200);
DDX_Text(pDX, IDC_OFFICEPHONE, m_szOfficePhone);
DDV_MaxChars(pDX, m_szOfficePhone, 30);
DDX_CBString(pDX, IDC_SEX, m_szSex);
DDX_Text(pDX, IDC_TITLE, m_szTitle);
DDV_MaxChars(pDX, m_szTitle, 50);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPersonDataDlg, CDialog)
//{{AFX_MSG_MAP(CPersonDataDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_DEL, OnDel)
ON_LBN_SELCHANGE(IDC_PERSONLIST, OnSelchangePersonlist)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_UPDATE, OnUpdate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPersonDataDlg message handlers
BOOL CPersonDataDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//打开文件
//用CFileDialog选取打开的文件
CFileDialog dlg(TRUE, NULL,NULL,OFN_ALLOWMULTISELECT);
if (dlg.DoModal()!=IDOK)
{
EndDialog(IDCANCEL); //取消则退出程序
}
if ( !m_File.Open( dlg.GetPathName(), CFile::modeCreate |
CFile::modeNoTruncate | CFile::modeReadWrite) )
{
//出错处理
MessageBox("无法打开文件,程序退出!","错误");
return FALSE;
}
//读取个人信息数据
int result;
PersonInfo pi;
while (result=m_File.Read(&pi,sizeof(PersonInfo)))
{
//在列表中添加人名
m_PersonList.AddString(pi.szName);
}
//如果没有列表项,禁用“更新”按钮
if (m_PersonList.GetCount()==0) {
GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE);
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CPersonDataDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CPersonDataDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPersonDataDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//=============================================================
// 函 数 名:OnAdd
// 功能描述:处理单击“添加”按钮的消息,用于添加新的个人信息
// 输入参数:无
// 返 回 值:无
// 创建日期:2004-9-15
// 修改日期:2004-9-15
// 作 者:文凯
// 附加说明:添加的新的个人信息里将姓名设置为“新名字”,其他项
// 均为空,需要修改更新
//==============================================================
void CPersonDataDlg::OnAdd()
{
// TODO: Add your control notification handler code here
//如果没有列表项,启用“更新”按钮
if (m_PersonList.GetCount()==0) {
GetDlgItem(IDC_UPDATE)->EnableWindow(TRUE);
}
//添加新的名字在列表中
m_PersonList.AddString("新名字");
m_PersonList.SetCurSel(m_PersonList.GetCount()-1);
//更新个人信息界面
m_szName = "新名字";
m_szBirth = "";
m_szSex = "男";
m_szTitle = "";
m_szOffice = "";
m_szOfficePhone = "";
m_szHome = "";
m_szHomePhone = "";
m_szMobilePhone = "";
m_szEMail = "";
UpdateData(FALSE);
//更新文件
UpdateFile(m_PersonList.GetCount()-1);
}
//=============================================================
// 函 数 名:UpdateFile
// 功能描述:向文件中更新个人信息
// 输入参数:PersonIndex(要更新的个人信息的条目序号)
// 返 回 值:无
// 创建日期:2004-9-15
// 修改日期:2004-9-15
// 作 者:文凯
// 附加说明:
//==============================================================
void CPersonDataDlg::UpdateFile(int PersonIndex)
{
//定位要修改的个人信息在文件中的位置
m_File.Seek((LONG)PersonIndex*sizeof(PersonInfo),CFile::begin );
//更新个人信息数据
UpdateData();
PersonInfo pi;
strcpy(pi.szName,m_szName);
if (m_szSex == "男" )
pi.nSex = 0;
else
pi.nSex = 1;
strcpy(pi.szBirth,m_szBirth);
strcpy(pi.szTitle,m_szTitle);
strcpy(pi.szOffice,m_szOffice);
strcpy(pi.szOfficePhone,m_szOfficePhone);
strcpy(pi.szHome,m_szHome);
strcpy(pi.szHomePhone,m_szHomePhone);
strcpy(pi.szMobilePhone,m_szMobilePhone);
strcpy(pi.szEMail,m_szEMail);
m_File.Write(&pi,sizeof(PersonInfo));
m_File.Flush();
}
//=============================================================
// 函 数 名:LoadPersonInfo
// 功能描述:根据PersonInfo结构更新界面的控件变量
// 输入参数:pi(输入的PersonInfo个人信息结构)
// 返 回 值:无
// 创建日期:2004-9-15
// 修改日期:2004-9-15
// 作 者:文凯
// 附加说明:
//==============================================================
void CPersonDataDlg::LoadPersonInfo(const PersonInfo &pi)
{
//更新界面
m_szName = pi.szName;
if (pi.nSex == 0)
m_szSex = "男";
else
m_szSex = "女";
m_szBirth = pi.szBirth;
m_szTitle = pi.szTitle;
m_szOffice = pi.szOffice;
m_szOfficePhone = pi.szOfficePhone;
m_szHome = pi.szHome;
m_szHomePhone = pi.szHomePhone;
m_szMobilePhone = pi.szMobilePhone;
m_szEMail = pi.szEMail;
UpdateData(FALSE);
}
//=============================================================
// 函 数 名:OnDel
// 功能描述:处理单击“删除”按钮的消息,用于删除个人信息
// 输入参数:无
// 返 回 值:无
// 创建日期:2004-9-15
// 修改日期:2004-9-15
// 作 者:文凯
// 附加说明:
//==============================================================
void CPersonDataDlg::OnDel()
{
// TODO: Add your control notification handler code here
//提示用户
if (MessageBox(
"删除数据后将无法挽回,确定删除?","提示",
MB_OKCANCEL) == IDCANCEL)
return;
//获得当前选项
int sel = m_PersonList.GetCurSel();
//删除文件中的个人信息
for (int i = sel; i < m_PersonList.GetCount()-1; i++)
{
PersonInfo pi;
m_File.Seek((LONG)(i+1)*sizeof(PersonInfo),CFile::begin);
m_File.Read(&pi,sizeof(PersonInfo));
m_File.Seek((LONG)i*sizeof(PersonInfo),CFile::begin);
m_File.Write(&pi,sizeof(PersonInfo));
}
m_File.Flush();
m_File.SetLength((LONG)(m_PersonList.GetCount()-1)*sizeof(PersonInfo));
//更改列表信息
m_PersonList.DeleteString(sel);
//如果没有列表项,禁用“更新”按钮
if (m_PersonList.GetCount()==0) {
GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE);
return;
}
if (sel<m_PersonList.GetCount())
m_PersonList.SetCurSel(sel);
else
m_PersonList.SetCurSel(sel-1);
OnSelchangePersonlist();
}
//=============================================================
// 函 数 名:OnSelchangePersonlist
// 功能描述:处理更改“选择人名”列表框中的选择产生的消息,用于
// 切换显示新选定的人的个人信息
// 输入参数:无
// 返 回 值:无
// 创建日期:2004-9-15
// 修改日期:2004-9-15
// 作 者:文凯
// 附加说明:
//==============================================================
void CPersonDataDlg::OnSelchangePersonlist()
{
// TODO: Add your control notification handler code here
//获得当前的选择
int sel = m_PersonList.GetCurSel();
//移动文件指针
m_File.Seek((LONG)sel*sizeof(PersonInfo), CFile::begin);
//从文件中读取数据
PersonInfo pi;
m_File.Read(&pi,sizeof(PersonInfo));
//更新界面
LoadPersonInfo(pi);
}
void CPersonDataDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
//关闭文件
m_File.Abort();
}
//=============================================================
// 函 数 名:OnUpdate
// 功能描述:处理单击“更新”按钮的消息,用于更新修改后的个人信息
// 输入参数:无
// 返 回 值:无
// 创建日期:2004-9-15
// 修改日期:2004-9-15
// 作 者:文凯
// 附加说明:
//==============================================================
void CPersonDataDlg::OnUpdate()
{
// TODO: Add your control notification handler code here
UpdateData();
//获得当前选项
int sel = m_PersonList.GetCurSel();
//更新数据
UpdateFile(sel);
//更改列表信息
m_PersonList.DeleteString(sel);
m_PersonList.InsertString(sel,m_szName);
m_PersonList.SetCurSel(sel);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -