【MFC计算机图形】CDC派生类

本文详细介绍了Windows编程中几种常用的设备上下文(DC)类:CClientDC、CWindowDC及CPaintDC的区别与用法,并深入探讨了CMetaFileDC类如何创建与播放图元文件。通过具体实例展示了不同DC类的绘图区域与使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CClientDC 显示设备上下文

CClientDC dc(this);
	dc.MoveTo(0, 0);
	dc.LineTo(800, 800);

CWindowDC类显示上下文

CWindowDC dc(this);
	dc.MoveTo(0, 0);
	dc.LineTo(800, 800);
  • 这时的两类的显示无区别
CWindowDC dc(GetParent());
```
+ 获取父窗口指针,才能在父窗口绘图
+![getparent后绘图](https://img-blog.csdnimg.cn/85f3ddfb445744ecbb43616307449e92.png)
## CMetaFileDC类
+ 图元文件的上下文类(图元文件是计算机中的一种矢量图形 .wmf)
 + 1。创建函数
+  2。显示函数

````cpp

Create();
	Play();

void CMFCApplicationMXYView::Create(void) {
	CMetaFileDC mDC;
	//创建图元的输出文件
	mDC.Create(CString("Pane.wmf"));
	//开始绘制图形
	CRect rect;
	//获取用户区大小
	GetClientRect(&rect);
	//设置文本颜色和笔颜色
	CPen NewPenRed(PS_SOLID, 3, RGB(128, 128, 0));
	CPen* pOldPen = mDC.SelectObject(&NewPenRed);
	//定义中心点坐标
	CPoint centerPoint(rect.right / 2, rect.bottom / 2);
	//定义外正方形的半边长(为了方便后续使用,定义半边长)
	int nHalfEdge = 150;
	//绘制正方形
	mDC.Rectangle(centerPoint.x - nHalfEdge, centerPoint.y - nHalfEdge, centerPoint.x + nHalfEdge, centerPoint.y + nHalfEdge);
	//定义各个连接点
	CPoint P0 = CPoint(centerPoint.x - nHalfEdge / 2, centerPoint.y);
	CPoint P1 = CPoint(centerPoint.x - nHalfEdge / 2, centerPoint.y - nHalfEdge / 2);
	//绘制图形
	mDC.MoveTo(centerPoint);
	mDC.LineTo(P0);
	mDC.LineTo(P1);
	//绘制完成后要恢复画笔
	mDC.SelectObject(pOldPen);
	NewPenRed.DeleteObject();
	//将绘制写入图元文件并关闭图元文件、释放图元文件的句柄
	HMETAFILE hmf = mDC.Close();
	DeleteMetaFile(hmf);


}

void CMFCApplicationMXYView::Play(void) {
	CDC* pDC = GetDC();
	//打开图元文件,返回图元文件句柄
	HMETAFILE hmf = GetMetaFile(_T("Pane.wmf"));
	//显示图元文件
	pDC->PlayMetaFile(hmf);
	DeleteMetaFile(hmf);
	//释放设备上下文指针
	ReleaseDC(pDC);
}

绘制出的图形

CPaintDC类

  • 相应WM_PAINT消息的设备上下文类
  • CPaintDC对象只能在OnPaint()函数中使用

项目、类向导
类向导

编辑OnPaint()
在OnDraw()中画一个椭圆、然后在OnPaint()中画一条直线,发现只显示直线,说明OnPaint()相应了WM_Paint消息后,OnDraw()被自动屏蔽了。

总结

CClientDC类CWindowDC类
绘图区间窗口客户区整个窗口
对象定义CClientDC dc(this)CWindowDC dc(GetParent())

CPaintDC类

  • 使用CPaint定义对象绘制图形,需要在项目类向导中添加WM_PAINT消息的映射函数OnPaint。
  • OnPaint()相应WM_PAINT消息后,OnDraw()被自动屏蔽了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值