文章目录
文档串行化
ui 设计
保存
cppvoid CfileDemoDlg::OnBnClickedBtnSave() { UpdateData(); //CFile file(L"Demo.dat",CFile::modeCreate|CFile::modeWrite); 第一个参数:文件指针 第二个参数:模式 //CArchive ar(&file, CArchive::store); //ar << m_strName; //ar << m_strSex; //ar << m_nAge; //ar << m_nHeight; //ar << m_fWeight; //ar << m_fSalary; //ar.Close(); //file.Close(); //m_doc.OnNewDocument();//创建一个新文档 m_doc.OnSaveDocument(L"Demo.dat");//保存 }
读取
cppvoid CfileDemoDlg::OnBnClickedBtnRead() { //CFile file(L"Demo.dat", CFile::modeRead); //CArchive ar(&file, CArchive::load); 注意:一定要按照写入顺序读取,顺序不能乱 //ar >> m_strName; //ar >> m_strSex; //ar >> m_nAge; //ar >> m_nHeight; //ar >> m_fWeight; //ar >> m_fSalary; //ar.Close(); //file.Close(); m_doc.OnOpenDocument(L"Demo.dat");//打开一个文档 UpdateData(FALSE);//显示 }
定义一个文档类
cpp#pragma once #include <afxwin.h> class CMyDoc :public CDocument { CMyDoc(); };
添加虚函数判断是否保存还是读取
cppvoid CMyDoc::Serialize(CArchive& ar) { CfileDemoDlg* pMainDlg=(CfileDemoDlg*)AfxGetMainWnd();//获取主对话框 pMainDlg->Serialize(ar); }
在
主对话框
内添加Serialize虚函数
cppvoid CfileDemoDlg::Serialize(CArchive& ar) { if (ar.IsStoring())//保存 { //第一个参数:文件指针 //第二个参数:模式 //CArchive ar(&file, CArchive::store); ar << m_strName; ar << m_strSex; ar << m_nAge; ar << m_nHeight; ar << m_fWeight; ar << m_fSalary; } else//读取 { ar >> m_strName; ar >> m_strSex; ar >> m_nAge; ar >> m_nHeight; ar >> m_fWeight; ar >> m_fSalary; } }
全部代码
// fileDemoDlg.h: 头文件
cpp
//
#pragma once
#include "CMyDoc.h"
// CfileDemoDlg 对话框
class CfileDemoDlg : public CDialogEx
{
// 构造
public:
CfileDemoDlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_FILEDEMO_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CString m_strName;
CString m_strSex;
UINT m_nAge;
UINT m_nHeight;
float m_fWeight;
float m_fSalary;
CMyDoc m_doc;
afx_msg void OnBnClickedBtnSave();
afx_msg void OnBnClickedBtnRead();
virtual void Serialize(CArchive& ar);
};
cpp
// fileDemoDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "fileDemo.h"
#include "fileDemoDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CfileDemoDlg 对话框
CfileDemoDlg::CfileDemoDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_FILEDEMO_DIALOG, pParent)
, m_nAge(0)
, m_nHeight(0)
, m_fWeight(0)
, m_fSalary(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CfileDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_strName);
DDX_Text(pDX, IDC_EDIT2, m_strSex);
DDX_Text(pDX, IDC_EDIT3, m_nAge);
DDX_Text(pDX, IDC_EDIT4, m_nHeight);
DDX_Text(pDX, IDC_EDIT5, m_fWeight);
DDX_Text(pDX, IDC_EDIT6, m_fSalary);
}
BEGIN_MESSAGE_MAP(CfileDemoDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_SAVE, &CfileDemoDlg::OnBnClickedBtnSave)
ON_BN_CLICKED(IDC_BTN_READ, &CfileDemoDlg::OnBnClickedBtnRead)
END_MESSAGE_MAP()
// CfileDemoDlg 消息处理程序
BOOL CfileDemoDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CfileDemoDlg::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 CfileDemoDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//保存
void CfileDemoDlg::OnBnClickedBtnSave()
{
UpdateData();
//CFile file(L"Demo.dat",CFile::modeCreate|CFile::modeWrite);
第一个参数:文件指针
第二个参数:模式
//CArchive ar(&file, CArchive::store);
//ar << m_strName;
//ar << m_strSex;
//ar << m_nAge;
//ar << m_nHeight;
//ar << m_fWeight;
//ar << m_fSalary;
//ar.Close();
//file.Close();
//m_doc.OnNewDocument();//创建一个新文档
m_doc.OnSaveDocument(L"Demo.dat");//保存
}
//读取
void CfileDemoDlg::OnBnClickedBtnRead()
{
//CFile file(L"Demo.dat", CFile::modeRead);
//CArchive ar(&file, CArchive::load);
注意:一定要按照写入顺序读取,顺序不能乱
//ar >> m_strName;
//ar >> m_strSex;
//ar >> m_nAge;
//ar >> m_nHeight;
//ar >> m_fWeight;
//ar >> m_fSalary;
//ar.Close();
//file.Close();
m_doc.OnOpenDocument(L"Demo.dat");//打开一个文档
UpdateData(FALSE);//显示
}
void CfileDemoDlg::Serialize(CArchive& ar)
{
if (ar.IsStoring())//保存
{
//第一个参数:文件指针
//第二个参数:模式
//CArchive ar(&file, CArchive::store);
ar << m_strName;
ar << m_strSex;
ar << m_nAge;
ar << m_nHeight;
ar << m_fWeight;
ar << m_fSalary;
}
else//读取
{
ar >> m_strName;
ar >> m_strSex;
ar >> m_nAge;
ar >> m_nHeight;
ar >> m_fWeight;
ar >> m_fSalary;
}
}
cpp
#pragma once
#include <afxwin.h>
class CMyDoc :public CDocument
{
public:
CMyDoc();
public:
virtual void Serialize(CArchive& ar);
};
cpp
#include "pch.h"
#include "CMyDoc.h"
#include "fileDemoDlg.h"
CMyDoc::CMyDoc()
{
}
void CMyDoc::Serialize(CArchive& ar)
{
CfileDemoDlg* pMainDlg=(CfileDemoDlg*)AfxGetMainWnd();//获取主对话框
pMainDlg->Serialize(ar);
}
单文档应用程序搭建原理
单文档应用程序(SDI应用程序)是一种基于文档的应用程序,它允许用户打开、编辑和保存单个文档。这种类型的应用程序通常用于文本编辑器、图像编辑器、绘图工具等。
在单文档应用程序中,用户可以打开一个文档,对其进行编辑并将其保存。当用户打开同一个文档时,应用程序会将其加载到内存中供用户编辑。用户可以对文档进行各种操作,如添加、删除、修改和移动文档中的内容。
与多文档应用程序(MDI应用程序)不同,单文档应用程序只允许用户同时打开一个文档。这意味着用户必须先关闭当前文档,然后才能打开另一个文档。
属性设置
搭建框架
Win32 过度到MFC 三部曲
CSDIApp 类
1.建立CWinApp 派生类
cpp
class CSDIApp :public CWinApp
{
DECLARE_DYNCREATE(CSDIApp) //声明动态创建
public:
BOOL InitInstance();
};
2.重写CWinAPP
3.定义CWinApp派生类的全局变量
cpp
#include "stdafx.h"
#include "SDI.h"
#include "CMainFrame.h"
CSDIApp theApp;//定义CWinApp派生类的全局变量
IMPLEMENT_DYNAMIC(CSDIApp, CWinApp) //实现动态创建
BOOL CSDIApp::InitInstance()
{
//CMainFrame* pFrame = new CMainFrame;
//pFrame->Create(NULL, L"框架程序");
//m_pMainWnd = pFrame;
//pFrame->ShowWindow(SW_SHOW);
//单文档
CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,//所有资源ID
RUNTIME_CLASS(CMainDoc),//文档类
RUNTIME_CLASS(CMainFrame),//主窗口框架啊
RUNTIME_CLASS(CMainView)//视图类
);
//添加到文档模板对象中
AddDocTemplate(pDocTemplate);
//解析命令行信息
CCommandLineInfo cmdLineInfo;
ParseCommandLine(cmdLineInfo);
//执行命令行命令
if (FALSE == ProcessShellCommand(cmdLineInfo))
return FALSE;
//显示窗口
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
MFC 框架类
CMainFrame .h
cpp
class CMainFrame :public CFrameWnd
{
DECLARE_DYNCREATE(CMainFrame) //声明动态创建
public:
CMainFrame();
};
CMainFrame .cpp
cpp
#include "stdafx.h"
#include "CMainFrame.h"
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) //实现动态创建
CMainFrame::CMainFrame()
{
}
完成框架
设置ID资源
设置菜单
设置图标名字统一
添加快捷键
添加字符串
工具栏资源
创建主文档类
cpp
#pragma once
#include "stdafx.h"
class CMainDoc :public CDocument
{
DECLARE_DYNCREATE(CMainDoc) //声明动态创建
public:
CMainDoc();
};
cpp
#include "CMainDoc.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainDoc,CDocument) //实现动态创建
CMainDoc::CMainDoc()
{
}
创建视图类
cpp
#pragma once
#include <afxwin.h>
class CMainView :public CView
{
DECLARE_DYNCREATE(CMainView) //声明动态创建
public:
CMainView();
};
cpp
#include "CMainView.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainView, CView) //实现动态创建
CMainView::CMainView()
{
}
全部代码
CMainDoc.h
cpp
#pragma once
#include "stdafx.h"
class CMainDoc :public CDocument
{
DECLARE_DYNCREATE(CMainDoc) //声明动态创建
public:
CMainDoc();
};
CMainDoc.cpp
cpp
#include "CMainDoc.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainDoc,CDocument) //实现动态创建
CMainDoc::CMainDoc()
{
}
CMainFrame.h
cpp
#pragma once
class CMainFrame :public CFrameWnd
{
DECLARE_DYNCREATE(CMainFrame) //声明动态创建
public:
CMainFrame();
};
CMainFrame.cpp
cpp
#include "stdafx.h"
#include "CMainFrame.h"
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) //实现动态创建
CMainFrame::CMainFrame()
{
}
CMainView.h
cpp
#pragma once
#include "stdafx.h"
class CMainView :public CView
{
DECLARE_DYNCREATE(CMainView) //声明动态创建
public:
CMainView();
virtual void OnDraw(CDC* /*pDC*/);
};
CMainView.cpp
cpp
#include "CMainView.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainView, CView) //实现动态创建
CMainView::CMainView()
{
}
void CMainView::OnDraw(CDC* /*pDC*/)
{
// TODO: 在此添加专用代码和/或调用基类
}
CMainView.h
cpp
class CSDIApp :public CWinApp
{
DECLARE_DYNCREATE(CSDIApp) //声明动态创建
public:
BOOL InitInstance();
};
CMainView.cpp
cpp
#include "stdafx.h"
#include "SDI.h"
#include "CMainFrame.h"
#include "CMainDoc.h"
#include "CMainView.h"
CSDIApp theApp;
IMPLEMENT_DYNAMIC(CSDIApp, CWinApp) //实现动态创建
BOOL CSDIApp::InitInstance()
{
/*CMainFrame* pFrame = new CMainFrame;
pFrame->Create(NULL, L"框架程序");
m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);*/
//单文档
CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,//所有资源ID
RUNTIME_CLASS(CMainDoc),//文档类
RUNTIME_CLASS(CMainFrame),//主窗口框架啊
RUNTIME_CLASS(CMainView)//视图类
);
//添加到文档模板对象中
AddDocTemplate(pDocTemplate);
//解析命令行信息
CCommandLineInfo cmdLineInfo;
ParseCommandLine(cmdLineInfo);
//执行命令行命令
if (FALSE == ProcessShellCommand(cmdLineInfo))
return FALSE;
//显示窗口
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
单文档应用程序
设置标题
设置窗口名字
cpp
BOOL CSingleDoc::OnNewDocument()
{
SetTitle(L"名字");
return CDocument::OnNewDocument();
}
设置窗口参数,去除多余标题
cppBOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.cx = 800; cs.cy = 600; cs.style = cs.style &~FWS_ADDTOTITLE;//去掉风格 return CFrameWnd::PreCreateWindow(cs); }
绘图
在View 中绘图
在frame中绘图
cpp
结论:视图在框架之上
简单的管理系统
视图界面继承CListView
重写虚函数
cpp
void CMangerSystmView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_list.ModifyStyle(0, LVS_REPORT|LVS_SHOWSELALWAYS);//设置风格
m_list.InsertColumn(0,L"ID",LVCFMT_LEFT,100);
m_list.InsertColumn(0, L"姓名", LVCFMT_LEFT, 100);
m_list.InsertColumn(0, L"性别", LVCFMT_LEFT, 100);
m_list.InsertColumn(0, L"年龄", LVCFMT_LEFT, 100);
}
设置菜单
添加窗口
添加类
添加控件变量
添加
cpp
void CMangerSystmView::OnAdd()
{
CAddDlg addDlg;
if (IDCANCEL == addDlg.DoModal())
return;
int nCount = m_list.GetItemCount();//获取总行数
CString str;
str.Format(L"%d",addDlg.m_nID);
m_list.InsertItem(nCount,str);
m_list.SetItemText(nCount, 1, addDlg.m_strName);
m_list.SetItemText(nCount, 2, addDlg.m_strSex);
str.Format(L"%d", addDlg.m_nAge);
m_list.SetItemText(nCount, 3, str);
}
删除
cpp
void CMangerSystmView::OnDelete()
{
POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
int nSel=m_list.GetNextSelectedItem(pos);
CString str;
str.Format(L"%d", nSel);
SetWindowText(str);
if (nSel < 0)
{
MessageBox(L"请选中后在删除");
return;
}
if (IDYES == MessageBox(L"确定要删除吗", L"提示", MB_YESNO))
{
m_list.DeleteItem(nSel);
}
}
修改
cpp
void CMangerSystmView::OnModify()
{
CModifyDlg dlg;
POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
int nSel = m_list.GetNextSelectedItem(pos);//获取当前选项
if (nSel < 0)
{
MessageBox(L"请选中后在修改");
return;
}
dlg.m_nID=_wtoi(m_list.GetItemText(nSel, 0 ));
dlg.m_strName = m_list.GetItemText(nSel, 1);
dlg.m_strSex= m_list.GetItemText(nSel, 2);
dlg.m_nAge = _wtoi(m_list.GetItemText(nSel, 3));
if (IDCANCEL == dlg.DoModal())
{
return;
}
CString str;
str.Format(L"%d", dlg.m_nID);
m_list.SetItemText(nSel, 0,str);
m_list.SetItemText(nSel, 1, dlg.m_strName);
m_list.SetItemText(nSel, 2, dlg.m_strSex);
str.Format(L"%d", dlg.m_nAge);
m_list.SetItemText(nSel, 3, str);
}
添加快捷键
查看菜单ID>设置工具栏
部分代码
cpp
public:
virtual void OnInitialUpdate();
afx_msg void OnAdd();
afx_msg void OnDelete();
afx_msg void OnModify();
CListCtrl& m_list ;
// MangerSystmView.cpp: CMangerSystmView 类的实现
cpp
//
#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MangerSystm.h"
#endif
#include "MangerSystmDoc.h"
#include "MangerSystmView.h"
#include "CAddDlg.h"
#include "CModifyDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMangerSystmView
IMPLEMENT_DYNCREATE(CMangerSystmView, CListView)
BEGIN_MESSAGE_MAP(CMangerSystmView, CListView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CListView::OnFilePrintPreview)
ON_COMMAND(ID_ADD, &CMangerSystmView::OnAdd)
ON_COMMAND(ID_DELETE, &CMangerSystmView::OnDelete)
ON_COMMAND(ID_MODIFY, &CMangerSystmView::OnModify)
END_MESSAGE_MAP()
// CMangerSystmView 构造/析构
CMangerSystmView::CMangerSystmView():m_list(GetListCtrl())
{
// TODO: 在此处添加构造代码
}
CMangerSystmView::~CMangerSystmView()
{
}
BOOL CMangerSystmView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
return CListView::PreCreateWindow(cs);
}
void CMangerSystmView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_list.ModifyStyle(0, LVS_REPORT|LVS_SHOWSELALWAYS);//设置风格
m_list.InsertColumn(0,L"ID",LVCFMT_LEFT,100);
m_list.InsertColumn(0, L"姓名", LVCFMT_LEFT, 100);
m_list.InsertColumn(0, L"性别", LVCFMT_LEFT, 100);
m_list.InsertColumn(0, L"年龄", LVCFMT_LEFT, 100);
}
void CMangerSystmView::OnAdd()
{
CAddDlg addDlg;
if (IDCANCEL == addDlg.DoModal())
return;
int nCount = m_list.GetItemCount();//获取总行数
CString str;
str.Format(L"%d",addDlg.m_nID);
m_list.InsertItem(nCount,str);
m_list.SetItemText(nCount, 1, addDlg.m_strName);
m_list.SetItemText(nCount, 2, addDlg.m_strSex);
str.Format(L"%d", addDlg.m_nAge);
m_list.SetItemText(nCount, 3, str);
}
void CMangerSystmView::OnDelete()
{
POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
int nSel=m_list.GetNextSelectedItem(pos);
CString str;
str.Format(L"%d", nSel);
SetWindowText(str);
if (nSel < 0)
{
MessageBox(L"请选中后在删除");
return;
}
if (IDYES == MessageBox(L"确定要删除吗", L"提示", MB_YESNO))
{
m_list.DeleteItem(nSel);
}
}
//修改
void CMangerSystmView::OnModify()
{
CModifyDlg dlg;
POSITION pos = m_list.GetFirstSelectedItemPosition();//获取相中的位置
int nSel = m_list.GetNextSelectedItem(pos);//获取当前选项
if (nSel < 0)
{
MessageBox(L"请选中后在修改");
return;
}
dlg.m_nID=_wtoi(m_list.GetItemText(nSel, 0 ));
dlg.m_strName = m_list.GetItemText(nSel, 1);
dlg.m_strSex= m_list.GetItemText(nSel, 2);
dlg.m_nAge = _wtoi(m_list.GetItemText(nSel, 3));
if (IDCANCEL == dlg.DoModal())
{
return;
}
CString str;
str.Format(L"%d", dlg.m_nID);
m_list.SetItemText(nSel, 0,str);
m_list.SetItemText(nSel, 1, dlg.m_strName);
m_list.SetItemText(nSel, 2, dlg.m_strSex);
str.Format(L"%d", dlg.m_nAge);
m_list.SetItemText(nSel, 3, str);
}