使用CDC的派生类进行绘图

本文介绍了MFC中使用GDI绘图函数的原理及CDC类的派生类CPaintDC、CClientDC、CWindowDC的具体作用。通过实例展示了如何使用这些派生类进行绘图操作,并确保资源的有效管理。

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

由前面可知,要使用Win32的GDI绘图函数进行图形的绘制,都需要HDC的句柄来实现。MFC把GDI的绘图函数和HDC的句柄封装进了CDC类中,并且以CDC类为父类派生出了三个子类:CPaintDC、CClientDC、CWindowDC,所以在以后绘图时除了前面讲的直接使用句柄绘图,还可以使用这三个派生类进行绘图操作。这三个派生类分别对应客户区绘图、临时客户区绘图、非客户区绘图。如下图:



在三个CDC的派生类中,只有构造函数和虚构函数,这样可以保证对象在进行构造和虚构时可以成对调用,避免内存泄漏。以CPaintDC()为例,其封装如下:

class CPaintDC::CDC
{
protected:
	HWND m_hWnd;
	PAINTSTRUCT m_ps;
public:
	CPaintDC(CWnd* pWnd)
	{
		// m_hDC继承自其父类CDC类中
		m_hDC = ::BeginPaint(m_hWnd = pWnd->m_hWnd,&m_ps);
	}
	virtual ~CPaintDC()
	{
		::EndPaint(m_hWnd,&m_ps);
	}
};

这样,我们在构造CPaintDC对象时调用 BeginPaint()函数,在对象析构时调用 EndPaint()函数,保证了内存申请和释放,不会泄漏。其它两个派生类也是同样的封装。

使用CPaintDC()等派生类进行绘图的步骤:

1、构造对象 CPaintDC dc(this);

2、绘图操作。

对象析构时自动调用EndPaint()函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米的修行之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值