文章目录
- 单文档定义
- 新建一个单文档应用程序
- 单文档应用程序组成:
- 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 经典样式 - 点完成,和之前手动创建的一样,只是多了一些内容
案例演示
涂格子游戏