📄 drawgdix.h
字号:
void Select(CFont * pFont)
{
ASSERT(pFont);
ASSERT(pFont != &m_NewFont);
CFont * pOld = m_pDC->SelectObject(pFont); ASSERT(pOld);
if (!m_pOldFont) m_pOldFont = pOld;
m_NewFont.DeleteObject();
}
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)
{
if (m_pOldFont) Select(m_pOldFont);
VERIFY(m_NewFont.MyCreateFont(m_pDC, size, face, bold, italic,
underlined, fixed, hiquality, angleindegrees));
VERIFY(m_pOldFont = m_pDC->SelectObject(&m_NewFont));
}
void Select(const LOGFONT* lpLogFont)
{
if (m_pOldFont) Select(m_pOldFont);
VERIFY(m_NewFont.CreateFontIndirect(lpLogFont));
VERIFY(m_pOldFont = m_pDC->SelectObject(&m_NewFont));
}
void Restore()
{
if (m_pOldFont) VERIFY(m_pDC->SelectObject(m_pOldFont));
m_pOldFont = NULL;
m_NewFont.DeleteObject();
}
CFont * Old() const { return m_pOldFont; }
};
//******************************************************************
// Bitmaps
//******************************************************************
class CSelBitmap : public CSelect
{
CBitmap m_NewBmp;
CBitmap * m_pOldBmp;
public:
CSelBitmap(CDC * pDC)
: CSelect(pDC), m_pOldBmp(NULL) {}
CSelBitmap(CDC * SelectInDC, CDC * pCompatibleToDC, int w, int h)
: CSelect(SelectInDC), m_pOldBmp(NULL)
{ Select(pCompatibleToDC, w, h); }
CSelBitmap(CDC * pDC, CBitmap * pBitmap)
: CSelect(pDC), m_pOldBmp(NULL)
{ Select(pBitmap); }
~CSelBitmap() { Restore(); }
void Select(CBitmap * pBitmap)
{
ASSERT(pBitmap);
ASSERT(pBitmap != &m_NewBmp);
CBitmap * pOld = m_pDC->SelectObject(pBitmap); ASSERT(pOld);
if (!m_pOldBmp) m_pOldBmp = pOld;
m_NewBmp.DeleteObject();
}
void Select(CDC * pCompatibleToDC, int w, int h)
{
ASSERT(pCompatibleToDC);
if (m_pOldBmp) Select(m_pOldBmp);
VERIFY(m_NewBmp.CreateCompatibleBitmap(pCompatibleToDC, w, h));
VERIFY(m_pOldBmp = m_pDC->SelectObject(&m_NewBmp));
}
void Restore()
{
if (m_pOldBmp) VERIFY(m_pDC->SelectObject(m_pOldBmp));
m_pOldBmp = NULL;
m_NewBmp.DeleteObject();
}
CBitmap * Old() const { return m_pOldBmp; }
};
// This class is a bit different
class CSelPalette : public CSelect
{
// You need your own palette, use CPalette
CPalette * m_pOldPalette;
BOOL m_fForceBackground;
BOOL m_fRealizePalette;
public:
CSelPalette(CDC * pDC)
: CSelect(pDC), m_pOldPalette(NULL) {}
CSelPalette(CDC * pDC, CPalette * pPalette,
BOOL fForceBackground = FALSE, BOOL fRealize = TRUE)
: CSelect(pDC), m_pOldPalette(NULL)
{ Select(pPalette, fForceBackground, fRealize); }
~CSelPalette() { Restore(); }
UINT Select(CPalette * pPalette,
BOOL fForceBackground = FALSE, BOOL fRealize = TRUE)
{
ASSERT(pPalette);
ASSERT(m_pDC->GetDeviceCaps(RASTERCAPS)&RC_PALETTE);
CPalette * pOld=m_pDC->SelectPalette(pPalette, fForceBackground);
ASSERT(pOld);
if (!m_pOldPalette) m_pOldPalette=pOld;
m_fForceBackground = fForceBackground;
m_fRealizePalette = fRealize;
return fRealize ? m_pDC->RealizePalette() : 0;
}
void ChangeRestoreFlags(BOOL fForceBackground, BOOL fRealize)
{
m_fForceBackground = fForceBackground;
m_fRealizePalette = fRealize;
}
void Restore()
{
if (!m_pOldPalette)
return;
VERIFY(m_pDC->SelectPalette(m_pOldPalette, m_fForceBackground));
if (m_fRealizePalette)
m_pDC->RealizePalette();
m_pOldPalette = NULL;
}
CPalette * Old() const { return m_pOldPalette; }
};
//******************************************************************
// Set and restore other characteristics of the DC (no GDI objects)
//******************************************************************
class CSelROP2 : public CSelect
{
int m_OldRop;
public:
CSelROP2(CDC * pDC)
: CSelect(pDC), m_OldRop(0)
{ /*VERIFY(m_OldRop=m_pDC->GetROP2());*/ }
CSelROP2(CDC * pDC, int drawMode)
: CSelect(pDC), m_OldRop(0)
{ Select(drawMode); }
~CSelROP2() { Restore(); }
void Select(int drawmode)
{
int old = m_pDC->SetROP2(drawmode); ASSERT(old);
if (!m_OldRop) m_OldRop = old;
}
void Restore()
{
if (m_OldRop) VERIFY(m_pDC->SetROP2(m_OldRop));
m_OldRop = 0;
}
int Old() const { return m_OldRop; }
};
class CSelBkMode : public CSelect
{
int m_OldBkMode;
public:
CSelBkMode(CDC * pDC)
: CSelect(pDC), m_OldBkMode(0)
{ /*VERIFY(m_OldBkMode = m_pDC->GetBkMode());*/ }
CSelBkMode(CDC * pDC, int BkMode)
: CSelect(pDC), m_OldBkMode(0)
{ Select(BkMode); }
~CSelBkMode() { Restore(); }
void Select(int BkMode)
{
int old = m_pDC->SetBkMode(BkMode); ASSERT(old);
if (!m_OldBkMode) m_OldBkMode = old;
}
void Restore()
{
if (m_OldBkMode) VERIFY(m_pDC->SetBkMode(m_OldBkMode));
m_OldBkMode = 0;
}
int Old() const { return m_OldBkMode; }
};
class CSelBkColor : public CSelect
{
COLORREF m_OldBkColor;
public:
CSelBkColor(CDC * pDC)
: CSelect(pDC), m_OldBkColor(CLR_INVALID)
{ m_OldBkColor = m_pDC->GetBkColor(); }
CSelBkColor(CDC * pDC, COLORREF BkColor)
:CSelect(pDC), m_OldBkColor(CLR_INVALID)
{ Select(BkColor); }
~CSelBkColor() { Restore(); }
void Select(COLORREF color)
{
ASSERT(color != CLR_INVALID);
int old = m_pDC->SetBkColor(color); ASSERT(old != CLR_INVALID);
if (m_OldBkColor == CLR_INVALID) m_OldBkColor = old;
}
void Restore()
{
if(m_OldBkColor == CLR_INVALID) return;
VERIFY(m_pDC->SetBkColor(m_OldBkColor) != CLR_INVALID);
m_OldBkColor = CLR_INVALID;
}
COLORREF Old() const { return m_OldBkColor; }
};
class CSelTextColor : public CSelect
{
COLORREF m_OldTextColor;
public:
CSelTextColor(CDC * pDC)
: CSelect(pDC), m_OldTextColor(CLR_INVALID)
{ m_OldTextColor = m_pDC->GetTextColor(); }
CSelTextColor(CDC * pDC, COLORREF TextColor)
:CSelect(pDC), m_OldTextColor(CLR_INVALID)
{ Select(TextColor); }
~CSelTextColor() { Restore(); }
void Select(COLORREF color)
{
ASSERT(color != CLR_INVALID);
int old = m_pDC->SetTextColor(color); ASSERT(old != CLR_INVALID);
if (m_OldTextColor == CLR_INVALID) m_OldTextColor = old;
}
void Restore()
{
if(m_OldTextColor == CLR_INVALID) return;
VERIFY(m_pDC->SetTextColor(m_OldTextColor) != CLR_INVALID);
m_OldTextColor = CLR_INVALID;
}
COLORREF Old() const { return m_OldTextColor; }
};
class CSelTextAlign : public CSelect
{
UINT m_OldTextAlign;
public:
CSelTextAlign(CDC * pDC)
: CSelect(pDC), m_OldTextAlign(GDI_ERROR)
{ m_OldTextAlign = m_pDC->GetTextAlign(); }
CSelTextAlign(CDC * pDC, UINT TextAlign)
: CSelect(pDC), m_OldTextAlign(GDI_ERROR)
{ Select(TextAlign); }
~CSelTextAlign() { Restore(); }
void Select(UINT align)
{
ASSERT(align != GDI_ERROR);
int old = m_pDC->SetTextAlign(align); ASSERT(old != GDI_ERROR);
if (m_OldTextAlign == GDI_ERROR) m_OldTextAlign = old;
}
void Restore()
{
if(m_OldTextAlign == GDI_ERROR) return;
VERIFY(m_pDC->SetTextAlign(m_OldTextAlign) != GDI_ERROR);
m_OldTextAlign = GDI_ERROR;
}
UINT Old() const { return m_OldTextAlign; }
};
class CSelMapMode : public CSelect
{
int m_OldMapMode;
public:
CSelMapMode(CDC * pDC)
: CSelect(pDC), m_OldMapMode(0)
{ /*VERIFY(m_OldMapMode = m_pDC->GetMapMode());*/ }
CSelMapMode(CDC * pDC, int MapMode)
: CSelect(pDC), m_OldMapMode(0)
{ Select(MapMode); }
~CSelMapMode() { Restore(); }
void Select(int MapMode)
{
int old = m_pDC->SetMapMode(MapMode); ASSERT(old);
if (!m_OldMapMode) m_OldMapMode = old;
}
void Restore()
{
if (m_OldMapMode) VERIFY(m_pDC->SetMapMode(m_OldMapMode));
m_OldMapMode = 0;
}
UINT Old() const { return m_OldMapMode; }
};
//******************************************************************
// Class for saving the complete state of the DC
//******************************************************************
class CSaveDC : public CSelect
{
int m_SavedDC;
public:
CSaveDC(CDC * pDC)
: CSelect(pDC)
{ VERIFY(m_SavedDC = m_pDC->SaveDC()); }
~CSaveDC() { Restore(); }
void Restore()
{
if (m_SavedDC) VERIFY(m_pDC->RestoreDC(m_SavedDC));
m_SavedDC = 0;
}
int Old() const { return m_SavedDC; }
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -