MFC第七天

12 篇文章 0 订阅

多文档视图应用程序
    1,概念
    可以同时管理多个文档,例如:word excel office等
    2.相关类
    CWinApp
    CMDIFrameWnd   ---对文档主框架类
    CMDIChildWnd   ---多文档子框架类
    CView/CEditView
    CMultiDocTemplate  --多文档程序模板

    CDocument
    主框架 子框架 资源不一样 要两套资源

    3多文档视图程序创建过程
    3.1 创建多文档模板类,并且添加到应用程序
    3.2 创建和显示主框架窗口
    3.3 调用OnFileNew函数,创建其他文档(文档,子框架,视图)
       3.3.1使用多文档模板创建模板对象
       3.3.2创建子框架对象及窗口
       3.3.3在子框架窗口的OnCreate函数,创建视图对象和窗口
       3.3.4在视图窗口的OnCreate函数,文档与视图相互保存对方的地址。

常用函数:
    AfxGetMainWnd   获取程序主框架窗口
    AfxGetApp    获取theApp应用程序对象
    CFrameWnd::GetActiveFrame    在多文档中获取当前活动的子框架窗口
    CFrameWnd::GetActiveView                            视图窗口
        多文档  子框架
        单文档  主框架
    
    CView::GetDocument    获取视图关联的文档

    CDocument::GetDocTemplate  用于获取与文档关联的文档模板
    CDocTemplate::CreateNewFrame    创建框架窗口
    CDocTemplate::InitialUpdateFrame   初始化更新框架窗口

    CDocument::UpdateAllViews       用来通知所有视图数据更新
    引起所有视图的OnUpdate函数调用    当文档数据发生变化后调用
    CView::OnInitialUpdate       视图类初始化函数




MFC绘图
    CDC类 绘图设备类(纸),
    CGdiObject  绘图对象(笔)

    CDC使用
    1 创建    CDC::CreateDC
        virtual BOOL CreateDC( LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName,
        LPCTSTR lpszOutput, const void* lpInitData );
    2 使用    
    3 删除    CDC::DeleteDC

    CWindowDC,    父类CDC类   表示窗口dc,包括窗口客户区和非客户去   FrameWnd
    CClientDC     父类CDC     表示窗口的客户区dc            Window
    CPaintDC     父类CDC      表示窗口客户区   只能在wm_PAINT消息中使用
    CMetaFileDC    父类是CDC    用来保存绘制命令

    CMetaFileDC    使用步骤    元文件dc
    创建  CMetaFileDC::Create
    绘制  CDC::TextOut/MoveTo/LineTo  等函数
    关闭  返回句柄
        HMETAFILE CMetaFileDC::Close( );
    使用    CDC::PlayMetaFile
    删除    BOOL DeleteMetaFile(
            HMETAFILE hmf   // handle to Windows-format metafile
            );



CPen 画笔  定义现款 线型  线的颜色
CBrush  画刷  颜色画刷 委托画刷
CFont  字体
CBitmap   位图
CRgn  复杂区域,可以讲两个图形进行稽核运算,课多次运算,形成复杂程序

CPalette  调色板,用来设置颜色


主要代码

MFCMDI.cpp

// MFCMDI.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
class CMdiDoc:public CDocument{
	DECLARE_DYNCREATE(CMdiDoc)
public:
	CString m_strContent;
};
IMPLEMENT_DYNCREATE(CMdiDoc,CDocument)
class CMdiView:public CEditView{
	DECLARE_DYNCREATE(CMdiView)
		DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnEnChange();
	virtual void OnUpdate( 	CView* pSender, LPARAM lHint, 
		CObject* pHint ); 

};
BEGIN_MESSAGE_MAP(CMdiView,CEditView)
	ON_CONTROL_REFLECT_EX(EN_CHANGE,OnEnChange)
END_MESSAGE_MAP()
IMPLEMENT_DYNCREATE(CMdiView,CEditView)
void CMdiView::OnEnChange(){
	CMdiDoc *pMdiDoc=(CMdiDoc*)GetDocument();
	GetWindowText(pMdiDoc->m_strContent);
	pMdiDoc->UpdateAllViews(this);

}
void CMdiView::OnUpdate( CView* pSender, LPARAM lHint, 
					  CObject* pHint ){
	CMdiDoc *pDoc=(CMdiDoc*)GetDocument();	//get document
	SetWindowText(pDoc->m_strContent);	//show content
}

class CChildFrame:public CMDIChildWnd{
	DECLARE_DYNCREATE(CChildFrame)
};
IMPLEMENT_DYNCREATE(CChildFrame,CMDIChildWnd)
class CMainFrame:public CMDIFrameWnd{
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnNewView();
};
BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWnd)
	ON_COMMAND(ID_NEWVIEW,OnNewView)
END_MESSAGE_MAP()
void CMainFrame::OnNewView(){
	CFrameWnd* pFrameWnd=GetActiveFrame();
	if(!pFrameWnd->IsKindOf(RUNTIME_CLASS(CChildFrame))){
		return ;
	}
	CView *pView=pFrameWnd->GetActiveView();
	CDocument *pDoc=pView->GetDocument();
	CDocTemplate* pTemplate=pDoc->GetDocTemplate();
	CChildFrame *pNewFrame=(CChildFrame*)pTemplate->CreateNewFrame(pDoc,NULL);
	pTemplate->InitialUpdateFrame(pNewFrame,NULL);
}

class CMdiApp:public CWinApp{
public:
	virtual BOOL InitInstance();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnNew();
};
BEGIN_MESSAGE_MAP(CMdiApp,CWinApp)
	ON_COMMAND(ID_NEW,OnNew)
END_MESSAGE_MAP()
CMdiApp theApp;
BOOL CMdiApp::InitInstance(){
	CMultiDocTemplate *pTemplate=new CMultiDocTemplate(
		IDR_MENUCHILD,
		RUNTIME_CLASS(CMdiDoc),
		RUNTIME_CLASS(CChildFrame),
		RUNTIME_CLASS(CMdiView)	
		);
	AddDocTemplate(pTemplate);
	CMainFrame *pFrame=new CMainFrame;
	pFrame->LoadFrame(IDR_MENUMAIN);
	m_pMainWnd=pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	OnFileNew();
//	OnFileNew();
	return TRUE;
}
void CMdiApp::OnNew(){
	OnFileNew();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值