文章目录
- 单文档定义
- 新建一个单文档应用程序
- 单文档应用程序组成:
- APP应用程序类
- 框架类(窗口类)
- 视图类(窗口类,属于框架的子窗口)
- 文档类(对数据进行保存读取操作)
- 直接用向导创建单文档
- 案例演示
单文档定义
只能编辑一个文档,比如说画图,一次只能开一个,开2个就要打开2个程序,能够处理一个或者多个文件、文档、业务的程序
多文档就是类似win11的记事本程序,打开一个程序能编辑很多记事本窗口
新建一个单文档应用程序
资源添加,几个资源名可以相同
相同的才能一起添加进去,因为创建的时候只能传1个ID
单文档应用程序组成:
APP应用程序类
FirstSDI.h
#pragma once
#include "pch.h"
class FirstSdiApp : public CWinApp
{
BOOL InitInstance();
};
FirstSDI.cpp
#include "FirstSDI.h"
#include "CFirstDocument.h"
#include "MainFrame.h"
#include "CChildView.h"
BOOL FirstSdiApp::InitInstance()
{
//SDI文档模版对象
CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,//资源ID,包含(图标,菜单,工具栏,快捷键资源)
RUNTIME_CLASS(CFirstDocument),//文档类
RUNTIME_CLASS(CMainFrame),//框架类
RUNTIME_CLASS(CChildView));//视图类
//添加文档模版对象
AddDocTemplate(pDocTemplate);
//解析命令行信息
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
//执行命令行参数命令
if (!ProcessShellCommand(cmdInfo))
return FALSE;
//显示主框架窗口
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
FirstSdiApp theApp;
这里的命令行参数,比如你双击打开一个xxx.txt,双击的过程,就会传递一个命令行参数,就会使用文本文档这个程序打开
框架类(窗口类)
MainFrame.h
#pragma once
#include "pch.h"
class CMainFrame :
public CFrameWnd
{
DECLARE_DYNCREATE(CMainFrame)
};
MainFrame.cpp
#include "MainFrame.h"
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
- 此框架类可以添加十八章做过的菜单,工具栏,状态栏
- 也可以修改标题风格,通过PreCreateWindow这个虚函数添加
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~FWS_ADDTOTITLE;//去掉标题栏
cs.style &= ~WS_THICKFRAME;//去掉边框
cs.cx = 300;//宽度
cs.cy = 300;//高度
return CFrameWnd::PreCreateWindow(cs);
}
- 还有专门修改标题的虚函数 OnUpdateFrameTitle
void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
{
//SetWindowText(L"第一个SDI应用程序");//直接设置标题
//CFrameWnd::OnUpdateFrameTitle(bAddToTitle);
CDocument* pDoc = GetActiveDocument();
if (pDoc != NULL)
{
SetWindowText(pDoc->GetTitle());//从文档类中获取标题
}
}
视图类(窗口类,属于框架的子窗口)
CChildView.h
#pragma once
#include "pch.h"
class CChildView :
public CView
{
DECLARE_DYNCREATE(CChildView)
virtual void OnDraw(CDC* /*pDC*/);
};
CChildView.cpp
#include "CChildView.h"
IMPLEMENT_DYNCREATE(CChildView, CView)
void CChildView::OnDraw(CDC* /*pDC*/)
{
// TODO: 在此添加专用代码和/或调用基类
}
- 视图也有个OnInitialUpdate虚函数,类似于对话框的OnInitDialog
void CChildView::OnInitialUpdate()
{
CView::OnInitialUpdate();
MessageBeep(MB_ICONASTERISK);//蜂鸣
}
- 如果视图调用了OnPaint虚函数,那么要在虚函数里调用OnDraw
- 视图里面设置背景
BOOL CChildView::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
pDC->FillSolidRect(rect, RGB(255, 0, 0));
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}
- 如果视图里面背景设置透明,那么就能看到下面一层框架的颜色,如果在框架类里设置了绘图,那么就能看到,只不过平时视图盖在框架上面,看不到
文档类(对数据进行保存读取操作)
跟前一章介绍的一样,只不过添加了宏
CFirstDocument.h
#pragma once
#include "pch.h"
class CFirstDocument :
public CDocument
{
DECLARE_DYNCREATE(CFirstDocument)
};
CFirstDocument.cpp
#include "CFirstDocument.h"
IMPLEMENT_DYNCREATE(CFirstDocument, CDocument)
直接用向导创建单文档
- 填入项目名
- 点击创建,选择单个文档
项目样式选window 经典样式 - 点完成,和之前手动创建的一样,只是多了一些内容
案例演示
涂格子游戏