WindowsXP-SP1/windows/advcore/ctf/inc/cmydc.h
2020-09-30 16:53:49 +02:00

313 lines
6.0 KiB
C++

//
// cmydc.h
//
#ifndef CMYDC_H
#define CMYDC_H
class CSolidBrush
{
public:
CSolidBrush(int r, int g, int b)
{
_hbr = CreateSolidBrush(RGB(r, g, b));
}
CSolidBrush(COLORREF rgb)
{
_hbr = CreateSolidBrush(rgb);
}
CSolidBrush()
{
_hbr = NULL;
}
BOOL Init(int r, int g, int b)
{
Assert(!_hbr);
_hbr = CreateSolidBrush(RGB(r, g, b));
return _hbr != NULL;
}
BOOL Init(COLORREF rgb)
{
Assert(!_hbr);
_hbr = CreateSolidBrush(rgb);
return _hbr != NULL;
}
~CSolidBrush()
{
if (_hbr)
DeleteObject(_hbr);
}
operator HBRUSH()
{
return _hbr;
}
private:
HBRUSH _hbr;
};
class CSolidPen
{
public:
CSolidPen()
{
_hpen = NULL;
}
BOOL Init(int r, int g, int b)
{
Assert(!_hpen);
_hpen = CreatePen(PS_SOLID, 0, RGB(r, g, b));
return _hpen != NULL;
}
BOOL Init(COLORREF rgb)
{
Assert(!_hpen);
_hpen = CreatePen(PS_SOLID, 0, rgb);
return _hpen != NULL;
}
~CSolidPen()
{
if (_hpen)
DeleteObject(_hpen);
}
operator HPEN()
{
return _hpen;
}
private:
HPEN _hpen;
};
class CPatternBrush
{
public:
CPatternBrush(HBITMAP hbmp)
{
_hbr = CreatePatternBrush(hbmp);
}
~CPatternBrush()
{
if (_hbr)
DeleteObject(_hbr);
}
operator HBRUSH()
{
return _hbr;
}
private:
HBRUSH _hbr;
};
class CBitmapDC
{
public:
CBitmapDC(BOOL fCompat = FALSE)
{
_hbmp = NULL;
_hbmpOld = NULL;
_hbrOld = NULL;
if (!fCompat)
_hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
else
{
_hdc = CreateCompatibleDC(NULL);
}
Assert(HandleToULong(_hdc));
}
~CBitmapDC()
{
Uninit();
DeleteDC(_hdc);
}
void Uninit(BOOL fKeep = FALSE)
{
if (_hbmpOld)
{
SelectObject(_hdc, _hbmpOld);
_hbmpOld = NULL;
}
if (_hbrOld)
{
SelectObject(_hdc, _hbrOld);
_hbrOld = NULL;
}
if (!fKeep && _hbmp != NULL)
{
DeleteObject(_hbmp);
_hbmp = NULL;
}
}
BOOL SetCompatibleBitmap(int x, int y)
{
Assert(!_hbmp);
Assert(!_hbmpOld);
HDC hdc = GetDC(NULL);
_hbmp = CreateCompatibleBitmap(hdc, x, y);
ReleaseDC(NULL, hdc);
Assert(HandleToULong(_hbmp));
_hbmpOld = (HBITMAP)SelectObject(_hdc, _hbmp);
Assert(HandleToULong(_hbmpOld));
return TRUE;
}
BOOL SetDIB(int cx, int cy, WORD iPlanes = 1, WORD iBitCount = 32)
{
BITMAPINFO bi = {0};
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = cx;
bi.bmiHeader.biHeight = cy;
bi.bmiHeader.biPlanes = iPlanes;
bi.bmiHeader.biBitCount = iBitCount;
bi.bmiHeader.biCompression = BI_RGB;
_hbmp = CreateDIBSection(_hdc, &bi, DIB_RGB_COLORS, NULL, NULL, 0);
Assert(HandleToULong(_hbmp));
_hbmpOld = (HBITMAP)SelectObject(_hdc, _hbmp);
Assert(HandleToULong(_hbmpOld));
return TRUE;
}
BOOL SetBitmap(int x, int y, int cPlanes, int cBitPerPixel)
{
Assert(!_hbmp);
Assert(!_hbmpOld);
_hbmp = CreateBitmap(x, y, cPlanes, cBitPerPixel, NULL);
Assert(HandleToULong(_hbmp));
_hbmpOld = (HBITMAP)SelectObject(_hdc, _hbmp);
Assert(HandleToULong(_hbmpOld));
return TRUE;
}
BOOL SetBitmap(HBITMAP hbmp)
{
if (_hdc)
{
Assert(!_hbmpOld);
_hbmpOld = (HBITMAP)SelectObject(_hdc, hbmp);
Assert(HandleToULong(_hbmpOld));
}
return TRUE;
}
BOOL SetBitmapFromRes(HINSTANCE hInst, LPCSTR lp)
{
Assert(!_hbmp);
Assert(!_hbmpOld);
_hbmp = LoadBitmap(hInst, lp);
Assert(HandleToULong(_hbmp));
_hbmpOld = (HBITMAP)SelectObject(_hdc, _hbmp);
Assert(HandleToULong(_hbmpOld));
return TRUE;
}
BOOL SetBrush(HBRUSH hbr)
{
if (hbr)
{
_hbrOld = (HBRUSH)SelectObject(_hdc, hbr);
Assert(HandleToULong(_hbrOld));
}
else
{
SelectObject(_hdc, _hbrOld);
_hbrOld = NULL;
}
return TRUE;
}
operator HDC()
{
return _hdc;
}
HBITMAP GetBitmapAndKeep()
{
HBITMAP hbmp = _hbmp;
// don't delet _hbmp;
_hbmp = NULL;
return hbmp;
}
HBITMAP GetBitmap()
{
return _hbmp;
}
private:
HBITMAP _hbmp;
HBITMAP _hbmpOld;
HBRUSH _hbrOld;
HDC _hdc;
};
__inline HBITMAP StretchBitmap(HBITMAP hbmp, int cx, int cy)
{
BITMAP bmp;
CBitmapDC hdcSrc(TRUE);
CBitmapDC hdcDst(TRUE);
GetObject( hbmp, sizeof(bmp), &bmp );
hdcSrc.SetBitmap(hbmp);
hdcDst.SetCompatibleBitmap(cx, cy);
StretchBlt(hdcDst, 0, 0, cx, cy,
hdcSrc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
return hdcDst.GetBitmapAndKeep();
}
_inline UINT GetPhysicalFontHeight(LOGFONT &lf)
{
HDC hdc = GetDC(NULL);
HFONT hfont;
UINT nRet = 0;
if((hfont = CreateFontIndirect(&lf)))
{
TEXTMETRIC tm;
HFONT hfontOld;
hfontOld = (HFONT)SelectObject( hdc, hfont);
GetTextMetrics(hdc, &tm);
nRet = tm.tmHeight + tm.tmExternalLeading;
if (hfontOld)
SelectObject(hdc, hfontOld);
DeleteObject(hfont);
}
ReleaseDC(NULL, hdc);
return nRet;
}
#endif // CMYDC_H