基于单文档的MFC程序

单文档
XXXX = CMy02_MFCTest
class XXXXApp : public CWinAppEx 应用程序类//程序入口地址
CMainFrame:CFrameWnd : 框架类
XXXXDoc : public CDocument 文档类
XXXXView : public CView 视图类

文档类doc:是一个类,专门用于保存或者读取数据的
视图类view:是一个类,专门用于显示和修改数据的

视图类与框架类的区别:
框架类是一个容器,这个容器里面装了视图,视图相当于一个壁纸,文档用于专门存储数据的。
如果要处理与界面相关的操作时比如鼠标消息,画图等,都要在View类中进行处理。
视图 在框架的上面,如果要响应鼠标左键按下的消息时,应该在视图类中处理,在框架类中处理时是没有响应的。

【单文档程序比较重要的函数】
XXApp应用程序类: CWinApp :: InitInstance :程序入口地址
框架类CMainFrame:CFrameWnd:
PreCreateWindow: 创建窗口前调用
OnCreate : 在创建窗口CreateWindow 函数调用时,会产生 WM_CREATE消息,系统捕获到这个消息时,直接调用OnCreate 消息进行处理。
视图类View:
OnDraw 绘图,
WM_PAINT消息,会调用OnPaint 函数进行消息处理,而OnPaint内部 调用OnDraw函数,如果这两个函数都存在,则只有OnPaint函数能有响应,可以测试。单文档程序中可以在OnDraw中进行相关的绘图操作。

【字符集】
标准的字符是ANSI ,一个字符一个字节,
Unicode 是宽字节,多字节就是一个字符两个字节。
TCHAR *p = L"1234";// L 表示 以宽字节的方式来检测
wcslen§;//计算p的大小,长度
TCHAR 是一个多字节,一个字符两个字节,是自适应字节的,实现功能是一个条件编译,可以看程序
MFC中定义了TEXT , _T 这两个 能够自适应字节,也是条件编译来实现此功能。

【扩展】

  1. afx_XXXX 全局函数,不是属于某个特定的类
    CWndApp 应用程序类
    CWnd 所有窗口类的基类
    CFrameWnd 框架类
    比如 CWnd::MessageBox 在应用程序类中 是不能使用的,只能使用AfxMessageBox ,因为 CWndAPP 不是CWnd的继承类
  2. MFC的命名规范
    类名:首字母大写
    class MyClass{};
    函数形参 isFlag isPressTest 第一个字母小写,其余大写
    成员变量 m_xxx

CArchive类 二进制文件 以二进制的形式存储在硬盘中

//写文件
void CMainFrame::OnCarchiveWrite()
{
	// TODO:  在此添加命令处理程序代码

	/*
		a) 创建文件对象 CFile
		b) 以写方式打开文件 CFile::Open
		c) 创建序列化对象,并且和文件关联在一起 CArchive
		CArchive::store 把数据保存到归档文件中。允许CFile写操作。
		d) 往数据流写数据(相当于往文件写数据)
		ar << a << b << c
		e) 断开数据流和文件的关联 CArchive::Close
		f) 关闭文件 CFile::Close
	
	*/


	CFile file;
	BOOL isOk = file.Open(TEXT("../demo.txt"), CFile::modeCreate | CFile::modeWrite);
	if (isOk == FALSE)
	{
		return;
	}

	//和CArchive管理
	//CArchive对象是数据流,文件和CArchive绑定一起,
	//store: 存储,写
	CArchive ar(&file, CArchive::store);

	//和cout用法一样
	int a = 10;
	CString str = TEXT("ABC");
	TCHAR ch = 't';

	//箭头代表流向
	//数据流向ar, ar指向文件
	ar << a << str << ch;


	ar.Close(); //断开数据流和文件的关联
	file.Close();

}

//读文件
void CMainFrame::OnCarchiveRead()
{
	// TODO:  在此添加命令处理程序代码

	CFile file;
	BOOL isOk = file.Open(TEXT("../demo.txt"), CFile::modeRead);
	if (isOk == FALSE)
	{
		return;
	}

	//和CArchive管理
	//CArchive对象是数据流,文件和CArchive绑定一起,
	//load: 加载,读
	CArchive ar(&file, CArchive::load);

	//和cout用法一样
	int a;
	CString str;
	TCHAR ch;

	//箭头代表流向
	// ar指向文件, 数据流 -> 变量
	ar >> a >> str >> ch;

	CString buf;
	buf.Format(TEXT("%d, %s, %c"), a, str, ch);
	MessageBox(buf);

	ar.Close(); //断开数据流和文件的关联
	file.Close();
}

文档类doc中serialize序列化 点击保存或者打开按钮时的处理命令

// CCArctive00Doc 序列化

void CCArctive00Doc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: 在此添加存储代码
		//按保存 调用此处  保存数据到文件中,以二进制的形式
		CString str = _T("Log Log");
		int a = 20;
		ar << str << a;
		
	}
	else
	{
		// TODO: 在此添加加载代码
		//点击菜单中打开时 调用此处  取数据
		CString str ;
		int a ;
		ar >> str >> a;
		CString buf;
		buf.Format(_T("%s %d"),str,a);
		AfxMessageBox(buf);
	}
}

CArchive 与File

//写
void CMainFrame::OnWriteFun()
{
	// TODO: 在此添加命令处理程序代码
	//CArchive ar;
	CFile file;
	CString str = _T("haha,ab很棒哦,可以的啊");
	CString strPath = _T("../luck.txt");
	file.Open(strPath, CFile::modeCreate | CFile::modeWrite );


	CArchive ar(&file, CArchive::store);
	int b = 10;
	CString buf = _T("ABC bu知道怎么族而言");//../luck.txt不知道啥意思哦 yexuzimukeide
	int a = 20;
	ar << b<<buf << a;//如果没有b只有buf和a,则乱码不是很严重,有b在开头就严重啦
	//	file.Write(str,MAX_PATH);
	ar.Close();//断开数据流和文件的关联
	file.Close();
}
//读
void CMainFrame::OnReadData()
{
	// TODO: 在此添加命令处理程序代码
	CFile file;
	CString strPath = _T("../luck.txt");
	CString buf;
	if (file.Open(strPath, CFile::modeRead))
	{
		/*file.Read(buf.GetBuffer(MAX_PATH),MAX_PATH);
		buf.ReleaseBuffer();*/
		CArchive ar(&file, CArchive::load);
		CString str;
		int a,b;
		ar >> b>>str >> a;
		buf.Format(_T("%s %d %d"), str, b,a);
		AfxMessageBox(buf);
		ar.Close();
	}
	file.Close();
}

文件的保存与读写

//写
void CMainFrame::OnWriteFun()
{
	// TODO: 在此添加命令处理程序代码
	//CArchive ar;
	CFile file;
	CString str = _T("今天又学习了一个技能哦");
	CString strPath = _T("../luck.txt");
	file.Open(strPath,CFile::modeWrite | CFile::modeCreate,NULL);
	file.Write(str,MAX_PATH);
	file.Close();
}


void CMainFrame::OnReadData()
{
	// TODO: 在此添加命令处理程序代码
	CFile file;
	CString strPath = _T("../luck.txt");
	CString buf;
	if (file.Open(strPath, CFile::modeRead, NULL))
	{
		file.Read(buf.GetBuffer(MAX_PATH),MAX_PATH);
		buf.ReleaseBuffer();
		CString str = buf;
		AfxMessageBox(str);
	}
	file.Close();
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页