Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//-------------------------------------------------------------------------
// Autos.h - resource holder classes that automatically return their resource
// resources in the destructors. These can be declared on the stack
// to free resources whenever the enclosing block is exited or
// as class member variables that free the associated resources
// when the containing object is destroyed.
//-------------------------------------------------------------------------
#ifndef _AUTOS_H_
#define _AUTOS_H_
//-------------------------------------------------------------------------
#include "errors.h"
#include "utils.h"
//-------------------------------------------------------------------------
class COptionalDC { public: COptionalDC(HDC hdcOpt) { _hdc = hdcOpt; _fReleaseDC = FALSE;
if (! _hdc) { _hdc = GetWindowDC(NULL); if (_hdc) { _fReleaseDC = TRUE; } } }
operator HDC() { return _hdc; }
~COptionalDC() { if (_fReleaseDC) { ReleaseDC(NULL, _hdc); } }
private: HDC _hdc; BOOL _fReleaseDC; }; //-------------------------------------------------------------------------
template <class T> class CAutoGDI { public: CAutoGDI(T Value=NULL) { _Handle = Value; }
~CAutoGDI() { if (_Handle) DeleteObject(_Handle); }
T & operator = (T Value) { if (_Handle) DeleteObject(_Handle);
_Handle = Value;
return _Handle; }
operator T() const { return _Handle; }
protected: T _Handle; }; //------------------------------------------------------------------------------------
class CAutoDC { public: CAutoDC(HDC Value=NULL) { _hdc = Value;
_fOldPen = FALSE; _fOldBrush = FALSE; _fOldBitmap = FALSE; _fOldFont = FALSE; _fOldRegion = FALSE; }
~CAutoDC() { RestoreObjects(); }
HDC & operator = (HDC &Value) { if (_hdc) RestoreObjects();
_hdc = Value;
return _hdc; }
operator HDC() const { return _hdc; }
void RestoreObjects() { if (_fOldBitmap) { SelectObject(_hdc, _hOldBitmap); _fOldBitmap = FALSE; }
if (_fOldFont) { SelectObject(_hdc, _hOldFont); _fOldFont = FALSE; }
if (_fOldPen) { SelectObject(_hdc, _hOldPen); _fOldPen = FALSE; }
if (_fOldBrush) { SelectObject(_hdc, _hOldBrush); _fOldBrush = FALSE; }
if (_fOldRegion) { SelectObject(_hdc, _hOldRegion); _fOldRegion = FALSE; } }
inline HBITMAP SelectBitmap(HBITMAP hValue) { if (! _fOldBitmap) { _fOldBitmap = TRUE; _hOldBitmap = (HBITMAP)SelectObject(_hdc, hValue); return _hOldBitmap; } return (HBITMAP)SelectObject(_hdc, hValue); }
inline HFONT SelectFont(HFONT hValue) { if (! _fOldFont) { _fOldFont = TRUE; _hOldFont = (HFONT)SelectObject(_hdc, hValue); return _hOldFont; } return (HFONT)SelectObject(_hdc, hValue); }
inline HBRUSH SelectBrush(HBRUSH hValue) { if (! _fOldBrush) { _fOldBrush = TRUE; _hOldBrush = (HBRUSH)SelectObject(_hdc, hValue); return _hOldBrush; }
return (HBRUSH) SelectObject(_hdc, hValue); }
inline HPEN SelectPen(HPEN hValue) { if (! _fOldPen) { _fOldPen = TRUE; _hOldPen = (HPEN)SelectObject(_hdc, hValue); return _hOldPen; } return (HPEN)SelectObject(_hdc, hValue); }
inline HRGN SelectRegion(HRGN hValue) { if (! _fOldRegion) { _fOldRegion = TRUE; _hOldRegion = (HRGN)SelectObject(_hdc, hValue); return _hOldRegion; } return (HRGN)SelectObject(_hdc, hValue); }
protected: HDC _hdc;
BOOL _fOldBitmap; BOOL _fOldFont; BOOL _fOldBrush; BOOL _fOldPen; BOOL _fOldRegion;
HBITMAP _hOldBitmap; HFONT _hOldFont; HBRUSH _hOldBrush; HPEN _hOldPen; HRGN _hOldRegion; }; //------------------------------------------------------------------------------------
class CAutoCS { public: CAutoCS(CRITICAL_SECTION *pcs) { _pcs = pcs; SAFE_ENTERCRITICALSECTION(_pcs); }
~CAutoCS() { SAFE_LEAVECRITICALSECTION(_pcs); }
protected: CRITICAL_SECTION *_pcs; }; //------------------------------------------------------------------------------------
class CSaveClipRegion { public: CSaveClipRegion() { _hRegion = NULL; _fSaved = FALSE; }
HRESULT Save(HDC hdc) { HRESULT hr; int iRetVal;
if (! _hRegion) { _hRegion = CreateRectRgn(0, 0, 1, 1); if (! _hRegion) { hr = MakeErrorLast(); goto exit; } }
iRetVal = GetClipRgn(hdc, _hRegion); if (iRetVal == -1) { hr = MakeErrorLast(); goto exit; }
if (iRetVal == 0) // no previous region
{ DeleteObject(_hRegion); _hRegion = NULL; }
_fSaved = TRUE; hr = S_OK;
exit: return hr;
}
HRESULT Restore(HDC hdc) { if (_fSaved) { //---- works for both NULL and valid _hRegion ----
SelectClipRgn(hdc, _hRegion); }
return S_OK; }
~CSaveClipRegion() { if (_hRegion) { DeleteObject(_hRegion); _hRegion = NULL; } }
protected: HRGN _hRegion; BOOL _fSaved; }; //------------------------------------------------------------------------------------
template <class T> class CAutoArrayPtr { public: CAutoArrayPtr(T *pValue=NULL) { _pMem = pValue; }
~CAutoArrayPtr() { if (_pMem) delete [] _pMem; }
T * operator = (T *pValue) { if (_pMem) delete [] _pMem;
_pMem = pValue; return _pMem; }
T & operator [] (int iIndex) const { return _pMem[iIndex]; }
operator T*() const { return _pMem; }
bool operator!() const { return (_pMem == NULL); }
T** operator&() { return &_pMem; }
protected: T *_pMem; }; //------------------------------------------------------------------------------------
#endif // _AUTOS_H_
//------------------------------------------------------------------------------------
|