单文档
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 这两个 能够自适应字节,也是条件编译来实现此功能。
【扩展】
- afx_XXXX 全局函数,不是属于某个特定的类
CWndApp 应用程序类
CWnd 所有窗口类的基类
CFrameWnd 框架类
比如 CWnd::MessageBox 在应用程序类中 是不能使用的,只能使用AfxMessageBox ,因为 CWndAPP 不是CWnd的继承类 - 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();
}