⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 persondatadlg.cpp

📁 例程:个人信息录入系统PersonData 说明: 本例程打开一个对话框
💻 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 + -