文章目录
- 文档串行化
- 全部代码
- 单文档应用程序搭建原理
- 搭建框架
- Win32 过度到MFC 三部曲
- 设置ID资源
- 全部代码
- 单文档应用程序
- 设置标题
- 绘图
- 简单的管理系统
- 部分代码
文档串行化
ui 设计
保存
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);//显示 }
定义一个文档类
#pragma once #include <afxwin.h> class CMyDoc :public CDocument {CMyDoc(); };
添加虚函数判断是否保存还是读取
void CMyDoc::Serialize(CArchive& ar) {CfileDemoDlg* pMainDlg=(CfileDemoDlg*)AfxGetMainWnd();//获取主对话框pMainDlg->Serialize(ar); }
在
主对话框
内添加Serialize虚函数
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;} }
全部代码
// fileDemoDlg.h: 头文件
//#pragma once
#include "CMyDoc.h"// CfileDemoDlg 对话框
class CfileDemoDlg : public CDialogEx
{
// 构造
public:CfileDemoDlg(CWnd* pParent = nullptr); // 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_FILEDEMO_DIALOG };
#endifprotected: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);
};
// 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;}
}
#pragma once
#include <afxwin.h>
class CMyDoc :public CDocument
{
public:CMyDoc();
public:virtual void Serialize(CArchive& ar);
};
#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 派生类
class CSDIApp :public CWinApp
{DECLARE_DYNCREATE(CSDIApp) //声明动态创建
public:BOOL InitInstance();
};
2.重写CWinAPP
3.定义CWinApp派生类的全局变量
#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,//所有资源IDRUNTIME_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
class CMainFrame :public CFrameWnd
{DECLARE_DYNCREATE(CMainFrame) //声明动态创建
public:CMainFrame();
};
CMainFrame .cpp
#include "stdafx.h"
#include "CMainFrame.h"IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) //实现动态创建CMainFrame::CMainFrame()
{
}
完成框架
设置ID资源
设置菜单
设置图标
名字统一
添加快捷键
添加字符串
工具栏资源
创建主文档类
#pragma once
#include "stdafx.h"
class CMainDoc :public CDocument
{DECLARE_DYNCREATE(CMainDoc) //声明动态创建
public:CMainDoc();
};
#include "CMainDoc.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainDoc,CDocument) //实现动态创建
CMainDoc::CMainDoc()
{
}
创建视图类
#pragma once
#include <afxwin.h>
class CMainView :public CView
{DECLARE_DYNCREATE(CMainView) //声明动态创建
public:CMainView();
};
#include "CMainView.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainView, CView) //实现动态创建
CMainView::CMainView()
{
}
全部代码
CMainDoc.h
#pragma once
#include "stdafx.h"
class CMainDoc :public CDocument
{DECLARE_DYNCREATE(CMainDoc) //声明动态创建
public:CMainDoc();
};
CMainDoc.cpp
#include "CMainDoc.h"
#include "stdafx.h"IMPLEMENT_DYNAMIC(CMainDoc,CDocument) //实现动态创建CMainDoc::CMainDoc()
{
}
CMainFrame.h
#pragma once
class CMainFrame :public CFrameWnd
{DECLARE_DYNCREATE(CMainFrame) //声明动态创建
public:CMainFrame();
};
CMainFrame.cpp
#include "stdafx.h"
#include "CMainFrame.h"IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) //实现动态创建CMainFrame::CMainFrame()
{
}
CMainView.h
#pragma once
#include "stdafx.h"
class CMainView :public CView
{DECLARE_DYNCREATE(CMainView) //声明动态创建
public:CMainView();virtual void OnDraw(CDC* /*pDC*/);
};
CMainView.cpp
#include "CMainView.h"
#include "stdafx.h"
IMPLEMENT_DYNAMIC(CMainView, CView) //实现动态创建
CMainView::CMainView()
{
}void CMainView::OnDraw(CDC* /*pDC*/)
{// TODO: 在此添加专用代码和/或调用基类
}
CMainView.h
class CSDIApp :public CWinApp
{DECLARE_DYNCREATE(CSDIApp) //声明动态创建
public:BOOL InitInstance();
};
CMainView.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,//所有资源IDRUNTIME_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;
}
单文档应用程序
设置标题
设置窗口名字
BOOL CSingleDoc::OnNewDocument()
{SetTitle(L"名字");return CDocument::OnNewDocument();
}
设置窗口参数,去除多余标题
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {cs.cx = 800;cs.cy = 600;cs.style = cs.style &~FWS_ADDTOTITLE;//去掉风格return CFrameWnd::PreCreateWindow(cs); }
绘图
在View 中绘图
在frame中绘图
结论:视图在框架之上
简单的管理系统
视图界面继承CListView
重写虚函数
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);}
添加快捷键
查看菜单ID>设置工具栏
部分代码
//MangerSystmView.h
public:virtual void OnInitialUpdate();afx_msg void OnAdd();afx_msg void OnDelete();afx_msg void OnModify();CListCtrl& m_list ;
// MangerSystmView.cpp: CMangerSystmView 类的实现
//#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// CMangerSystmViewIMPLEMENT_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);}