MFC 文档/视图 二

文档/视图结构简介

文档函数

DeleteContents

OnNewDocument

OnOpenDocument

UpdateAllViews

视图函数

GetDocument

OnInitialUpdate

OnUpdate

OnDraw

对象的创建

模板对象

文档对象

框架对象

视图对象

各对象的关系

文档读写

文件的归档:CArchive

CArchive对象的使用

使类可串行化

串行化实现

范例

cpp 复制代码
void CModalDlg::OnButtonColor()
{
	// TODO: Add your control notification handler code here
	CColorDialog color;
	if (color.DoModal() == IDOK)
	{
		CMainFrame* pMainFrm = (CMainFrame*)AfxGetMainWnd();//获取主窗口
		//获取选定线条的颜色
		CMFCTest10Doc* pDoc = (CMFCTest10Doc*)pMainFrm->GetActiveDocument();//获取活动文档对象
		pDoc->m_color = color.GetColor();//设置文档中的线条颜色
	}
}
cpp 复制代码
class CMFCTest10Doc : public CDocument
{
public:
	UINT m_ulong;//长轴
	UINT m_ushort;//短轴
	UINT m_uthick;//线粗
	COLORREF m_color;//线条颜色
	CList<CPoint, CPoint> m_PointList;//点List

    ...
};
cpp 复制代码
BOOL CMFCTest10Doc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: 在此添加重新初始化代码
	// (SDI 文档将重用该文档)
	m_ulong = 20;//长轴
	m_ushort = 20;//短轴
	m_uthick = 2;//线粗
	m_color = RGB(0, 150, 0);//线条颜色
	return TRUE;
}
cpp 复制代码
void CMFCTest10Doc::DeleteContents()
{
	// TODO: 在此添加专用代码和/或调用基类
	m_PointList.RemoveAll();//删除所有数据
	CDocument::DeleteContents();
}
cpp 复制代码
void CMFCTest10Doc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: 在此添加存储代码
		ar << m_ulong << m_ushort << m_uthick << m_color;
	}
	else
	{
		ar >> m_ulong >> m_ushort >> m_uthick >> m_color;
		// TODO: 在此添加加载代码
	}
	m_PointList.Serialize(ar);
}
cpp 复制代码
void CMFCTest10View::OnConfig()
{
	// TODO: 在此添加命令处理程序代码
	CMFCTest10Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CModalDlg dlg;
	if (dlg.DoModal() == IDCANCEL)
	{
		return;
	}
	pDoc->DeleteContents();//删除文档内容
	pDoc->m_ulong = dlg.m_ulong;
	pDoc->m_ushort = dlg.m_ushort;
	pDoc->m_uthick = dlg.m_uthick;
}
cpp 复制代码
void CMFCTest10View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CMFCTest10Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: Add your message handler code here and/or call default
	CDC* pDc = GetDC();	
	CPen* pNewPen = new CPen;//创建画笔C++对象	
	pNewPen->CreatePen(PS_SOLID, pDoc->m_uthick, pDoc->m_color);//创建画笔	
	CPen* pOldPen = pDc->SelectObject(pNewPen);//选中当前画笔,并保存以前的画笔	
	pDc->Ellipse(point.x, point.y, point.x + pDoc->m_ulong, point.y + pDoc->m_ushort);//画圆	
	pDc->SelectObject(pOldPen);//恢复旧画笔	
	delete pNewPen;//删除新建的画笔对象
	ReleaseDC(pDc);
	pDoc->m_PointList.AddTail(point);

	CView::OnLButtonDown(nFlags, point);
}
cpp 复制代码
void CMFCTest10View::OnDraw(CDC* pDC)
{
	CMFCTest10Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码	
	CPen* pNewPen = new CPen;//创建画笔C++对象	
	pNewPen->CreatePen(PS_SOLID, pDoc->m_uthick, pDoc->m_color);//创建画笔	
	CPen* pOldPen = pDC->SelectObject(pNewPen);//选中当前画笔,并保存以前的画笔
	POSITION posi = pDoc->m_PointList.GetHeadPosition();
	while (posi)
	{
		CPoint point(pDoc->m_PointList.GetNext(posi));
		pDC->Ellipse(point.x, point.y, point.x + pDoc->m_ulong, point.y + pDoc->m_ushort);
	}	
	pDC->SelectObject(pOldPen);//恢复旧画笔	
	delete pNewPen;//删除新建的画笔对象
}
相关推荐
CoderCodingNo1 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
hetao17338373 小时前
2026-04-09~12 hetao1733837 的刷题记录
c++·算法
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 136. 只出现一次的数字 | C++ 哈希表&异或基础解法
c++·算法·leetcode
汉克老师3 小时前
GESP2024年6月认证C++三级( 第二部分判断题(1-10))
c++·数组·位运算·补码·gesp三级·gesp3级
无限进步_4 小时前
【C++】只出现一次的数字 II:位运算的三种解法深度解析
数据结构·c++·ide·windows·git·算法·leetcode
小贾要学习4 小时前
【Linux】TCP网络通信编程
linux·服务器·网络·c++·网络协议·tcp/ip
哎嗨人生公众号5 小时前
手写求导公式,让轨迹优化性能飞升,150ms变成9ms
开发语言·c++·算法·机器人·自动驾驶
code_whiter5 小时前
C++6(模板)
开发语言·c++
一只旭宝5 小时前
【C++ 入门精讲1】初始化、const、引用、内联函数 | 超详细手写笔记(附完整代码)
开发语言·c++
旖-旎6 小时前
哈希表(字母异位次分组)(5)
数据结构·c++·算法·leetcode·哈希算法·散列表