📄 drawgdix.h
字号:
#ifndef DRAWGDIX_H
#define DRAWGDIX_H
#pragma once
/*******************************************************************
GDI Helper Classes, MFC Version, by G. Bavestrelli, Techint S.p.A.
Any feedback is welcome, you can contact me at:
giovanni.bavestrelli@pomini.it
class CSelStock
class CSelPen
class CSelBrush
class CSelFont
class CSelBitmap
class CSelPalette
class CSelROP2
class CSelBkMode
class CSelBkColor
class CSelTextColor
class CSelTextAlign
class CSelMapMode
class CSaveDC
class CSelStock
CSelStock(CDC * pDC, int index)
void Select(int index)
CGdiObject * Old()
class CSelPen
CSelPen(CDC * pDC, COLORREF col, int sty=PS_SOLID, int wid = 0)
CSelPen(CDC * pDC, CPen * pPen)
void Select(CPen * pPen)
void Select(COLORREF col, int sty=PS_SOLID, int wid = 0)
class CSelBrush
CSelBrush(CDC * pDC, CBrush * pBrush)
CSelBrush(CDC * pDC, COLORREF crColor)
CSelBrush(CDC * pDC, int index, COLORREF crColor) // Hatch brush
CSelBrush(CDC * pDC, CBitmap * pBitmap) // Pattern brush
CSelBrush(CDC * pDC, HGLOBAL hPackedDib, UINT usage) // DIB Pattern brush
void Select(CBrush * pBrush)
void Select(COLORREF col)
void Select(int index, COLORREF col) // Hatch brush
void Select(CBitmap * pBitmap) // Pattern brush
void Select(HGLOBAL hPackedDib, UINT usage) // DIB Pattern brush
class CSelFont
CSelFont(CDC * pDC, int size, LPCTSTR face = NULL, BOOL bold = 0,
BOOL italic = 0, BOOL underlined = 0, BOOL fixed = 0,
BOOL hiquality = 0, int angleindegrees = 0)
CSelFont(CDC * pDC, CFont * pFont)
CSelFont(CDC * pDC, const LOGFONT* lpLogFont)
void Select(int size, LPCTSTR face = NULL, BOOL bold = 0,
BOOL italic = 0, BOOL underlined = 0, BOOL fixed = 0,
BOOL hiquality = 0, int angleindegrees = 0)
void Select(CFont * pFont)
void Select(const LOGFONT* lpLogFont)
class CSelBitmap
CSelBitmap(CDC * pDC, CBitmap * pBitmap)
CSelBitmap(CDC * SelectInDC, CDC * pCompatibleToDC, int w, int h)
void Select(CBitmap * pBitmap)
void Select(CDC * pCompatibleToDC, int w, int h)
class CSelPalette
CSelPalette(CDC * pDC, CPalette * pPalette,
BOOL fForceBackground = FALSE, BOOL fRealize = TRUE)
UINT Select(CPalette * pPalette,
BOOL fForceBackground = FALSE, BOOL fRealize = TRUE)
void ChangeRestoreFlags(BOOL fForceBackground, BOOL fRealize)
class CSelROP2
CSelROP2(CDC * pDC, int drawMode)
void Select(int drawmode)
class CSelBkMode
CSelBkMode(CDC * pDC, int BkMode)
void Select(int bkmode)
class CSelBkColor
CSelBkColor(CDC * pDC, COLORREF BkColor)
void Select(COLORREF color)
class CSelTextColor
CSelTextColor(CDC * pDC, COLORREF TextColor)
void Select(COLORREF color)
class CSelTextAlign
CSelTextAlign(CDC * pDC, UINT TextAlign)
void Select(UINT align)
class CSelMapMode
CSelMapMode(CDC * pDC, int MapMode)
void Select(int mode)
class CSaveDC
CSaveDC(CDC * pDC) // saving the complete state of the DC
every class also have:
<Constructor>(CDC* pDC) // constructor w/o selection
void Restore() // restores original object and destroys new object if neccessary
<retval> Old() // returns original object
*******************************************************************/
//******************************************************************
// Base class, stores CDC *
//******************************************************************
class CSelect
{
protected:
CDC * const m_pDC;
CSelect(CDC * pDC):m_pDC(pDC) { ASSERT(m_pDC);}
virtual ~CSelect() {}
private:
// Disable copying
operator = (const CSelect & d);
CSelect(const CSelect &);
};
//******************************************************************
// Class for Stock Objects
//******************************************************************
class CSelStock : public CSelect
{
CGdiObject * m_pOldObj;
public:
CSelStock(CDC * pDC)
:CSelect(pDC), m_pOldObj(NULL) {}
CSelStock(CDC * pDC, int index)
:CSelect(pDC), m_pOldObj(NULL)
{ Select(index); }
~CSelStock() { Restore(); }
void Select(int index)
{
CGdiObject * pOld = m_pDC->SelectStockObject(index); ASSERT(pOld);
if (!m_pOldObj) m_pOldObj = pOld;
}
void Restore()
{
if (m_pOldObj) VERIFY(m_pDC->SelectObject(m_pOldObj));
m_pOldObj = NULL;
}
CGdiObject * Old() const { return m_pOldObj; }
};
//******************************************************************
// Pens
//******************************************************************
class CSelPen : public CSelect
{
CPen m_NewPen;
CPen * m_pOldPen;
public:
CSelPen(CDC * pDC)
:CSelect(pDC), m_pOldPen(NULL){}
CSelPen(CDC * pDC, COLORREF col, int sty = PS_SOLID, int wid = 0)
:CSelect(pDC), m_pOldPen(NULL)
{ Select(col, sty, wid); }
CSelPen(CDC * pDC, CPen * pPen)
:CSelect(pDC), m_pOldPen(NULL)
{ Select(pPen); }
~CSelPen() { Restore(); }
void Select(CPen * pPen)
{
ASSERT(pPen);
ASSERT(pPen != &m_NewPen);
CPen * pOld = m_pDC->SelectObject(pPen); ASSERT(pOld);
if (!m_pOldPen) m_pOldPen = pOld;
m_NewPen.DeleteObject();
}
void Select(COLORREF col, int sty = PS_SOLID, int wid = 0)
{
if (m_pOldPen) Select(m_pOldPen);
VERIFY(m_NewPen.CreatePen(sty, wid, col));
VERIFY(m_pOldPen = m_pDC->SelectObject(&m_NewPen));
}
void Restore()
{
if (m_pOldPen) VERIFY(m_pDC->SelectObject(m_pOldPen));
m_pOldPen = NULL;
m_NewPen.DeleteObject();
}
CPen * Old() const { return m_pOldPen; }
};
//******************************************************************
// Brushes
//******************************************************************
class CSelBrush : public CSelect
{
CBrush m_NewBrush;
CBrush * m_pOldBrush;
public:
CSelBrush(CDC * pDC)
:CSelect(pDC), m_pOldBrush(NULL) {}
// Solid brush
CSelBrush(CDC * pDC, COLORREF crColor)
:CSelect(pDC), m_pOldBrush(NULL)
{ Select(crColor); }
// Hatch brush
CSelBrush(CDC * pDC, int index, COLORREF crColor)
:CSelect(pDC), m_pOldBrush(NULL)
{ Select(index, crColor); }
// Pattern brush
CSelBrush(CDC * pDC, CBitmap * pBitmap)
:CSelect(pDC), m_pOldBrush(NULL)
{ Select(pBitmap); }
// DIB Pattern brush
CSelBrush(CDC * pDC, HGLOBAL hPackedDib, UINT usage)
:CSelect(pDC), m_pOldBrush(NULL)
{ Select(hPackedDib, usage); }
CSelBrush(CDC * pDC, CBrush * pBrush)
:CSelect(pDC), m_pOldBrush(NULL)
{ Select(pBrush); }
~CSelBrush() { Restore(); }
void Select(CBrush * pBrush)
{
ASSERT(pBrush);
ASSERT(pBrush != &m_NewBrush);
CBrush * pOld = m_pDC->SelectObject(pBrush); ASSERT(pOld);
if (!m_pOldBrush) m_pOldBrush=pOld;
m_NewBrush.DeleteObject();
}
// Solid brush
void Select(COLORREF col)
{
if (m_pOldBrush) Select(m_pOldBrush);
VERIFY(m_NewBrush.CreateSolidBrush(col));
VERIFY(m_pOldBrush = m_pDC->SelectObject(&m_NewBrush));
}
// Hatch brush
void Select(int index, COLORREF col)
{
if (m_pOldBrush) Select(m_pOldBrush);
VERIFY(m_NewBrush.CreateHatchBrush(index, col));
VERIFY(m_pOldBrush = m_pDC->SelectObject(&m_NewBrush));
}
// Pattern brush
void Select(CBitmap * pBitmap)
{
ASSERT(pBitmap);
if (m_pOldBrush) Select(m_pOldBrush);
VERIFY(m_NewBrush.CreatePatternBrush(pBitmap));
VERIFY(m_pOldBrush = m_pDC->SelectObject(&m_NewBrush));
}
// DIB Pattern brush
void Select(HGLOBAL hPackedDib, UINT usage)
{
if (m_pOldBrush) Select(m_pOldBrush);
VERIFY(m_NewBrush.CreateDIBPatternBrush(hPackedDib, usage));
VERIFY(m_pOldBrush=m_pDC->SelectObject(&m_NewBrush));
}
void Restore()
{
if (m_pOldBrush) VERIFY(m_pDC->SelectObject(m_pOldBrush));
m_pOldBrush = NULL;
m_NewBrush.DeleteObject();
}
CBrush * Old() const { return m_pOldBrush; }
};
//******************************************************************
// My own font with different constructor and creation function
//******************************************************************
class CMyFont : public CFont
{
public:
CMyFont(){}
CMyFont(CDC * pDC, int size, LPCTSTR face = NULL, BOOL bold = 0,
BOOL italic = 0, BOOL underlined = 0, BOOL fixed = 0,
BOOL hiquality = 0, int angleindegrees = 0)
{
VERIFY(MyCreateFont(pDC, size, face, bold, italic, underlined,
fixed, hiquality, angleindegrees));
}
BOOL MyCreateFont(CDC * pDC, int size, LPCTSTR face = NULL,
BOOL bold = 0, BOOL italic = 0, BOOL underlined = 0,
BOOL fixed = 0, BOOL hiquality = 0,
int angleindegrees = 0)
{
ASSERT(pDC);
CSize Size(0, MulDiv(size, pDC->GetDeviceCaps(LOGPIXELSY), 72));
pDC->DPtoLP(&Size);
return CreateFont(-abs(Size.cy), 0, 10*angleindegrees, 0,
bold ? FW_BOLD : FW_NORMAL, BYTE(italic),
BYTE(underlined), 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
BYTE(hiquality ? PROOF_QUALITY : DEFAULT_QUALITY),
BYTE(fixed ? FF_MODERN|FIXED_PITCH :
FF_SWISS|VARIABLE_PITCH),
face && *face ? face : NULL);
}
};
//******************************************************************
// Fonts
//******************************************************************
class CSelFont : public CSelect
{
CMyFont m_NewFont;
CFont * m_pOldFont;
public:
CSelFont(CDC * pDC)
: CSelect(pDC), m_pOldFont(NULL) {}
CSelFont(CDC * pDC, int size, LPCTSTR face = NULL, BOOL bold = 0,
BOOL italic = 0, BOOL underlined = 0, BOOL fixed = 0,
BOOL hiquality = 0, int angleindegrees = 0)
: CSelect(pDC), m_pOldFont(NULL)
{
Select(size, face, bold, italic, underlined,
fixed, hiquality, angleindegrees);
}
CSelFont(CDC * pDC, CFont * pFont)
: CSelect(pDC), m_pOldFont(NULL)
{ Select(pFont); }
CSelFont(CDC * pDC, const LOGFONT* lpLogFont)
: CSelect(pDC), m_pOldFont(NULL)
{ Select(lpLogFont); }
~CSelFont() { Restore(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -