一、目的
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;
};