继续吕鑫VS2015的MFC类封装原理学习:

前面已经介绍过了,这一节实现一个员工管理系统中的数据管理和显示。

看一下代码:

// workDlg.cpp : 实现文件
//#include "stdafx.h"
#include "work.h"
#include "workDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CworkDlg 对话框CworkDlg::CworkDlg(CWnd* pParent /*=NULL*/): CDialogEx(CworkDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_bModify = FALSE;//被修改false
}void CworkDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CworkDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CworkDlg::OnBnClickedOk)ON_BN_CLICKED(IDCANCEL, &CworkDlg::OnBnClickedCancel)ON_BN_CLICKED(IDC_ADD, &CworkDlg::OnBnClickedAdd)ON_BN_CLICKED(IDC_DEL, &CworkDlg::OnBnClickedDel)ON_BN_CLICKED(IDC_MODIFY, &CworkDlg::OnBnClickedModify)ON_BN_CLICKED(IDC_LOAD, &CworkDlg::OnBnClickedLoad)ON_BN_CLICKED(IDC_SAVE, &CworkDlg::OnBnClickedSave)
END_MESSAGE_MAP()// CworkDlg 消息处理程序BOOL CworkDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}SetIcon(m_hIcon, TRUE);          // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST1);pList->InsertColumn(0, _T("工号"), LVCFMT_LEFT, 120);pList->InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 150);pList->InsertColumn(2, _T("工资"), LVCFMT_LEFT, 200);pList->InsertColumn(3, _T("入职时间"), LVCFMT_LEFT, 200);pList->SetTextBkColor(RGB(205, 226, 252));pList->SetBkColor(RGB(205,226,252));pList->SetTextColor(RGB(0, 0,255));pList->SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);OnBnClickedLoad();return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CworkDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CworkDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中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;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CworkDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CworkDlg::OnBnClickedOk()
{// TODO:  在此添加控件通知处理程序代码//CDialogEx::OnOK();
}void CworkDlg::OnBnClickedCancel()
{if (m_bModify){if (IDYES == AfxMessageBox(_T("是否保存改动过的数据?"), MB_YESNO | MB_ICONQUESTION))OnBnClickedSave();}CDialogEx::OnCancel();}// 检查工号是否存在,ture代表不可以插入,false可以插入
BOOL CworkDlg::CheckNumber(LPCTSTR sznumber)
{CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST1);int i = 0, nCount = pList->GetItemCount();while (i < nCount){if (pList->GetItemText(i, 0) == sznumber){AfxMessageBox(_T("该工号已存在,请重新输入!"));this->SetFocus();SetDlgItemText(IDC_NUMB, NULL);SetDlgItemText(IDC_NAME,NULL);SetDlgItemText(IDC_SALA, NULL);return TRUE;}++i;}return FALSE;
}void CworkDlg::OnBnClickedAdd()
{//排除重复工号的功能,当重复的工号禁止插入(已存在!)CString str;GetDlgItemText(IDC_NUMB, str);if (str == ""){return;}if (CheckNumber(str))return;CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST1);int i = pList->GetItemCount();pList->InsertItem(i, str);GetDlgItemText(IDC_NAME, str);pList->SetItemText(i,1,str);GetDlgItemText(IDC_SALA, str);pList->SetItemText(i, 2, str);GetDlgItemText(IDC_DATE, str);int   ii=str.Find(_T("日"));//如果后面有星期,通过字符串切割pList->SetItemText(i, 3, str.Left(ii+1));m_bModify = TRUE;
}//pList->GetNextSelectedItem();
//pList->GetFirstSelectedItemPosition();void CworkDlg::OnBnClickedDel()
{//同时删除选中的多个列表项CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST1);if (!pList->GetSelectedCount()){AfxMessageBox(_T("请选中一行再修删除"));return;}POSITION pos = pList->GetFirstSelectedItemPosition();while (pos){int nSelItem = pList->GetNextSelectedItem(pos);CString str = pList->GetItemText(nSelItem, 0);if (IDNO == AfxMessageBox(_T("确定要删除") + str + _T("的信息吗?"), MB_YESNO)){continue;}else{m_bModify = TRUE;pList->DeleteItem(nSelItem);pos = pList->GetFirstSelectedItemPosition();}}//单行删除代码:
/*CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST1);if (!pList->GetSelectedCount()){AfxMessageBox(_T("请选中一行再修删除"));return;}POSITION pos = pList->GetFirstSelectedItemPosition();int nSel = pList->GetNextSelectedItem(pos);CString str = pList->GetItemText(nSel, 0);if (IDNO == AfxMessageBox(_T("确定要删除") + str + _T("的信息吗?"), MB_YESNO))return;pList->DeleteItem(nSel);*/}
//CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST1);
//int nSel = pList->GetSelectionMark();
//if (nSel < 0)
//{
//  AfxMessageBox(_T("请选择一行再删除!"));
//  return;
//}
//CString str = pList->GetItemText(nSel, 0);
//if (AfxMessageBox(_T("你确定要删除") + str + _T("吗?"), MB_YESNO) == IDYES)
//pList->DeleteItem(nSel);
void CworkDlg::OnBnClickedModify()
{CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_LIST1);POSITION pos = pList->GetFirstSelectedItemPosition();if (!pos){AfxMessageBox(_T("请选中一行再修改"));return;}while (pos){int nSel = pList->GetNextSelectedItem(pos);CString str = pList->GetItemText(nSel, 0);if (IDNO == AfxMessageBox(_T("确定要修改") + str + _T("的信息吗?"), MB_YESNO))continue;GetDlgItemText(IDC_NAME, str);pList->SetItemText(nSel, 1, str);GetDlgItemText(IDC_SALA, str);pList->SetItemText(nSel, 2, str);GetDlgItemText(IDC_DATE, str);int  ii = str.Find(_T("日"));//如果后面有星期,通过字符串切割pList->SetItemText(nSel, 3, str.Left(ii + 1));m_bModify = TRUE;}//单选代码如下:/*POSITION pos = pList->GetFirstSelectedItemPosition();if (!pos){AfxMessageBox(_T("请选中一行再修改"));return;}int nSel=pList->GetNextSelectedItem(pos);CString str=pList->GetItemText(nSel, 0);if (IDNO==AfxMessageBox(_T("确定要修改") + str + _T("的信息吗?"),MB_YESNO))return;GetDlgItemText(IDC_NAME,str);pList->SetItemText(nSel,1,str);GetDlgItemText(IDC_SALA, str);pList->SetItemText(nSel, 2, str);GetDlgItemText(IDC_DATE, str);int ii = str.Find(_T("日"));//如果后面有星期,通过字符串切割pList->SetItemText(nSel, 3, str.Left(ii+1));*/}
//if (!pList->GetSelectedCount())
//{
//  AfxMessageBox(_T("请选中一行再修改"));
//  return;
//}
void CworkDlg::OnBnClickedLoad()
{CFile file;if (!file.Open(_T("./worker.dat"), CFile::modeRead ))return;SInfo info;CListCtrl * pList = (CListCtrl *)GetDlgItem(IDC_LIST1);int i = 0;CString str;while (file.Read(&info, sizeof(info)) == sizeof(info)){str.Format(_T("%d"), info.nNumb);pList->InsertItem(i,str);pList->SetItemText(i, 1, info.sName);str.Format(_T("%0.2f"),info.fSala);pList->SetItemText(i, 2, str);//str = info.tDate.Format(VAR_DATEVALUEONLY);//str = info.tDate.Format(_T("%Y年%m月%d日"));str.Format(_T("%d年%d月%d日"), info.tDate.GetYear(), info.tDate.GetMonth(), info.tDate.GetDay() );pList->SetItemText(i,3,str);++i;}file.Close();
}
void CworkDlg::OnBnClickedSave()
{CFile file;if (!file.Open(_T("./worker.dat"), CFile::modeCreate | CFile::modeWrite)){AfxMessageBox(_T("保存文件失败!"));return;}SInfo info;CListCtrl * pList = (CListCtrl *)GetDlgItem(IDC_LIST1);int i = 0, nCount = pList->GetItemCount();while (i<nCount){info.nNumb=_tstoi(pList->GetItemText(i, 0));_tcscpy(info.sName, pList->GetItemText(i, 1));info.fSala = (float)_tstof(pList->GetItemText(i, 2));info.tDate.ParseDateTime(pList->GetItemText(i, 3), VAR_DATEVALUEONLY);file.Write(&info, sizeof(info));++i;}file.Close();m_bModify = FALSE;
}
// workDlg.h : 头文件
//#pragma once// CworkDlg 对话框
class CworkDlg : public CDialogEx
{
// 构造struct SInfo{int nNumb;TCHAR sName[16];float fSala;COleDateTime tDate;};BOOL m_bModify;
public:CworkDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据enum { IDD = IDD_WORK_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedOk();afx_msg void OnBnClickedCancel();afx_msg void OnBnClickedAdd();afx_msg void OnBnClickedDel();afx_msg void OnBnClickedModify();afx_msg void OnDtnDatetimechangeDate(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnBnClickedLoad();afx_msg void OnBnClickedSave();// 检查工号是否存在BOOL CheckNumber(LPCTSTR sznumber);
};

其中视频中没有实现的几个作业,我做了一个简单实现,如发现BUG,请留言非常感谢。对于MFC窗口的细节就不详细说明里面的按钮添加顺序和按钮名称了,可以详细看我代码。建议按照视频的代码一步步敲一遍。

吕鑫MFC学习系列十相关推荐

  1. 吕鑫MFC学习系列一

    前面有学习MFC比较零乱,利用假期好好恶补一下,接下来按照在网易公开课上吕鑫老师的MFC的教程来学习MFC的开发. 第一个学习的是员工管理系统,先把实现好的窗口贴上来. 主要的功能:添加(员工的工号, ...

  2. 吕鑫MFC学习系列七

    接着上一节的知识点继续学习MFC的一些重要函数,因为函数设计MFC的基础. 第一步,创建一个MFC工程,然后再将上一节的两个功能添加进来,通过类向导添加DestroyWindow(),第二个按钮通过c ...

  3. 吕鑫MFC学习系列四

    第一个是Win32工程转换而成MFC工程: 建一个win32项目,window应用程序,然后删除了所有函数,只留下主函数,编写过程中转MFC,所以右击项目,选择静态库MFC,然后在stdafx.h中用 ...

  4. 吕鑫MFC学习系列六

    这一章学习的相关知识框架: 一.根据主窗口类型,MFC软件工程可以分为以下几种架构模型: 1.SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档 ...

  5. 吕鑫MFC学习系列二

    第二个学习的是CString的类成员的使用,这个类是非常重要的,重点学习一下. 成员函数学习: 1.CString::GetLength() 2.CString::Format() 在vs2013编译 ...

  6. 吕鑫MFC学习系列三

    这节制作的是Ctime类的学习: 1.初始化 m_begintime=CTime(2004,1,1,0,0,0,-1);//参数依次为 year,month,day,hour,minite,secon ...

  7. 吕鑫MFC学习系列五

    这一节就是关于MFC工程管理,这里在主对话框出现之前添加一个登陆界面,最后在主对话框添加一个小小的功能就是关闭window已经打开的窗口. 下面是实现的过程: 主对话框还是上一节中那个MFC消息映射机 ...

  8. 吕鑫MFC学习系列九

    CWinApp类的基类:CObject->CCmdTarget->CWinThread->CWinApp 一.CWinApp类成员变量: 1.WinMain的四个参数: // Sta ...

  9. 【吕鑫MFC学习】一个简单的MFC程序

    开始学习MFC的第一天,实现一个简单的整数计算器用来说明MFC程序的基本流程. 平台:Visual Studio2015 实现的界面: 首先,新建一个MFC应用程序 这里简单说明控制台应用程序.MFC ...

最新文章

  1. readline停止后怎么重新开始_2021,离婚后人生重新开始
  2. echo等追加到文件末尾
  3. EOS账户系统(2)账户和钱包
  4. iOS 权限判断 跳转对应设置界面
  5. fiddler拦截response
  6. java飞机大战强化版_java飞机大战升级版源码(全彩,背景音乐,各种音效,不同僚机,子弹特效以及技能系统)...
  7. DX 系列之 ComboBoxEdit
  8. Docker下载安装
  9. php 后台数据 u,Yunucms代码审计:后台XSS和数据库信息泄露
  10. vue tinymce安装及使用
  11. AI-ISP,是噱头还是真能解决问题
  12. 怎么添加计算机到网络共享中心,主编教您怎么设置局域网共享
  13. Public Key Retrieval is not allowed
  14. 创建图层-只是保存lyr,此路不通
  15. 浏览器默认首页被360导航篡改解决办法
  16. JAVA学习路线图---(JAVA1234)
  17. 用递归实现阶乘计算器
  18. 上传并下载excel表格
  19. 拼多多商品详情页 API接口、拼多多商品SKU数据接口 API接口、拼多多关键词搜索接口 API接口 API接口、拼多多关键词采集 API接口、拼多多采集接口 API接口、拼多多详情 API接口
  20. Phoenix创建二级索引

热门文章

  1. 【python初级】os.path.isfile(path)判断路径是否为文件
  2. 计算机丢失credui.dll,修复credui.dll
  3. python监视电脑桌面_Python爬虫练习:爬取高清壁纸,让你电脑桌面一天一换
  4. html+css商城主页面
  5. python批量修改图片内容_python批量修改图片大小的方法
  6. 25.(C语言)回文数判断万用公式
  7. 用户贷款风险预测-datacastle竞赛题目
  8. 计算机专业毕设都需要哪些准备,计算机专业本科毕设指南.ppt
  9. B03 - 006、scp
  10. 用python轻松玩转Excel,完成数据分析与统计,学习心得分享