【MFC】视图和文档

视图窗口

提供了一个用于显示数据的窗口
区别与框架窗口:

框架窗口:容纳子窗口,充当容器
视图窗口为框架窗口的子窗口

相关类

CView及其子类, CWnd为父类,封装了关于视图窗口的各种操作,以及和文档类的数据交互

使用

  1. 定义一个自己的视图类,派生自CView(抽象类,不重写无法生成对象),重写符类成员纯虚函数OnDraw(可用于画图)
  2. 其余框架类和应用程序类代码不变
  3. 在处理框架窗口的WM_CREATE消息时,定义CMyView类对象,并调用Create函数创建视图窗口

视图窗口的ID为 AFX_IDW_PANE_FIRST:视图窗口平铺框架窗口,只要大于ID即可平铺

#include<afxwin.h>
class CMyView :public CView {
	DECLARE_MESSAGE_MAP()
public:
	void OnDraw(CDC* pDC);
	afx_msg void OnPaint();
};
void CMyView::OnDraw(CDC* pDC) {
	pDC->TextOut(100, 100, "CMyView::OnDraw");
}//视图类不处理绘图消息,则父类处理绘图消息;建议直接用OnDraw画

BEGIN_MESSAGE_MAP(CMyView, CView)
  ON_WM_PAINT()
END_MESSAGE_MAP()

void CMyView::OnPaint() {
	PAINTSTRUCT pcs = { 0 };
	HDC hdc = ::BeginPaint(this->m_hWnd, &pcs);
	::TextOut(hdc, 200, 200,"CMyView::OnPaint",strlen("CMyView::OnPaint"));
	::EndPaint(this->m_hWnd, &pcs);
}

class CMyFrameWnd :public CFrameWnd {
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnPaint();//创建框架窗口的宏需要的函数
	afx_msg int OnCreate(LPCREATESTRUCT pcs);
};

BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT()
ON_WM_CREATE()
END_MESSAGE_MAP()

int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) {
	CMyView* pView = new CMyView;
	pView->Create(NULL, "MFCView", WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(0, 0, 200, 200), this, 
		AFX_IDW_PANE_FIRST);
	return CFrameWnd::OnCreate(pcs);
}

void CMyFrameWnd::OnPaint() {
	PAINTSTRUCT ps = { 0 };
	HDC hdc = ::BeginPaint(this->m_hWnd, &ps);
	::TextOut(hdc, 100, 100, "我是框架窗口客户区", strlen("我是框架窗口客户区"));
	::EndPaint(this->m_hWnd, &ps);
}

class CMyWinApp :public CWinApp {
public:
	virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance() {
	CMyFrameWnd* pFrame = new CMyFrameWnd;
	pFrame->Create(NULL, "MFCView");
	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return true;
}

CMyWinApp theApp;

命令消息处理顺序

视图类->框架类->应用程序类
在这里插入图片描述

`#include<afxwin.h>
#include "resource.h"
class CMyView :public CView {
	DECLARE_MESSAGE_MAP()
public:
	void OnDraw(CDC* pDC);
	afx_msg void OnPaint();
	afx_msg void OnNew();
};
void CMyView::OnNew() {
	AfxMessageBox("视图类处理了WM_COMMAND消息");//需要点击视图窗口,因为活动视图窗口只能有一个
	//或增加代码m_pViewActive=pView;
}
void CMyView::OnDraw(CDC* pDC) {
	pDC->TextOut(100, 100, "CMyView::OnDraw");
}//视图类不处理绘图消息,则父类处理绘图消息;建议直接用OnDraw画

BEGIN_MESSAGE_MAP(CMyView, CView)
	ON_COMMAND(ID_NEW,OnNew)
 // ON_WM_PAINT()
END_MESSAGE_MAP()

void CMyView::OnPaint() {
	PAINTSTRUCT pcs = { 0 };
	HDC hdc = ::BeginPaint(this->m_hWnd, &pcs);
	::TextOut(hdc, 200, 200,"CMyView::OnPaint",strlen("CMyView::OnPaint"));
	::EndPaint(this->m_hWnd, &pcs);
}

class CMyFrameWnd :public CFrameWnd {
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnPaint();//创建框架窗口的宏需要的函数
	afx_msg int OnCreate(LPCREATESTRUCT pcs);
	afx_msg void OnNew();
};
void CMyFrameWnd::OnNew() {
	AfxMessageBox("框架类处理了WM_COMMAND消息");
}
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT()
ON_COMMAND(ID_NEW,OnNew)
ON_WM_CREATE()
END_MESSAGE_MAP()

int CMyFrameWnd::OnCreate(LPCREATESTRUCT pcs) {
	CMyView* pView = new CMyView;
	pView->Create(NULL, "MFCView", WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(0, 0, 200, 200), this, 
		AFX_IDW_PANE_FIRST);
	m_pViewActive = pView;//增加后无需点击窗口即可弹出新建窗口
	return CFrameWnd::OnCreate(pcs);
}

void CMyFrameWnd::OnPaint() {
	PAINTSTRUCT ps = { 0 };
	HDC hdc = ::BeginPaint(this->m_hWnd, &ps);
	::TextOut(hdc, 100, 100, "我是框架窗口客户区", strlen("我是框架窗口客户区"));
	::EndPaint(this->m_hWnd, &ps);
}

class CMyWinApp :public CWinApp {
	DECLARE_MESSAGE_MAP()
public:
	virtual BOOL InitInstance();
	afx_msg void OnNew();
};
void CMyWinApp::OnNew() {
	AfxMessageBox("应用程序类处理了WM_COMMAND消息");
}
BEGIN_MESSAGE_MAP(CMyWinApp,CWinApp)
	ON_COMMAND(ID_NEW, OnNew)
END_MESSAGE_MAP()
BOOL CMyWinApp::InitInstance() {
	CMyFrameWnd* pFrame = new CMyFrameWnd;
	pFrame->Create(NULL, "MFCView", WS_OVERLAPPEDWINDOW, CFrameWnd::rectDefault,
		NULL,(CHAR*)IDR_MENU1);
	m_pMainWnd = pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return true;
}

CMyWinApp theApp;

对象关系

在这里插入图片描述

参考课程

参考课程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值