文章目錄
- 單文檔定義
- 新建一個單文檔應用程序
- 單文檔應用程序組成:
- 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 經典樣式 - 點完成,和之前手動創建的一樣,只是多了一些內容
案例演示
涂格子游戲