自动释放的GDI类

本文介绍了一组用于自动管理和释放Windows GDI资源的C++类,包括自动获取和释放窗口DC、创建兼容DC及位图等。这些类通过在析构函数中释放资源来简化编程流程,提高代码安全性。

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

一、目的

win32控制台或后台程序有时需要用到一些GDI对象,为避免手动释放的麻烦或的遗漏,封装一些类,在析构函数里面释放资源。

二、源码

#pragma once
/*************************************************  
Copyright:  mlizhi.com  
Author:     Juncheng Lin 
Date:       2017-01-01  
Description:自动释放GDI资源类的集合  
**************************************************/    

#include <Windows.h>

/**
	功能:	自动获取和释放窗口DC类
	类名:	CAutoWndDC
*/
class CAutoWndDC
{
public:
	/**
		功能:	构造函数
		参数:
				@hWnd	要获取画图上下文的窗口句柄
	*/
	CAutoWndDC(HWND hWnd)
		: m_hWnd(hWnd)
	{
		m_hDC = GetDC(hWnd);
	}

	//获取画图句柄
	HDC GetHandle() const
	{
		return m_hDC;
	}

	~CAutoWndDC()
	{
		if(m_hDC)
		{
			ReleaseDC(m_hWnd, m_hDC);
		}
	}
protected:
	HDC m_hDC;
	HWND m_hWnd;
};

/**
	功能:	自动创建兼容DC和释放的类
	类名:	CAutoCompatibleDC
*/
class CAutoCompatibleDC
{
public:
	/**
		功能:	构造函数
		参数:
				@hDC	源画图上下文
	*/
	CAutoCompatibleDC(HDC hDC)
		: m_hDC(CreateCompatibleDC(hDC))
	{
	}

	//获取画图句柄
	HDC GetHandle() const
	{
		return m_hDC;
	}

	~CAutoCompatibleDC()
	{
		if (m_hDC != NULL)
		{
			DeleteDC(m_hDC);
			m_hDC = NULL;
		}
	}
protected:
	HDC m_hDC;
};

/**
	功能:	自动创建兼容位图和释放的类
	类名:	CAutoCompatibleBitmap
*/
class CAutoCompatibleBitmap
{
public:
	/**
		功能:	构造函数
		参数:
				@hDC	源画图上下文
				@nWidth	位图的宽
				@nHeight	位图的高
	*/
	CAutoCompatibleBitmap(HDC hDC, int nWidth, int nHeight)
		: m_hBitmap(CreateCompatibleBitmap(hDC, nWidth, nHeight))
	{

	}

	//获取位图句柄
	HBITMAP GetHandle() const
	{
		return m_hBitmap;
	}

	~CAutoCompatibleBitmap()
	{
		if(m_hBitmap)
		{
			DeleteObject(m_hBitmap);
			m_hBitmap = NULL;
		}
	}
protected:
	HBITMAP m_hBitmap;
};

/**
	功能:	自动选择GDI对象的类
	类名:	CAutoDCSelBitmap
*/
class CAutoDCSelBitmap
{
public:
	/**
		功能:	构造函数
		参数:
				@hDC	源画图上下文
				@hBitmap	被选择的GDI对象
	*/
	CAutoDCSelBitmap(HDC hDC, HGDIOBJ hBitmap)
		: m_hOld(SelectObject(hDC, hBitmap)), m_hDC(hDC)
	{
	}
	~CAutoDCSelBitmap()
	{
		SelectObject(m_hDC, m_hOld);
	}
protected:
	HDC				m_hDC;
	HGDIOBJ			m_hOld;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值